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
|
// This file is part of PyANTLR. See LICENSE.txt for license
// details..........Copyright (C) Wolfgang Haefelinger, 2004.
//
// $Id$
/*
* Make sure to run antlr.Tool on the lexer.g file first!
*/
options {
mangleLiteralPrefix = "TK_";
language=Python;
}
{
def main():
import tinyc_l
import tinyc_p
L = tinyc_l.Lexer()
P = tinyc_p.Parser(L)
P.setFilename(L.getFilename())
### Parse the input expression
try:
P.program()
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."
return
###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()
}
class tinyc_p extends Parser;
options {
importVocab=TinyC;
}
program
: ( declaration )* EOF
;
declaration
: (variable) => variable
| function
;
declarator
: id:ID
| STAR id2:ID
;
variable
: type declarator SEMI
;
function
: type id:ID LPAREN
(formalParameter (COMMA formalParameter)*)?
RPAREN
block
;
formalParameter
: type declarator
;
type:
(
TK_int
| TK_char
| id:ID
)
;
block
: LCURLY ( statement )* RCURLY
;
statement
: (declaration) => declaration
| expr SEMI
| TK_if LPAREN expr RPAREN statement
( TK_else statement )?
| TK_while LPAREN expr RPAREN statement
| block
;
expr: assignExpr
;
assignExpr
: aexpr (ASSIGN assignExpr)?
;
aexpr
: mexpr (PLUS mexpr)*
;
mexpr
: atom (STAR atom)*
;
atom: ID
| INT
| CHAR_LITERAL
| STRING_LITERAL
;
|