我正在为编程语言编写语法,但我首先遇到了移位/减少问题。问题可以在状态中找到:
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 .) ]