• Facebook
  • Twitter
  • Reddit
  • StumbleUpon
  • Digg
  • email

#!/usr/bin/env python
import sys, string, os, os.path
# compute translator lib path and append to the sys path
libpath = string.joinfields(string.split(os.path.abspath(sys.argv[0]), os.sep)[:-2] + [ "lib" ], os.sep)
sys.path.append(libpath)
import antlr, AbstractMachine, echarts_l, echarts_p, echarts_w
 
 
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")
 
 
def main():
 
   L = echarts_l.Lexer() 
 
   ### change token class
   L.setTokenObjectClass(antlr.CommonHiddenStreamToken)
   ### create new token stream - referenced by parser
   stream = antlr.TokenStreamHiddenTokenFilter(L);
   AbstractMachine.setStream(stream)
   stream.hide(echarts_p.ML_COMMENT);
   ### create parser with my stream
   P = echarts_p.Parser(stream)
   ### use this kind of AST nodes
   P.setASTNodeClass(antlr.CommonASTWithHiddenTokens)
   P.setFilename(L.getFilename())
 
   ### Parse the input expression
   try:
      P.compilationUnit()
   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(1)
 
      ###show tree
   print "Tree: " + ast.toStringTree()
   print "List: " + ast.toStringList()
   print "Node: " + ast.toString()
   print "visit>>"
   visitor = Visitor()
   visitor.visit(ast);
   print "visit<<"
 
   W = echarts_w.Walker()
 
   print "Walker returns: %s" % AbstractMachine.indent(W.compilationUnit(ast))
 
if __name__ == "__main__":
   main()