我正在尝试扩展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);
但我得到了同样的错误。我对感兴趣
- 这个具体问题
- 给定具有非 LL(*) 决策的文法,如何找到导致问题的两条路径
- 如何修复它