我正在尝试扩展 the grammar of the Tiny Language将赋值视为表达式。因此,写是有效的
a = b = 1; // -> a = (b = 1)
a = 2 * (b = 1); // contrived but valid
a = 1 = 2; // invalid
赋值在两个方面不同于其他运算符。它是右结合的(没什么大不了的),它的左侧必须是一个变量。所以我改变了这样的语法
statement: assignmentExpr | functionCall ...;
assignmentExpr: Identifier indexes? '=' expression;
expression: assignmentExpr | condExpr;
它不起作用,因为它包含一个非 LL(*) 决定。我也试过这个变种:
assignmentExpr: Identifier indexes? '=' (expression | condExpr);
但我遇到了同样的错误。我对感兴趣
最佳答案
我认为您可以像这样更改语法以实现相同的目的,而无需使用句法谓词:
statement: Expr ';' | functionCall ';'...;
Expr: Identifier indexes? '=' Expr | condExpr ;
condExpr: .... and so on;
考虑到这个想法,我改变了 Bart 的例子:
grammar TL;
options {
output=AST;
}
tokens {
ROOT;
}
parse
: stat+ EOF -> ^(ROOT stat+)
;
stat
: expr ';'
;
expr
: Id Assign expr -> ^(Assign Id expr)
| add
;
add
: mult (('+' | '-')^ mult)*
;
mult
: atom (('*' | '/')^ atom)*
;
atom
: Id
| Num
| '('! expr ')' !
;
Assign : '=' ;
Comment : '//' ~('\r' | '\n')* {skip();};
Id : 'a'..'z'+;
Num : '0'..'9'+;
Space : (' ' | '\t' | '\r' | '\n')+ {skip();};
对于输入:
a=b=4;
a = 2 * (b = 1);
你得到以下解析树:
关于parsing - 赋值为 Antlr 语法中的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8398686/