我想用flex和bison編寫我自己的腳本語言。我有一個基本的解析器,我想添加一個for語句非常類似於C語言的語句。這是我不清楚如何編寫關聯到for語句的作用對於在Bison/Yacc中的循環語義
假設我有以下自產「的」聲明:
forStatement: FOR '(' expr ';' expr ';' expr ')' statements END; {}
這是我不太清楚該怎麼做與此生產相關的行動。
直覺我知道我應該做的事情,在關聯到前面的語句的動作,如:
evaluate($3);
while(evaluate($5)) { execute($9); evaluate($7); }
evaluate($7);
,其中評估和執行是兩個C函數。
所以我有兩個問題(假設編寫C代碼相關的語法產生的動作):
- 什麼是「評價」的任務。我的意思是,考慮到表達式的值在循環的每一步都可能發生變化,我該如何評估每個循環的表達式?
- '執行'的任務是什麼。我的意思是,考慮到每個語句在循環的每個步驟都有不同的結果,我如何評估for循環中的語句。
這三個表達式'expr'的值在運行時發生變化,對於for內部的語句也是如此。
那麼,你是如何處理你的任何其他陳述? for的結構有點扭曲,但是你應該可以重複使用已有的語言。 (那個'else'塊在那裏沒有'if'?) – Mat 2013-03-24 15:16:39
長城說實話我沒有其他的東西了。我確實有涉及數學運算,可變分配和符號表的表達式來存儲失步變量。我修復了其他的東西。我的想法是從此開始,因爲do ... while和while語句是相似的,if也是類似的,因爲它就像是一個while循環執行一次。 – salvo 2013-03-24 15:24:34
那麼恐怕你的問題對於堆棧溢出來說太廣泛了。有整本書專門編寫編譯器/口譯員,這是有挑戰性的(但我聽說很教育)。你應該從最簡單的事情開始,而不是最複雜的事情。 (即開始使用普通的'if',然後添加'else',然後可能'while')。在這裏你會發現許多資源(例如,通過這個:http://stackoverflow.com/questions/453870/suggestions -for-writing-a-programming-language) – Mat 2013-03-24 15:33:12