简单的二义性文法与减少,减少冲突(Simple ambiguous grammar with red

2019-09-24 03:21发布

以下简单语法来解析在降低/减少冲突的逻辑表达式的结果:

%token AND OR
%token NUMBER VARIABLE
%%
logical_expr
    : logical_expr AND logical_term
    | logical_expr OR logical_term
    | logical_term
    ;
logical_term
    : VARIABLE
    | comparison
    | '(' logical_expr ')'
    ;
comparison
    : expr '<' expr
    | expr '>' expr
    ;
expr
    : expr '+' term
    | expr '-' term
    | term
    ;
term
    : NUMBER
    | VARIABLE
    | '(' expr ')'
    ;
%%

从野牛状态报告有:

state 2

    4 logical_term: VARIABLE .
   13 term: VARIABLE .

    ')'       reduce using rule 4 (logical_term)
    ')'       [reduce using rule 13 (term)]
    '<'       reduce using rule 13 (term)
    '>'       reduce using rule 13 (term)
    '+'       reduce using rule 13 (term)
    '-'       reduce using rule 13 (term)
    $default  reduce using rule 4 (logical_term)

我猜问题是,它不能找出如何解析“(A)+ 1 <2”。 怎样才能消除歧义这个语法? 可能吗?

Answer 1:

用你的语法的基本问题是,当你看到( VARIABLE和下一标记) ,分析器不能告诉这是否应该是一个括号exprlogical_expr -这取决于接下来的令牌之后的) 。 如果下一个标记是+- <>那么它的一个EXPR,而如果它是ANDOR (或EOF),则其在logical_expr

通常的解决方案是,以不试着去做类型检查的语法。 虽然其可能的,它需要额外的前瞻,并且可能需要多层次的语法或如此复杂。

在你的情况,如果你改变了logical_term规则

logical_term
    : comparison
    | expr
    ;

冲突消失了,但你的解析器会接受的事情,不是类型正确,如a > 3 AND 22 + 2 OR 7 。 你需要做您解析树中的类型检查(或任何数据结构要创建)的正确性,尽管你可能会需要一个反正(在你已经需要类型检查,最起码VARIABLE ,以确保变量是数字或布尔值,取决于上下文。)



文章来源: Simple ambiguous grammar with reduce-reduce conflict