【发布时间】:2016-03-15 20:31:05
【问题描述】:
我有一个用于识别标识符和字符串连接表达式的 JavaCUP LR(1) 解析器的简单语法。我还想添加一些空函数调用作为可能的串联参数。但是,当我尝试这样做时,会导致 shift/reduce 冲突。
语法:
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; 等标识符,但我无法使其工作。
【问题讨论】:
-
您是否与 JavaCUP 绑定?还是您只需要一种解析简单表达式的方法?
-
不幸的是只有JavaCUP
标签: parsing compiler-construction context-free-grammar shift-reduce-conflict cup