Jos*_*shi 3 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)
我写词法器时,左右括号分别是RULE_OPEN和RULE_CLOSE标记,“ IF”是IF标记,“ END”是END标记,“ ELSE”是ELSE标记,“ CONDITION”是CONDITION标记。
假设“某些语句”可能是我的语言(例如通用编程语言)所允许的任何内容。重要的是,可能无限嵌套嵌套IF语句。
希望这很清楚,如果我解释不好,请告诉我。
无论我如何尝试。我总是遇到shift / reduce冲突,而且解析器不接受正确的输入。
即使,我已经成功编写了没有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 : 
我认为这是解析中非常常见的问题,我希望这里的人已经解决了这个问题:-)感谢您的帮助!
通常,对于具有可选ELSE子句的语言,可以容忍单个shift-reduce冲突。皮特·金克斯(Pete Jinks)提供了两种可以解决冲突的替代方案。
指定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
           ;