2012-07-12 186 views
3

有人可以帮我编写嵌套if语句的正确语法规则吗? 在我的语言,我能写出结构是这样的:PLY yacc解析IF-ELSE IF-ELSE嵌套语句

(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”是CONDITION令牌。

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

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

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

尽管如此,我已经成功编写了规则。当我为else添加规则时,如果代码对我来说开始变得非常复杂。

下面是我sucessfull方法没有别的,如果部分(我只列出了相关的规则):

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 : 

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

回答

4

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

非常感谢您的回答和资源链接。这对我帮助很大。 – JoshuaBoshi 2012-07-16 10:38:40

+0

你将如何实现这一点,只使用空格来嵌入代码块:例如'''如果表达式\ n返回这个\ n其他\ n返回那个''' – 2013-12-10 02:33:30

+0

@StevePeak我想你可能想检查这个链接http:/ /stackoverflow.com/questions/9420400/python-parser-for-python-like-language – JoshuaBoshi 2013-12-11 15:24:18