我的语法含糊不清。我有这个:
%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
和identifier (
之间产生S / R冲突。我试图说服Bison,通过统一函数调用和函数定义的语法,它不需要在令牌流的后期做出决定。换句话说,如果它遇到了调用和定义共同的东西,它可以减少它而不需要知道哪个是哪个,如果它遇到其他东西,那么其他东西会清楚地标记哪个是哪个。这是否可能,如果是这样,我该怎么做?如果可能的话,我真的宁愿避免改变输入流的结构。
答案 0 :(得分:1)
在您看到identifier ( identifier
前瞻,
或)
之前,不应出现此问题。此时,解析器必须决定是否将第二个标识符缩减为function_definition_argument
或expression
(变为function_argument
)。
语义行为。
可能更容易维护(并导致更易理解的语法错误消息)来编写类似
的内容expression_not_naked_identifier
然后检查最后两个作品的动作中的语义约束,即你解析的实际ambiguous_begining_of_function_defn_or_call
与它们被放置的用途相匹配。
答案 1 :(得分:1)
问题是expression
可以由一个identifier
组成。此时,解析器需要确定它是仅identifier
还是将其减少到expression
,因为这将决定之后的路径。