我正在尝试使用 JFlex 和 Cup 为 javascript-ish 语言编写解析器,但我遇到了一些致命的移位/减少问题和减少/减少问题。
我已经彻底搜索并找到了大量示例,但我无法将这些推断到我的语法中。到目前为止我的理解是,这些问题是因为解析器无法决定它应该采取哪种方式,因为它无法区分。
我的语法如下:从INPUT开始;
INPUT::= PROGRAM;
PROGRAM::= FUNCTION NEWLINE PROGRAM
| NEWLINE PROGRAM;
FUNCTION ::= function OPTIONAL id p_izq ARG p_der NEWLINE l_izq NEWLINE BODY l_der;
OPTIONAL ::=
| TYPE;
TYPE::= integer
| boolean
ARG ::=
| TYPE id MORE_ARGS;
MORE_ARGS ::=
| colon TYPE id MORE_ARGS;
NEWLINE ::= salto NEWLINE
| ;
BODY ::= ;
我遇到了几个冲突,但这两个只是一个例子:
Warning : *** Shift/Reduce conflict found in state #5
between NEWLINE ::= (*)
and NEWLINE ::= (*) salto NEWLINE
under symbol salto
Resolved in favor of shifting.
Warning : *** Shift/Reduce conflict found in state #0
between NEWLINE ::= (*)
and FUNCTION ::= (*) function OPTIONAL id p_izq ARG p_der NEWLINE l_izq NEWLINE BODY l_der
under symbol function
Resolved in favor of shifting.
PS:语法要复杂得多,但我认为如果我看到这些移位/减少问题是如何解决的,我将能够解决其余的问题。
感谢您的回答。