Вниз  Пишем компилятор
- 15.06.2016 / 01:38
vl@volk
  Пользователь

vl@volk 
Сейчас: Offline
cap51, ты нашел виртуальную машину, теперь напиши компилятор того же бейсика для нее. Только сам, как послушный мальчик!
__________________
 знает толк
- 15.06.2016 / 07:25
vl@volk
  Пользователь

vl@volk 
Сейчас: Offline
cap51, а зачем пробовать? Ты делай давай. Описание инструкций (комманд) виртуального зверя есть, ты давай разбирай файл на токены (лексемы), проверяй их порядок согласно семантике языка, упорядочивай так, как их будет разбирать вм и переводи в инструкции.
__________________
 знает толк
- 15.06.2016 / 08:42
aRiGaTo
  Пользователь

aRiGaTo 
Сейчас: Offline
Цитата vl@volk:
разбирай файл на токены (лексемы), проверяй их порядок согласно семантике языка
синтаксису*
__________________
 don't tread on me
- 16.06.2016 / 00:58
cap51
  Пользователь

cap51 
Сейчас: Offline
Вот такой код.
Файл "VM.java".
  1. public class VM{
  2. public VM(){}
  3.  
  4. public static int[][] mm={};
  5.  public static int[] m=mem(1);
  6. public static int count=0;
  7.  
  8. public static int[] n(){
  9. return new int[0];
  10. }
  11.  
  12. public static void setm(int i){
  13. m=mem(i);
  14. mm=new int[i][i];
  15. mm[i-1]=m;
  16. }
  17.  
  18. public static int[] getm(int i){
  19. return mm[i];
  20. }
  21.  
  22. public static int set(int x,int y,int z){
  23. mm[x][y]=z;
  24. return mm[x][y];
  25. }
  26.  
  27. public static int[] mem(int x){
  28. return new int[x];
  29. }
  30.  
  31. public static int[] push(int x){
  32. int[] stack=mem(m.length+1);
  33. stack[0]=x;
  34. int t=1;
  35. for(int i:m){
  36. stack[t]=i;
  37. t++;
  38. }
  39. m=stack;
  40. return stack;
  41. }
  42.  
  43. public static int pop(){
  44. int x=m[0];
  45. int[] stack=mem(m.length-1);
  46. int t=0;
  47. for(int i=0;i<stack.length-1;i++){
  48. stack[i]=m[i+1];
  49. t++;
  50. }
  51. stack[t]=m[m.length-1];
  52. m=stack;
  53. return x;
  54. }
  55.  
  56. public static String print(){
  57. String s="";
  58. for(int[] x:mm){
  59. s+="[";
  60. for(int i:x){
  61. s+=i+",";
  62. }
  63. s=s.substring(0,s.length()-1);
  64. s+="]\n";
  65. }
  66. System.out.print(s);
  67. return s;
  68. }
  69.  
  70. public static int[] range(int x){
  71. int[] t=new int[x];
  72. for(int i=0;i<x;i++){
  73. t[i]=i;
  74. }
  75. return t;
  76. }
  77.  
  78. }

И файл "Test.java".
  1. public class Test{
  2. public static void main(String[] args){
  3. VM vm=new VM();
  4. int i=19;
  5. vm.setm(i);
  6. for(int x:vm.range(i)){
  7. vm.set(x,i-x-1,1);
  8. for(int y:vm.range(x)){
  9. vm.set(x,x,1);
  10. }
  11. vm.set(x,x,1);
  12. }
  13. vm.print();
  14. }
  15. }

И вот, что он выдает:
  1. [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]
  2. [0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0]
  3. [0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0]
  4. [0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0]
  5. [0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0]
  6. [0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0]
  7. [0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0]
  8. [0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0]
  9. [0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0]
  10. [0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0]
  11. [0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0]
  12. [0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0]
  13. [0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0]
  14. [0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0]
  15. [0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0]
  16. [0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0]
  17. [0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0]
  18. [0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0]
  19. [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]

Во как!
- 16.06.2016 / 07:53
vl@volk
  Пользователь

vl@volk 
Сейчас: Offline
ты сделал? Почему то что должно леч на стек возвращается, а не убирается в стек машины?
__________________
 знает толк
- 16.06.2016 / 14:37
cap51
  Пользователь

cap51 
Сейчас: Offline
vl@volk, ага.
Наверное нужно создать несколько регистров ?
- 16.06.2016 / 14:51
cap51
  Пользователь

cap51 
Сейчас: Offline
vl@volk, а как это можно осуществить ?
Хотя-бы в двух словах...
- 16.06.2016 / 16:57
vl@volk
  Пользователь

vl@volk 
Сейчас: Offline
cap51, регистры быстро все заполнятся, лучше стек.
А что именно реализовать? Стек? Воспользуйся классом java.util.Stack и в методе push ложи в стек значение, которое ты возвращал в своем коде. с pop разберешься думаю сам.
Кстати, если у тебя написать в таком плане
  1. push
  2. setm
  3. pop
то pop вернет значение, которое ты ставил в setm
__________________
 знает толк

Изменено vl@volk (16.06 / 17:03) (всего 1 раз)
- 16.06.2016 / 17:06
aRiGaTo
  Пользователь

aRiGaTo 
Сейчас: Offline
Цитата vl@volk:
cap51, регистры быстро все заполнятся, лучше стек.
Нужно не тупо раскладывать значения во все регистры, а адекватно их распределять. Планировать инструкции, разбивать код на базовые блоки, анализировать время жизни переменных и т.д.
__________________
 don't tread on me
- 16.06.2016 / 18:50
vl@volk
  Пользователь

vl@volk 
Сейчас: Offline
cap51, инструкции push pop setm перекрывают друг друга. они используют массив m и замещают значения установленные предыдущей инструкцией.
__________________
 знает толк
Наверх  Всего сообщений: 33
Фильтровать сообщения
Поиск по теме