c - yacc-Flex 中的移位/减少冲突
问题描述
我在 yacc 中有以下语法,但是我得到了 1 个班次/减少冲突:
%union {
char* integer;
char* string;
char* boolean;
char* date;
};
%token <integer> INTEGER
%token <string> STRING
%token <boolean> BOOLEAN
%token <date> DATE
%token WORKBOOK_START WORKBOOK_END STYLES_START STYLES_END STYLE_START STYLE_END WORKSHEET_START
%token WORKSHEET_END CLOSE_TAG EQUAL QUOTES COL_END_TAG
%token TABLE_START TABLE_END COLUMN_START ROW_START ROW_END CELL_START CELL_END DATA_START DATA_END
%token ID NAME PROTECTED EXPCOLCOUNT EXPROWCOUNT STYLEID HIDDEN WIDTH HEIGHT MERGEACR MERGEDOWN TYPE
%token MY_NUMBER MY_STRING MY_BOOL MY_DATETIME
%%
WORKBOOK: WORKBOOK_START INWORKBOOK WORKBOOK_END ;
INWORKBOOK: WORKSHEET MORE_WORKSHEETS
| NUM_STYLES WORKSHEET MORE_WORKSHEETS
;
MORE_WORKSHEETS: WORKSHEET MORE_WORKSHEETS
|
;
NUM_STYLES: STYLES NUM_STYLES
|
;
STYLES: STYLES_START INSTYLES STYLES_END ;
INSTYLES: STYLE INSTYLES
|
;
STYLE: STYLE_START INSTYLE STYLE_END ;
INSTYLE: id CLOSE_TAG ;
id: ID EQUAL QUOTES STRING QUOTES {checkID($4);};
WORKSHEET: WORKSHEET_START INWORKSHEET WORKSHEET_END ;
INWORKSHEET: name protected CLOSE_TAG MORE_TABLES
| protected name CLOSE_TAG MORE_TABLES
| name CLOSE_TAG MORE_TABLES
;
name: NAME EQUAL QUOTES STRING QUOTES ;
%%
我已经使用-v
选项来获取生成的冲突,似乎我遇到了问题 WORKBOOK: WORKBOOK_START INWORKBOOK WORKBOOK_END ;
State 1
1 WORKBOOK: WORKBOOK_START . INWORKBOOK WORKBOOK_END
STYLES_START shift, and go to state 3
WORKSHEET_START shift, and go to state 4
WORKSHEET_START [reduce using rule 7 (NUM_STYLES)]
INWORKBOOK go to state 5
NUM_STYLES go to state 6
STYLES go to state 7
WORKSHEET go to state 8
我该如何解决这个问题?有什么建议么?
解决方案
NUM_STYLES
可以为空。所以给出了两种选择:
INWORKBOOK: WORKSHEET MORE_WORKSHEETS
| NUM_STYLES WORKSHEET MORE_WORKSHEETS
如果输入带有一个可能是 开始的标记,WORKSHEET
则解析器无法判断它是否应该使用第一个产生式,或者它是否应该减少一个空NUM_STYLES
并使用第二个产生式。
您应该再次查看状态表,并尝试了解它是如何告诉您该问题的。
推荐阅读
- visual-studio - 在 Visual Studio 2017 的分析器从 VSPX 文件导出的 XML 文件中查找 CPU 使用率?
- javascript - 如何从 json 返回特定对象(不区分大小写)?
- javascript - Thymeleaf foreach 循环,里面有按钮事件
- javascript - 在 ES6 (React) 中传递参数,SyntaxError: unknown: Unexpected token
- javascript - 比较数组并删除对象
- recursion - Y-combinator 似乎没有任何作用
- c - C - 套接字无法连接到 SMTP 服务器
- xamarin.ios - 模态视图弹出框:总是全屏?
- webdriver - 持续集成解决方案
- css - CSS 视频背景无法在 android 的 chrome 上播放