Advertisement
claukiller

Untitled

Apr 21st, 2017
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.09 KB | None | 0 0
  1. address
  2. package codeGenerator;
  3.  
  4. import ast.expression.FieldAccess;
  5. import ast.expression.Indexing;
  6. import ast.expression.Variable;
  7. import visitor.AbstractVisitor;
  8. import ast.definition.VarDefinition;
  9. import ast.type.RecordType;
  10.  
  11. public class AddressVisitor extends AbstractVisitor {
  12.  
  13. @Override
  14. public Object visit(Variable v, Object o) {
  15. //Global variable
  16. if(v.getVardef().getScope()==0) {
  17. cg.push("a", ((VarDefinition)v.getVardef()).getOffset());
  18. }
  19.  
  20. //Local variable
  21. else {
  22. cg.pushabp();
  23. cg.push("i", ((VarDefinition)v.getVardef()).getOffset());
  24. cg.add("i");
  25. }
  26. return null;
  27. }
  28.  
  29. @Override
  30. public Object visit(FieldAccess fa, Object o) {
  31. fa.getObject().accept(Visitors.addressVisitor, null);
  32. cg.push("i", ((RecordType)fa.getObject().getType()).getField(fa.getFieldName()).getOffset());
  33. cg.add("i");
  34. return null;
  35. }
  36.  
  37. @Override
  38. public Object visit (Indexing indexing, Object p) {
  39. indexing.getArray().accept(Visitors.addressVisitor, null);
  40. indexing.getIndex().accept(Visitors.valueVisitor, null);
  41. //convert
  42. cg.push("i", indexing.getType().numberOfBytes());
  43. cg.mul("i");
  44. cg.add("i");
  45.  
  46. return null;
  47. }
  48.  
  49. }
  50. --------------------------------------------------------------------------------------------------------------------------
  51. execute
  52.  
  53. public ExecuteVisitor (String input, String output) {
  54. this.input = input;
  55. cg.createFile(output);
  56. }
  57.  
  58. @Override
  59. public Object visit(WhileStmt wh, Object o) {
  60. int labels = cg.getLabels(2);
  61. cg.label(labels);
  62. wh.getCondition().accept(Visitors.valueVisitor, null);
  63. cg.jz(labels+1);
  64.  
  65. //while
  66. for(Statement s : wh.getWhileBody())
  67. s.accept(Visitors.executeVisitor, null);
  68.  
  69. cg.jmp(labels);
  70. cg.label(labels+1);
  71. return null;
  72. }
  73.  
  74. @Override
  75. public Object visit (IfStatement ifstmt, Object p) {
  76. int labels = cg.getLabels(2);
  77. ifstmt.getCondition().accept(Visitors.valueVisitor, null);
  78. //convert
  79. cg.jz(labels);
  80.  
  81. //if
  82. for(Statement stmt : ifstmt.getIfBody())
  83. stmt.accept(Visitors.executeVisitor, null);
  84.  
  85. cg.jmp(labels+1);
  86. cg.label(labels);
  87.  
  88. //else
  89. for(Statement stmt : ifstmt.getElseBody())
  90. stmt.accept(Visitors.executeVisitor, null);
  91. cg.label(labels+1);
  92.  
  93. return null;
  94. }
  95.  
  96. ----------------------------------------------------------------------------
  97. @Override
  98. public Object visit (Indexing indexing, Object p) {
  99. indexing.accept(Visitors.addressVisitor, null);
  100. cg.load(indexing.getType().suffix());
  101. return null;
  102. }
  103.  
  104. @Override
  105. public Object visit(Cast cast, Object o) {
  106. cast.getExpression().accept(Visitors.valueVisitor, null);
  107. cg.convertTo(cast.getExpression().getType().suffix(), cast.getType().suffix());
  108. return null;
  109. }
  110.  
  111. //Built-in types
  112. @Override
  113. public Object visit(IntLiteral i, Object o) {
  114. cg.push("i", i.getValue());
  115. return null;
  116. }
  117.  
  118. @Override
  119. public Object visit(RealLiteral r, Object o) {
  120. cg.push("f", r.getValue());
  121. return null;
  122. }
  123.  
  124. @Override
  125. public Object visit(CharLiteral c, Object o) {
  126. cg.push("b", c.getValue());
  127. return null;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement