带有冲突的精简版语法:
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)