2012-07-12 146 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