2013-03-24 45 views
2

我想用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代碼相關的語法產生的動作):

  1. 什麼是「評價」的任務。我的意思是,考慮到表達式的值在循環的每一步都可能發生變化,我該如何評估每個循環的表達式?
  2. '執行'的任務是什麼。我的意思是,考慮到每個語句在循環的每個步驟都有不同的結果,我如何評估for循環中的語句。

這三個表達式'expr'的值在運行時發生變化,對於for內部的語句也是如此。

+0

那麼,你是如何處理你的任何其他陳述? for的結構有點扭曲,但是你應該可以重複使用已有的語言。 (那個'else'塊在那裏沒有'if'?) – Mat 2013-03-24 15:16:39

+0

長城說實話我沒有其他的東西了。我確實有涉及數學運算,可變分配和符號表的表達式來存儲失步變量。我修復了其他的東西。我的想法是從此開始,因爲do ... while和while語句是相似的,if也是類似的,因爲它就像是一個while循環執行一次。 – salvo 2013-03-24 15:24:34

+1

那麼恐怕你的問題對於堆棧溢出來說太廣泛了。有整本書專門編寫編譯器/口譯員,這是有挑戰性的(但我​​聽說很教育)。你應該從最簡單的事情開始,而不是最複雜的事情。 (即開始使用普通的'if',然後添加'else',然後可能'while')。在這裏你會發現許多資源(例如,通過這個:http://stackoverflow.com/questions/453870/suggestions -for-writing-a-programming-language) – Mat 2013-03-24 15:33:12

回答

2

看着你的兩個問題,你似乎錯過了一個執行引擎(一種軟件CPU)是需要的。這個引擎需要記住變量的狀態,返回循環的地址,......(取決於所選擇的實現方法)。

所以解析只是第一步。考慮爲每個語句和表達式創建一個數據結構,並由這個引擎執行這些結構。

看一看stack-based systems