我试图在不使用括号的情况下编写支持函数调用的语法:
f x, y
就像在Haskell中一样,我喜欢函数调用来最小化他们的参数。也就是说,我想要
g 5 + 3
表示
(g 5) + 3
而不是
g (5 + 3)
不幸的是,我用这个语法得到了第二个解析:
grammar Parameters;
expr
: '(' expr ')'
| expr MULTIPLICATIVE_OPERATOR expr
| expr ADDITIVE_OPERATOR expr
| ID (expr (',' expr)*?)??
| INT
;
MULTIPLICATIVE_OPERATOR: [*/%];
ADDITIVE_OPERATOR: '+';
ID: [a..z]+;
INT: '-'? [0-9]+;
WHITESPACE: [ \t\n\r]+ -> skip;
我得到的解析树是:
我原以为首先列出的子规则会先尝试。在这种情况下,expr ADDITIVE_OPERATOR expr
出现在ID
子规则之前,为什么ID
子规则优先级更高?