2013-09-27 41 views
0

我正在使用Python PLY解析特定語言。對於像語法:YACC:停止解析特定路徑

IF LPAREN condition RPAREN LBRACE stmtlist RBRACE ELSE LBRACE stmtlist RBRACE 

當我知道condition值,說真,那麼有沒有辦法阻止在ELSE路徑解析stmtlist

感謝,

回答

0

你將不得不繼續解析,因爲你需要找到第二RBRACE包圍的塊的結束;換句話說,你需要解析才能找到下一個語句的開始。

這就是說,當你分析結果解析的(生成代碼,構建一個AST,無論你需要做的),如果你能確定condition始終計算爲true(也許是表達1 = 1 ),那麼你可以禁止生成第二個stmtlist的代碼。

更新:

你的語法(在語法語言的)被指定的非程序化,所以沒有地方給你附加條件邏輯。

另一方面,您指定語義當您的語法的特定語法元素匹配時採取的操作,並且您在程序上執行此操作。在PLY中,您通過編碼語法規則函數的主體來完成此操作。在與第二個stmtlist匹配的語法規則函數中,您可以根據您已經計算出的有關輸入程序(編譯語言處理器的輸入)的其他信息編寫條件代碼以跳過代碼生成。

+0

但是我們該如何抑制它呢?我只是不知道該怎麼做。 –

+0

如果你要顯示完整的'yacc.py'文件,這可能會有所幫助。 –

+0

嗨大衛,我在這裏粘貼yacc http://pastebin.com/wRnuNaWD。我使用'names'字典來存儲解析過程中的所有變量值。當解析到達'ifelse'路徑時,我可能知道'condition'值(在我的代碼中''coreopnd'')。但是,我想因爲我的數據結構,當我想忽略if或else的語義路徑時,我給自己一個難題。你有什麼建議嗎? –