我正在编写一个编程语言解析器,但我陷入了这种 Shift/Reduce Conflict。
这是通过使用 -v 运行野牛获得的 parser.output 文件中的冲突状态
State 1
24 ident: TIDENT .
26 call: TIDENT . TLPAREN args TRPAREN
TLPAREN shift, and go to state 24
TLPAREN [reduce using rule 24 (ident)]
$default reduce using rule 24 (ident)
当我尝试实施呼叫规则时发生冲突,它似乎与正常的 ident 规则冲突。
这是语法的某些部分,(为简单起见删除了操作,但不需要它们。我也不确定定义规则的顺序是否重要,如果我错了,请纠正我)
(大写字母是记号)
ident 规则很简单
ident: TIDENT
;
Args,通过调用使用。
args: /* empty */
|
expr
|
args TCOMMA expr
;
调用函数
call:
TIDENT TLPAREN args TRPAREN
;
表达式的 expr
expr:
number
|
ternary
|
bool
|
string
|
ident
|
call
|
TLPAREN expr TRPAREN
|
expr TPLUS expr
|
expr TMINUS expr
|
expr TSLASH expr
|
expr TSTAR expr
|
expr TGT expr
|
expr TGE expr
|
expr TLT expr
|
expr TLE expr
;
问题:为什么语法有移位/减少冲突,你如何解决它?我见过类似的风格解析器没有冲突,这真的很奇怪。
如果您需要查看完整的复制语法,请查看 hastebin https://hasteb.in/zozifopi.shell
如果您需要有关其他任何内容的更多详细信息,请在评论中告诉我,我将相应地编辑问题。