这是简单嵌套表达式的基本结构...
infix : prefix (INFIX_OP^ prefix)*;
prefix : postfix | (PREFIX_OP postfix) -> ^(PREFIX_OP postfix);
postfix : INT (POSTFIX_OP^)?;
POSTFIX_OP : '!';
INFIX_OP : '+';
PREFIX_OP : '-';
INT : '0'..'9'*;
如果我想创建这些表达式的列表,我可以使用以下...
list: infix (',' infix)*;
这里我们使用“,”作为分隔符。
我希望能够构建一个没有任何分隔符的表达式列表。
因此,如果我有字符串4 5 2+3 1 6
,我希望能够将其解释为(4) (5) ^(+ 2 3) (1) (6)
问题是两者都4
具有2+3
相同的第一个符号(INT),所以我有冲突。我试图弄清楚如何解决这个问题。
编辑
我几乎想通了,只是在为某种条件想出正确的重写时遇到了麻烦……
expr: (a=atom -> $a)
(op='+' b=atom-> {$a.text != "+" && $b.text != "+"}? ^($op $expr $b) // infix
-> {$b.text != "+"}? // HAVING TROUBLE COMING UP WITH THIS CORRECT REWRITE!
-> $expr $op $b)*; // simple list
atom: INT | '+';
INT : '0'..'9'+;
这将解析1+2+3++4+5+
为^(+ ^(+ 1 2) 3) (+) (+) ^(+ 4 5) (+)
,这就是我想要的。
现在我正在尝试完成我的重写规则,以便++1+2
将其解析为(+) (+) ^(+ 1 2)
. 总的来说,我想要一个标记列表并找到所有中缀表达式,并将其余的保留为列表。