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

标签 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_OPENRULE_CLOSE 标记, "IF"是 IF token , "END"是 END 标记, “ELSE”是 ELSE 标记, “CONDITION”是 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 : 

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

最佳答案

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

指定 ELSE-IF 结构的策略:像对待任何其他递归定义的重复 block 一样对待它:

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
           ;

关于python - PLY yacc解析IF-ELSE IF-ELSE嵌套语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11456495/

相关文章:

python - 使用 dateutil.parser.parse 抛出两位数年份日期的 ValueError

c# - 尝试为 bison/wisent 构建 C# 语法

c - lextestpass.l :384: error: expected expression before ‘int’

c - 如何为 lex 和 yacc 中的文字指定索引值?

python - 为什么下面的正则表达式代码返回逗号 (,)

javascript - 遍历 AST 时区分运算符优先级

python - Pandas :替换字典中的完整匹配字符串

java - 如何使用 SAX 解析器解析 namespace ?

Python pyQt MVC - 将对象传递给模型类

python - 如何使用 REST 查询 sys_user 表?