私はプログラミング言語の文法を書いていますが、真っ先にシフト/リデュースの問題に直面しています。問題は次の状態にあります。
fn_call -> ID . L_PAREN fn_args R_PAREN
assignment -> ID . ASSIGN value
assignment -> ID . ASSIGN container
value -> ID
もう少し詳しく説明する前に、次のことを明確にしたいと思います。
関数を呼び出しているのか、ID を値 (定数または変数など) として使用しているかをプログラムが判断できないため、これはシフト/リデュースですか?
続けて、これを修正することは可能ですか?私の言語では現在、行区切り記号 (C の ';' や Python の '\n' など) を使用していません。パーサーは LALR(1) です。
関数呼び出しと行区切り文字を含む変数を解読する最も効率的な (文法に追加する規則が最も少ない) 方法は何ですか?
編集: これがその状態の先読みです。
! shift/reduce conflict for L_PAREN resolved as shift
L_PAREN shift and go to state 60
ASSIGN shift and go to state 61
COMMA reduce using rule 43 (value -> ID .)
R_PAREN reduce using rule 43 (value -> ID .)
DASH reduce using rule 43 (value -> ID .)
R_BRACE reduce using rule 43 (value -> ID .)
NONE reduce using rule 43 (value -> ID .)
DEFN reduce using rule 43 (value -> ID .)
FOR reduce using rule 43 (value -> ID .)
INT_T reduce using rule 43 (value -> ID .)
DBL_T reduce using rule 43 (value -> ID .)
STR_T reduce using rule 43 (value -> ID .)
ID reduce using rule 43 (value -> ID .)
INT reduce using rule 43 (value -> ID .)
DBL reduce using rule 43 (value -> ID .)
STR reduce using rule 43 (value -> ID .)
COMMENT_LINE reduce using rule 43 (value -> ID .)
L_BRACE reduce using rule 43 (value -> ID .)
SET reduce using rule 43 (value -> ID .)
! L_PAREN [ reduce using rule 43 (value -> ID .) ]