小编mcu*_*818的帖子

野牛转移 - 减少冲突

带有冲突的精简版语法:

body: variable_list function_list;
variable_list:
  variable_list variable | /* empty */
;
variable:
  TYPE identifiers ';'
;
identifiers:
  identifiers ',' IDENTIFIER | IDENTIFIER
;
function_list:
  function_list function | /* empty */
;
function:
  TYPE IDENTIFIER '(' argument_list ')' function_body
;
Run Code Online (Sandbox Code Playgroud)

问题是变量和函数都以TYPE和IDENTIFIER开头,例如

int some_var;
int foo() { return 0; }
Run Code Online (Sandbox Code Playgroud)

变量总是在这种语言的函数之前声明,但是当尝试解析时,它总是给出

解析错误:语法错误,意外'(',期待','或';'[在foo之后]

如何使variable_list变得不那么贪婪,或者让解析器意识到如果下一个标记是'('而不是';'或','它显然是一个函数,而不是一个变量声明?

冲突的野牛调试输出是

state 17

3 body: variable_list . function_list
27 variable_list: variable_list . variable

T_INT    shift, and go to state 27
T_BOOL   shift, and go to state 28
T_STR …
Run Code Online (Sandbox Code Playgroud)

grammar bison shift-reduce-conflict

3
推荐指数
1
解决办法
4001
查看次数

标签 统计

bison ×1

grammar ×1

shift-reduce-conflict ×1