Advertisement
claukiller

Untitled

Mar 31st, 2017
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.73 KB | None | 0 0
  1. package codegeneration;
  2.  
  3. import ast.definition.FuncDefinition;
  4. import ast.definition.VarDefinition;
  5. import ast.statement.Statement;
  6. import ast.type.FunctionType;
  7. import ast.type.RecordField;
  8. import ast.type.RecordType;
  9. import visitor.TraversingVisitor;
  10.  
  11. public class OffsetVisitor extends TraversingVisitor {
  12.  
  13. private int globalBytes = 0, localBytes = 0;
  14.  
  15. //Parameters offset
  16. @Override
  17. public Object visit (FunctionType f, Object o) {
  18. localBytes = 0;
  19. super.visit(f, o);
  20.  
  21. for(int i = f.getParameters().size()-1; i >= 0 ; i--) {
  22. f.getParameters().get(i).setOffset(f.bytesParamsSum);
  23. f.bytesParamsSum += f.getParameters().get(i).getType().numberOfBytes();
  24. }
  25.  
  26. return null;
  27. }
  28.  
  29. //Record fields offset
  30. @Override
  31. public Object visit (RecordType rt, Object o) {
  32. super.visit(rt, o);
  33.  
  34. int fieldsBytes = 0;
  35. for(RecordField field : rt.getFields()) {
  36. field.setOffset(fieldsBytes);
  37. fieldsBytes+=field.getFieldType().numberOfBytes();
  38. }
  39.  
  40. return null;
  41. }
  42.  
  43. //Variables offset
  44. @Override
  45. public Object visit (VarDefinition v, Object o) {
  46. super.visit(v, o);
  47. //Global variables
  48. if(v.getScope() == 0) {
  49. v.setOffset(globalBytes);
  50. globalBytes+=v.getType().numberOfBytes();
  51. }
  52.  
  53. //Local variables are computed inside function definition
  54.  
  55. return null;
  56. }
  57.  
  58. @Override
  59. public Object visit (FuncDefinition fd, Object o) {
  60. super.visit(fd, o);
  61.  
  62. //Go over all the variables and traverse with this offset visitor.
  63. for(Statement s : fd.getStatements())
  64. if(s instanceof VarDefinition)
  65. ((VarDefinition) s).setOffset(localBytes -= ((VarDefinition) s).getType().numberOfBytes());
  66.  
  67. fd.getType().bytesLocalSum = localBytes;
  68.  
  69. return null;
  70. }
  71.  
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement