在野牛中的逻辑表达

时间:2013-07-17 21:02:49

标签: expression grammar bison flex-lexer

您好我正在尝试为某种语言创建解析器。

但是当我输出这样的逻辑表达式时,解析器会返回一个错误:X> 5进入if表达式。

例如,如果我发表此声明:if (x>5) a=3; 然后解析器返回错误条件x> 5。

我正在尝试修复问题而没有结果。 我是flex / bison的新手。

任何帮助;

这是flex文件:

`.....

"!"             {return NOT;}

"+" | "-"       {return MONAD_OPERATOR;}

"*" | "/" | "%"     {return DIAD_OPERATOR;}

"==" | "!=" | ">" | "<" | ">=" | "<="   {return SXES_OPERATOR;}

...`

这是野牛档案:

...

    if_statement : IF '(' logic_expression ')' statement NEWLINE
                 | IF '(' logic_expression ')' statement ELSE statement NEWLINE
                 ;  ;
    logic_expression : 
        logic_expression sxes_operator logic_expression
        | ID
        | NUM
        | logic_expression diad_operator logic_expression
        | '(' logic_expression ')'
        | NOT logic_expression
        | logic_expression log_operator logic_expression
        ;

monad_operator : MONAD_OPERATOR ; 
diad_operator : DIAD_OPERATOR ;
sxes_operator : SXES_OPERATOR ;

1 个答案:

答案 0 :(得分:0)

(评论中回答了这个问题。见Question with no answers, but issue solved in the comments (or extended in chat)

@rici注意到语法有转移 - 减少冲突:

  

大多数情况下,解析器会做一些合理的事情   转移 - 减少冲突。但它可能不是你所期望的那样,   是的,你应该修复它们。有时你得到意想不到的语法   错误,特别是如果你有减少 - 减少冲突。

     

语法含糊不清,因此会有冲突。我不知道怎么做   很多,但我怀疑很多。另外,我避免使用不必要的   可以作为终端的非终端(diad_operator)   (DYAD_OPERATOR)。这里含糊不清:a < 3 + 4你的语法允许   [[[a] < [3]] + [4]][[a] < [[3] + [4]]]都作为解析(使用   [...]表示logic_expression

@Grijesh Chauhan总结道:

  

"!="">=""<="之前定义了"!""<"">"的规则。   另外,我更喜欢[]而不是""