2015-10-06 81 views
0

我正在嘗試使用Bison和C創建腳本語言,我想知道是否正確構建AST。這裏是我試圖創建的樹:在Bison中創建AST

+ 
└─ Steps 
    └─ Step 1 
    └─ Step 2 
    ... 
    └─ Step n 

如果還不清楚,我想要一個包含n個步驟的節點。我現在的語法看起來像這樣:

Steps:   { $$ = create_steps(); }  
    | Steps Step 
    ; 

Step: 
    IDENTIFIER StepBody { $$ = create_step($1); } 

其中StepBody被解析爲像我期望的那樣的節點。在我的代碼中,我爲create_steps();創建了一個鏈接列表,但這似乎不是實現此目的的最佳方法。

我認爲我應該有一個create_steps(node *inner_node);函數,它接受所有Step處理函數的輸出並將它們添加到數組中,但我不明白我該如何實現這一點。

我本來Steps設置像這樣的野牛:

Steps:   
     | Steps Step { $$ = create_steps($Step); } 
     ; 

當然的,但是,那個叫create_steps每次Step發現這不是我要的時間。另外,我收到了一個警告,提示「輸入非終結符的空規則,並且沒有任何行爲」,這可能不是很好。

Steps: Step   { $$ = create_steps($1); } 
     | Steps Step { $$ = create_steps($2); } 
     ; 

..然後Step被添加到您的成長樹:在Steps;

回答

1

剛剛擺脫空生產(小量)。你甚至可以通過對生長的樹是這樣的:

Steps: Step   { $$ = create_steps(NIL, $1); } 
     | Steps Step { $$ = create_steps($1, $2); } 
     ; 

這是編譯(做列表),它在大多數語法發生如此普遍。

+0

這不允許具有零步驟的「步驟」輸入。爲了做到這一點,請保留epsilon製作並讓它創建一個空列表。 –