JFlex と Cup を使用して JavaScript っぽい言語用のパーサーを作成しようとしていますが、これらの致命的なシフト/リデュースの問題とリデュース/リデュースの問題にいくつか問題があります。
私は徹底的に検索し、たくさんの例を見つけましたが、これらを私の文法に当てはめることができません. これまでの私の理解では、これらの問題は、パーサーが区別できないため、どちらの方法を取るべきかを判断できないためです。
私の文法は次のとおりです。
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 ::= ;
いくつかの競合が発生していますが、これらの 2 つは単なる例です。
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: 文法ははるかに複雑ですが、これらのシフト/リデュースの問題がどのように解決されるかを見れば、残りを修正できると思います。
回答ありがとうございます。