模棱两可的语法(使用Bison)

时间:2011-08-11 11:20:26

标签: grammar bison lalr

我的语法含糊不清。我有这个:

%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_definitionidentifier (之间产生S / R冲突。我试图说服Bison,通过统一函数调用和函数定义的语法,它不需要在令牌流的后期做出决定。换句话说,如果它遇到了调用和定义共同的东西,它可以减少它而不需要知道哪个是哪个,如果它遇到其他东西,那么其他东西会清楚地标记哪个是哪个。这是否可能,如果是这样,我该怎么做?如果可能的话,我真的宁愿避免改变输入流的结构。

2 个答案:

答案 0 :(得分:1)

在您看到identifier ( identifier前瞻,)之前,不应出现此问题。此时,解析器必须决定是否将第二个标识符缩减为function_definition_argumentexpression(变为function_argument)。

语义行为。

可能更容易维护(并导致更易理解的语法错误消息)来编写类似

的内容
expression_not_naked_identifier

然后检查最后两个作品的动作中的语义约束,即你解析的实际ambiguous_begining_of_function_defn_or_call与它们被放置的用途相匹配。

答案 1 :(得分:1)

问题是expression可以由一个identifier组成。此时,解析器需要确定它是仅identifier还是将其减少到expression,因为这将决定之后的路径。