首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PLY yacc解析IF-ELSE IF-ELSE嵌套语句

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

Stack Overflow用户
提问于 2012-07-13 00:35:59
回答 1查看 5K关注 0票数 4

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

代码语言:javascript
复制
(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“是CONDITION标记。

假设“某些语句”可以是我的语言中允许的任何内容(就像在公共编程语言中一样)。可以无限嵌套IF语句,这一点很重要。

希望这是清楚的,如果我解释得不好,请让我知道。

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

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

下面是我成功的完整方法,没有使用else-if部分(我只列出了相关规则):

代码语言:javascript
复制
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 : 

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-13 01:24:39

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

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

代码语言:javascript
复制
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 
              ;

作为对风格的附带说明:大多数实践者一致地将所有替代方案与管道结合在一起,就像您使用管道所做的那样

代码语言:javascript
复制
statement : code
          | data_out
          | rule
          ;

读起来令人困惑:

代码语言:javascript
复制
statements : statement
           ;

statements : statements statement
           ;

大多数人更喜欢:

代码语言:javascript
复制
statements : statement
           | statements statement
           ;
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11456495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档