File: incfile.py

package info (click to toggle)
antlr 2.7.7%2Bdfsg-9.2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 9,964 kB
  • sloc: java: 54,649; cs: 12,537; makefile: 8,847; cpp: 7,359; pascal: 5,273; sh: 4,333; python: 4,299; lisp: 1,969; xml: 220; lex: 192; ansic: 127
file content (131 lines) | stat: -rw-r--r-- 2,507 bytes parent folder | download | duplicates (11)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import sys
import antlr
      

class Visitor(antlr.ASTVisitor):
   def __init__(self,*args):
      super(Visitor,self).__init__(*args)
      self.level = 0
      if not args:
         self.cout = sys.stdout
         return
      if isinstance(args[0],file):
         self.cout = args[0]
         return
      assert 0

   def tabs(self):
      print " " * self.level

   def printf(self,fmt,*args):
      if not args:
          sys.stdout.write(fmt)
          return
      argv = tuple(args)
      self.cout.write(fmt % argv)

   def flush(self):
      self.cout.flush()

   def visit1(self,node):
      if not node:
         self.printf(" nil ")
         return

      c = node.getType()
      t = node.getText()
      k = node.getFirstChild()
      s = node.getNextSibling()
    
      self.printf("( <%s> ",c)
      if t:
         self.printf(" %s ",t)
      self.visit1(k);
      self.visit1(s);
      self.printf(")")

   def visit(self,node):
      self.visit1(node);
      self.printf("\n")

### some global vars referenced by lexer and parser
selector = None
parser   = None
lexer    = None

def getselector():
   import incfile
   assert incfile.selector
   return incfile.selector

def getparser():
   import incfile
   assert incfile.parser
   return incfile.parser

def getlexer():
   import incfile
   assert incfile.lexer
   return incfile.lexer



def check(s,l,p):
   import incfile
   assert incfile.lexer
   assert incfile.lexer == l
   assert incfile.selector
   assert incfile.selector == s
   assert incfile.parser
   assert incfile.parser == p


def main():
   import incfile_l
   import incfile_p
   
   ## make a selector
   S = antlr.TokenStreamSelector()
   L = incfile_l.Lexer()

   S.addInputStream(L,"main")
   S.select("main")
   
   P = incfile_p.Parser(S)
   P.setFilename(L.getFilename())

   import incfile
   incfile.selector = S
   incfile.lexer = L
   incfile.parser = P
   
   check(S,L,P)

   ### Parse the input expression
   try:
      P.startRule()
   except antlr.ANTLRException, ex:
      print "*** error(s) while parsing."
      print ">>> exit(1)"
      import sys
      sys.exit(1)

   
   ast = P.getAST()
   
   if not ast:
      print "stop - no AST generated."
      import sys
      sys.exit(0)
      
   ###show tree
   print "Tree: " + ast.toStringTree()
   print "List: " + ast.toStringList()
   print "Node: " + ast.toString()
   print "visit>>"
   visitor = Visitor()
   visitor.visit(ast);
   print "visit<<"

if __name__ == "__main__":
   main()