У меня есть простая грамматика для парсера JavaCUP LR (1), который распознает выражения конкатенации идентификаторов и строк. Я также хочу добавить несколько пустых вызовов функций в качестве возможного аргумента конкатенации. Однако, когда я пытаюсь это сделать, это приводит к конфликту сдвига / уменьшения.
Грамматика:
precedence left PLUS;
e ::= e exp
| exp;
exp ::= concat
| literal;
concatenation ::= exp PLUS exp
| LPAREN exp RPAREN;
literal ::= IDENTIFIER
| STRING
| IDENTIFIER LPAREN RPAREN; // THIS PRODUCES THE ERROR
Ввод:
x + x + (x) // match
"foo" + x // match
(("goo") + (((y)))) // match
function_name() + x + "foo" + (other_func()) // what I also want
Конфликт:
Warning : *** Shift/Reduce conflict found in state #12
between literal ::= IDENTIFIER (*)
and literal ::= IDENTIFIER (*) LPAREN RPAREN
under symbol LPAREN
Я пробовал много разных вещей, например, скрывать идентификатор, например IDENTIFIER second
в буквальном смысле и second ::= | LPAREN RPAREN;
, но я не могу заставить его работать.