You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解析斜杠分隔且末尾双斜杠的数据格式时出现shift/reduce冲突如何解决

冲突原因判断

你的判断完全正确。冲突根源正是:解析器读取完第一个字段(匹配到/ DGT序列)后,下一个输入token为/时存在两个合法操作:

  • 归约:将已匹配的/ DGT按row: '/' DGT规则归约为row,后续的/属于行尾双斜杠的第一个字符
  • 移进:把当前/移进栈,尝试匹配第二个字段的row: '/' DGT '/' DGT分支
    两种操作没有明确优先级,因此触发shift/reduce冲突。

消除歧义的修改方案

方案1:固定双字段场景(最简修改)

直接把行尾双斜杠的匹配整合到row的分支中,让解析器可以根据/后的token明确判断分支,完全消除冲突:

%{
int yylex(void);
extern FILE *yyin;
void yyerror(const char* msg);
%}

%token DGT

%%
test: row
 ;
 
row: '/' DGT '/' DGT '/' '/'        /* 匹配两个字段的行 */
 | '/' DGT '/' '/'                    /* 匹配单个字段的行 */
 ;
%%

// 其余main、yyerror代码保持不变

方案2:多可选字段扩展场景

如果后续需要新增更多可选字段,可以用优先级声明的方式简化文法,不用逐个添加分支:

%{
int yylex(void);
extern FILE *yyin;
void yyerror(const char* msg);
%}

%token DGT
/* 声明优先级:字段分隔符/的优先级高于行尾匹配优先级 */
%nonassoc ROW_END
%precedence '/'

%%
test: row '/' '/' %prec ROW_END
 ;
// row匹配至少1个斜杠+数字的字段组合
row: '/' DGT
 | row '/' DGT
 ;
%%

// 其余main、yyerror代码保持不变

这种写法下,解析器遇到/会优先尝试匹配下一个字段,只有当/后仍然是/时才会判定为行尾,兼容任意数量的可选字段。


内容的提问来源于stack exchange,提问作者Roger Costello

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:39:02