PLY yacc解析IF-ELSE IF-ELSE嵌套语句

时间:2012-07-12 16:35:59

标签: python parsing yacc ply

有人可以帮我编写嵌套if语句的正确语法规则吗? 用我的语言,我能够写出这样的结构:

(IF CONDITION)
    some statements
    (IF CONDITION)
        some statements 
    (ELSE IF CONDITION) 
        some statements
    (ELSE IF CONDITION) 
        some statements
    (ELSE IF CONDITION) 
        some statements 
    (ELSE) 
        some statements
    (END) 
    some statements 
(ELSE IF CONDITION) 
    some statements 
(ELSE) 
    some statements 
(END)

我写了lexer所以左右括号是RULE_OPENRULE_CLOSE代币, “IF”是IF令牌, “END”是END令牌, “ELSE”是ELSE令牌, “条件”是CONDITION令牌。

假设“某些陈述”可能是我的语言允许的任何内容(例如在通用编程语言中)。重要的是可以无限地嵌套IF语句。

希望这很清楚,如果我解释得很糟,请告诉我。

无论我如何努力。我总是得到转换/减少冲突,解析器不接受正确的输入。

尽管如此,我已经成功地编写了规则而没有使用else-if。当我为else-if添加规则时,代码对我来说开始变得非常复杂。

下面是我的成功方法,没有其他 - 如果部分(我只列出相关规则):

statements: statement

statements: statements statement

statement: code
| data_out
| rule

rule: inline_if_statement
| block_if_statement

block_if_statement: RULE_OPEN IF CONDITION RULE_CLOSE statements RULE_OPEN END RULE_CLOSE

block_if_statement: RULE_OPEN IF CONDITION  RULE_CLOSE statements block_else_statement

block_else_statement: RULE_OPEN ELSE RULE_CLOSE statements RULE_OPEN END RULE_CLOSE 

block_else_statement: empty

empty : 

我认为这是解析中非常常见的问题,我希望这里有人已经解决了它:-) 谢谢你的帮助!

1 个答案:

答案 0 :(得分:5)

通常,可以容忍具有可选ELSE子句的语言的单个shift-reduce冲突。 Pete Jinks提供了几个alternative formulations that can resolve the conflict

指定ELSE-IF结构的策略:将其视为任何其他递归定义的重复块:

running_else_if_statement : RULE_OPEN IF CONDITION RULE_CLOSE statements else_if_blocks
    RULE_OPEN ELSE RULE_CLOSE statements RULE_OPEN END RULE_CLOSE
                          ;

else_if_blocks : else_if_block
               | else_if_blocks else_if_block
               ;

else_if_block : RULE_OPEN ELSE_IF CONDITION RULE_CLOSE statements 
              ;

作为关于风格的旁注:大多数从业者始终将生产的所有替代品与管道结合起来,就像你完成的那样

statement : code
          | data_out
          | rule
          ;

令人困惑的是:

statements : statement
           ;

statements : statements statement
           ;

最喜欢:

statements : statement
           | statements statement
           ;