INT你的规则有问题:
INT : '0'..'9'*;
匹配一个空字符串。它应该始终匹配至少 1 个字符:
INT : '0'..'9'+;
除此之外,它似乎工作得很好。
给定语法:
grammar T;
options {
output=AST;
}
tokens {
LIST;
}
parse : list EOF -> list;
list : infix+ -> ^(LIST infix+);
infix : prefix (INFIX_OP^ prefix)*;
prefix : postfix -> postfix
| PREFIX_OP postfix -> ^(PREFIX_OP postfix)
;
postfix : INT (POSTFIX_OP^)?;
POSTFIX_OP : '!';
INFIX_OP : '+';
PREFIX_OP : '-';
INT : '0'..'9'+;
SPACE : ' ' {skip();};
它解析输入:
4 5 2+3 1 6
进入以下AST:
编辑
引入既可用于后置表达式也可用于中缀表达式的运算符会使您变得list模棱两可(嗯,在我下面的版本中,就是... :))。因此,我将在此演示中保留逗号:
grammar T;
options {
output=AST;
}
tokens {
LIST;
P_ADD;
}
parse : list EOF -> list;
list : expr (',' expr)* -> ^(LIST expr+);
expr : postfix_expr;
postfix_expr : (infix_expr -> infix_expr) (ADD -> ^(P_ADD infix_expr))?;
infix_expr : atom ((ADD | SUB)^ atom)*;
atom : INT;
ADD : '+';
SUB : '-';
INT : '0'..'9'+;
SPACE : ' ' {skip();};
在上面的语法中,+作为中缀运算符优先于后缀版本,正如您在解析输入时看到的那样2+5+: