Как уже упоминал Кей: нет необходимости учитывать приоритет операторов в выражениях после исправления.Выражения после исправления - это просто список из одного или нескольких операндов и операторов.Вот как заставить работать вашу грамматику:
grammar lang;
options {
language=Python;
output=AST;
}
tokens {
PROGRAM;
STATS;
DECL;
ASSIGN;
EXPR;
}
program
: 'program' id=ID '=' decl* 'begin' statement* 'end' ID '.'
-> ^(PROGRAM $id ^(DECL decl*) ^(STATS statement*))
;
decl
: const
| variable
;
type
: INTTYPE
| FLOATTYPE
;
const
: 'const' ID ':' type ':=' expr ';' -> ^('const' type ID expr)
;
variable
: 'var' ID (',' ID)* ':' type ';' -> ^('var' type ID+)
;
statement
: assignment
;
assignment
: ID ':=' expr ';' -> ^(ASSIGN ID expr)
;
expr
: exprAtom+ -> ^(EXPR exprAtom+)
;
exprAtom
: operand
| operator
;
operand
: INT
| ID
;
operator
: 'and' | 'or' | '==' | '!=' | '<' | '<=' | '>=' | '>' | '+' | '-' | '*' | '/' | 'mod' | 'not'
;
INTTYPE : 'int' ;
FLOATTYPE : 'float' ;
ID : ('a'..'z' | 'A'..'Z') ('a'..'z' | 'A'..'Z' | '0'..'9')* ;
INT : '0'..'9'+ ;
WS : (' '|'\n' | '\t') {$channel=HIDDEN;} ;
Теперь сгенерируйте из него лексер и парсер (исходные файлы Python!), Выполнив в командной строке следующее:
java -cp antlr-3.1.3.jar org.antlr.Tool lang.g
Иесли вы сейчас выполните следующий скрипт
#!/usr/bin/env python
import antlr3
from antlr3 import *
from antlr3.tree import *
from langLexer import *
from langParser import *
def print_level_order(tree, indent):
print '{0}{1}'.format(' '*indent, tree.text)
for child in tree.getChildren():
print_level_order(child, indent+1)
input = """
program Test1 =
const t1 : int := 1;
const t2 : int := 2;
var x, y, z : int;
begin
x := 41;
y := 10;
z := 2 4 *;
end Test1.
"""
char_stream = antlr3.ANTLRStringStream(input)
lexer = langLexer(char_stream)
tokens = antlr3.CommonTokenStream(lexer)
parser = langParser(tokens)
tree = parser.program().tree
print_level_order(tree, 0)
, вы увидите, как на консоль выводится следующее:
PROGRAM
Test1
DECL
const
int
t1
EXPR
1
const
int
t2
EXPR
2
var
int
x
y
z
STATS
ASSIGN
x
EXPR
41
ASSIGN
y
EXPR
10
ASSIGN
z
EXPR
2
4
*