0
我正在使用Python PLY解析特定語言。對於像語法:YACC:停止解析特定路徑
IF LPAREN condition RPAREN LBRACE stmtlist RBRACE ELSE LBRACE stmtlist RBRACE
當我知道condition
值,說真,那麼有沒有辦法阻止在ELSE
路徑解析stmtlist
?
感謝,
我正在使用Python PLY解析特定語言。對於像語法:YACC:停止解析特定路徑
IF LPAREN condition RPAREN LBRACE stmtlist RBRACE ELSE LBRACE stmtlist RBRACE
當我知道condition
值,說真,那麼有沒有辦法阻止在ELSE
路徑解析stmtlist
?
感謝,
你將不得不繼續解析,因爲你需要找到第二RBRACE
包圍的塊的結束;換句話說,你需要解析才能找到下一個語句的開始。
這就是說,當你分析結果解析的(生成代碼,構建一個AST,無論你需要做的),如果你能確定condition
始終計算爲true
(也許是表達1 = 1
),那麼你可以禁止生成第二個stmtlist
的代碼。
更新:
你的語法(在語法語言的)被指定的非程序化,所以沒有地方給你附加條件邏輯。
另一方面,您指定語義當您的語法的特定語法元素匹配時採取的操作,並且您在程序上執行此操作。在PLY中,您通過編碼語法規則函數的主體來完成此操作。在與第二個stmtlist
匹配的語法規則函數中,您可以根據您已經計算出的有關輸入程序(編譯語言處理器的輸入)的其他信息編寫條件代碼以跳過代碼生成。
但是我們該如何抑制它呢?我只是不知道該怎麼做。 –
如果你要顯示完整的'yacc.py'文件,這可能會有所幫助。 –
嗨大衛,我在這裏粘貼yacc http://pastebin.com/wRnuNaWD。我使用'names'字典來存儲解析過程中的所有變量值。當解析到達'ifelse'路徑時,我可能知道'condition'值(在我的代碼中''coreopnd'')。但是,我想因爲我的數據結構,當我想忽略if或else的語義路徑時,我給自己一個難題。你有什麼建議嗎? –