【问题标题】:PLY yacc parsing IF-ELSE IF-ELSE nested statementsPLY yacc 解析 IF-ELSE IF-ELSE 嵌套语句
【发布时间】:2012-07-13 01:24:38
【问题描述】:

有人可以帮助我为嵌套 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_OPENRULE_CLOSE标记, "IF" 是IF 令牌, "END" 是END 令牌, “ELSE”是ELSE 令牌, “条件”是CONDITION 令牌。

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

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

不管我怎么努力。我总是遇到 shift/reduce 冲突,并且解析器不接受正确的输入。

尽管如此,我已经成功编写了没有 else-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 : 

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

【问题讨论】:

    标签: python parsing yacc ply


    【解决方案1】:

    通常,对于具有可选 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
               ;
    

    【讨论】:

    • 非常感谢您的回答和资源链接。这对我帮助很大。
    • 如何只使用空格来嵌入代码块:例如if expression \n return this \n else \n return that
    • @StevePeak 我想你可能想查看这个链接stackoverflow.com/questions/9420400/…
    猜你喜欢
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    相关资源
    最近更新 更多