1## This file is part of PyANTLR. See LICENSE.txt for license
2## details..........Copyright (C) Wolfgang Haefelinger, 2004.
3##
4## $Id$
5
6import sys
7import antlr
8
9class Parser(antlr.LLkParser):
10   def __init__(self,*args):
11      super(Parser,self).__init__(*args)
12      self.num_err = 0
13      self.num_wrn = 0
14
15   def reportError(self,err):
16      self.num_err += 1
17      super(Parser,self).reportError(err)
18
19   def reportWarning(self,err):
20      self.num_wrn += 1
21      super(Parser,self).reportWarning(err)
22
23
24
25
26
27class Walker(antlr.TreeParser):
28   def __init__(self,*args):
29      super(Walker,self).__init__(*args)
30      self.depth = 0
31
32   def tofloat(self,ast):
33      s = ast.getText()
34      return float(s)
35
36
37   def howmanysiblings(self,ast):
38      if ast == None:
39         return -1
40
41      r = 0
42      ast = ast.getNextSibling()
43      while(ast != None) :
44         r += 1
45         ast = ast.getNextSibling()
46      return r
47
48   def traceIn(self,s,ast) :
49      self.depth += 1
50      print ">" * self.depth
51      print " " + s + "( `"
52      if (ast==None):
53         print("()")
54      else:
55         print(ast.toStringList())
56      print " ') | siblings:",self.howmanysiblings(ast)
57
58
59   def traceOut(self,s,ast):
60      self.depth += 1
61      print(">" * self.depth)
62      print(" " + s + "( `")
63      if (ast==None):
64         print("()")
65      else:
66         print(ast.toStringList())
67      print(" ')")
68      self.depth -= 1
69
70
71class TNode(antlr.CommonAST):
72   def __init__(self,token=None):
73      antlr.CommonAST.__init__(self,token)
74
75   ### change printing style
76   def toStringTree(self):
77      ts = ""
78      kid = self.getFirstChild()
79      if kid:
80         ts += "{"
81      ts += " " + self.toString()
82      if kid:
83         ts += kid.toStringList()
84         ts += "}"
85      return ts
86
87class BodyNode(antlr.CommonAST):
88   def __init__(self,token=None):
89      antlr.CommonAST.__init__(self,token)
90
91   ### change printing style
92   def toStringTree(self):
93      ts = "BODY: "
94      kid = self.getFirstChild()
95      if kid:
96         ts += "{"
97      ts += " " + self.toString()
98      if kid:
99         ts += kid.toStringList()
100         ts += "}"
101      return ts
102
103class ExprNode(antlr.CommonAST):
104   def __init__(self,token=None):
105      antlr.CommonAST.__init__(self,token)
106
107   ### change printing style
108   def toStringTree(self):
109      ts = "EXPR: "
110      kid = self.getFirstChild()
111      if kid:
112         ts += "{"
113      ts += " " + self.toString()
114      if kid:
115         ts += kid.toStringList()
116         ts += "}"
117      return ts
118
119
120class NumberNode(antlr.CommonAST):
121   def __init__(self,token=None):
122      antlr.CommonAST.__init__(self,token)
123
124   ### change printing style
125   def toStringTree(self):
126      ts = "NUMBER: "
127      kid = self.getFirstChild()
128      if kid:
129         ts += "{"
130      ts += " " + self.toString()
131      if kid:
132         ts += kid.toStringList()
133         ts += "}"
134      return ts
135
136
137
138
139
140class Visitor(antlr.ASTVisitor):
141   def __init__(self,*args):
142      super(Visitor,self).__init__(*args)
143      self.level = 0
144      if not args:
145         self.cout = sys.stdout
146         return
147      if isinstance(args[0],file):
148         self.cout = args[0]
149         return
150      assert 0
151
152   def tabs(self):
153      print " " * self.level
154
155   def printf(self,fmt,*args):
156      if not args:
157          sys.stdout.write(fmt)
158          return
159      argv = tuple(args)
160      self.cout.write(fmt % argv)
161
162   def flush(self):
163      self.cout.flush()
164
165   def visit1(self,node):
166      if not node:
167         self.printf(" nil ")
168         return
169
170      c = node.getType()
171      t = node.getText()
172      k = node.getFirstChild()
173      s = node.getNextSibling()
174
175      self.printf("( <%s> ",c)
176      if t:
177         self.printf(" %s ",t)
178      self.visit1(k);
179      self.visit1(s);
180      self.printf(")")
181
182   def visit(self,node):
183      self.visit1(node);
184      self.printf("\n")
185
186
187
188def main():
189   import CalcLexer
190   import CalcParser
191   import CalcWalker
192
193   L = CalcLexer.Lexer()
194   P = CalcParser.Parser(L)
195   P.setFilename(L.getFilename())
196
197   ### Parse the input expression
198   P.body()
199
200   if(P.num_err>0):
201      print "*** " + P.num_err + " error(s) while parsing."
202      print ">>> exit(1)"
203      import sys
204      sys.exit(1)
205
206   ast = P.getAST()
207
208   if not ast:
209      print "stop - no AST generated."
210      import sys
211      sys.exit(1)
212
213   ###show tree
214   print "Tree: " + ast.toStringTree()
215   print "List: " + ast.toStringList()
216   print "Node: " + ast.toString()
217   print "visit>>"
218   visitor = Visitor()
219   visitor.visit(ast);
220   print "visit<<"
221
222   W = CalcWalker.Walker()
223   s = W.body(ast)
224   print "*sum =>",s
225
226
227if __name__ == "__main__":
228   main()
229