我有一个模棱两可的语法问题。我有这个:
%token identifier
%token lolcakes
%start program
%%
program
: call_or_definitions;
expression
: identifier
| lolcakes;
expressions
: expression
| expressions ',' expression;
call_or_definition
: function_call
| function_definition;
call_or_definitions
: call_or_definition
| call_or_definitions call_or_definition;
function_argument_core
: identifier
| identifier '=' expression
| identifier '=' '{' expressions '}';
function_call
: expression '(' function_arguments ')' ';';
function_definition
: identifier '(' function_definition_arguments ')' '{' '}';
function_argument
: lolcakes
| function_argument_core;
function_arguments
: function_argument
| function_arguments ',' function_argument
function_definition_argument
: expression function_argument_core
| function_argument_core;
function_definition_arguments
: function_definition_argument
| function_definition_arguments ',' function_definition_argument;
这是我真正的语法的一个子集,可以单独编译。目前,它在遇到流之间function_call和function_definition遇到流时会产生 S/R 冲突identifier (。我试图通过统一函数调用和函数定义的语法来说服 Bison,直到令牌流的后期才需要做出决定。换句话说,如果它遇到调用和定义共同的东西,它可以减少它而不需要知道哪个是哪个,如果它遇到其他东西,其他东西会清楚地标记哪个是哪个。这甚至可能吗?如果可以,我该怎么做?如果可能的话,我真的宁愿避免改变输入流的结构。