#!/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()