0

您好我正在尝试为一种语言制作解析器。

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

例如,如果我做出这样的声明:if (x>5) a=3; 那么解析器返回一个错误条件 x>5。

我正在尝试解决没有结果的问题。我是 flex/bison 的新手。

任何帮助;

这是弹性文件:

`.....

"!"             {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 ;
4

1 回答 1

0

(此问题已在评论中回答。请参阅没有答案的问题,但问题已在评论中解决(或在聊天中扩展)

@rici 指出语法有移位减少冲突:

大多数情况下,解析器会针对 shift-reduce 冲突做一些合理的事情。但这可能不是您期望的那样,所以是的,您应该修复它们。有时你会遇到意外的语法错误,尤其是当你有 reduce-reduce 冲突时。

语法有歧义,所以会有冲突。我不知道有多少,但我怀疑很多。另外,我会避免使用不必要的非终结符 ( diad_operator) 作为终结符 ( DYAD_OPERATOR)。这是一个模棱两可的地方:a < 3 + 4您的语法允许同时解析[[[a] < [3]] + [4]][[a] < [[3] + [4]]]作为解析( [...]用于表示 a logic_expression

@Grijesh Chauhan 总结道:

"!="为, ">=", "<="before "!", "<",定义了规则">"。另外我更[]喜欢""

于 2015-01-24T13:54:24.780 回答