Я пытаюсь расширить грамматику Крошечного Языка , чтобы рассматривать назначение как выражение. Таким образом было бы правильно написать
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 (*), как найти два пути, которые вызывают проблему
- Как это исправить