visitor.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import symbol_table as st
  2. class Visitor(object):
  3. def __init__(self, args):
  4. pass
  5. def dump(self):
  6. return ""
  7. def visit(self, tree):
  8. if not tree.head.startswith("implicit_autogenerated_"):
  9. val = tree.head
  10. visit_val = getattr(self, 'visit_' + val)
  11. return visit_val(tree)
  12. def visit_children(self, tree):
  13. for child in tree.get_tail():
  14. if child.head.islower(): # visit only non-terminals
  15. self.visit(child)
  16. def set_type(self, tree, type):
  17. tree.type = type
  18. def get_type(self, tree):
  19. return getattr(tree, 'type', None)
  20. def set_symbol(self, tree, symbol):
  21. tree.symbol = symbol
  22. def get_symbol(self, tree):
  23. return getattr(tree, 'symbol', None)
  24. @staticmethod
  25. def print_tree(tree):
  26. from prettyprint_visitor import PrintVisitor
  27. pv = PrintVisitor()
  28. pv.visit(tree)
  29. print pv.dump()
  30. # a visit_* method for each non-terminal in the grammar
  31. def visit_start(self, tree):
  32. pass
  33. # include-nodes are replaced before executing any visitor
  34. # def visit_include(self, tree):
  35. # pass
  36. def visit_vardecl(self, tree):
  37. pass
  38. def visit_assignment(self, tree):
  39. pass
  40. def visit_expression(self, tree):
  41. pass
  42. def visit_binary_operation(self, tree):
  43. pass
  44. def visit_disjunction(self, tree):
  45. pass
  46. def visit_conjunction(self, tree):
  47. pass
  48. def visit_comparison(self, tree):
  49. pass
  50. def visit_relation(self, tree):
  51. pass
  52. def visit_sum(self, tree):
  53. pass
  54. def visit_term(self, tree):
  55. pass
  56. def visit_factor(self, tree):
  57. pass
  58. def visit_logical_not(self, tree):
  59. pass
  60. def visit_invert_sign(self, tree):
  61. pass
  62. def visit_keep_sign(self, tree):
  63. pass
  64. def visit_primary(self, tree):
  65. pass
  66. def visit_parenthesized(self, tree):
  67. pass
  68. def visit_atomvalue(self, tree):
  69. pass
  70. def visit_type_specifier(self, tree):
  71. pass
  72. def visit_actionname(self, tree):
  73. pass
  74. def visit_string(self, tree):
  75. pass
  76. def visit_integer(self, tree):
  77. pass
  78. def visit_float(self, tree):
  79. pass
  80. def visit_rvalue(self, tree):
  81. pass
  82. def visit_lvalue(self, tree):
  83. pass
  84. def visit_func_call(self, tree):
  85. pass
  86. def visit_dictionary(self, tree):
  87. pass
  88. def visit_list(self, tree):
  89. pass
  90. def visit_dict_item(self, tree):
  91. pass
  92. def visit_ifelse(self, tree):
  93. pass
  94. def visit_while(self, tree):
  95. pass
  96. def visit_block(self, tree):
  97. pass
  98. def visit_func_body(self, tree):
  99. pass
  100. def visit_funcdecl(self, tree):
  101. pass
  102. def visit_func_type(self, tree):
  103. pass
  104. def visit_func_name(self, tree):
  105. pass
  106. def visit_void(self, tree):
  107. pass
  108. def visit_parameter(self, tree):
  109. pass
  110. def visit_return(self, tree):
  111. pass
  112. def visit_indent(self, tree):
  113. pass
  114. def visit_bool(self, tree):
  115. pass
  116. def visit_newline(self, tree):
  117. pass
  118. def visit_definition(self, tree):
  119. pass
  120. def visit_deref(self, tree):
  121. pass