2013-01-08 61 views
2

您好,我正在嘗試實現一個翻譯器。 既然它變得越來越複雜,我會試着更好地解釋我想要實現的。ANTLR + StringTemplate - 創建JavaLike語言並將其轉換爲PLSql,C和C++

我需要指定一個新的java like語言。 該語言必須實現java方法的所有結構:變量聲明,表達式,條件表達式,括號表達式等...... 該語言將與向量,常量和布爾值一起使用。 它有不同的功能:log,avg,sqrt與sum,diff,shift等一樣。 該語言必須翻譯成plsql和其他語言。所以定義的方法將成爲一個StoredProcedure或C++函數或其他。 我還需要考慮運算符優先級等數學約束條件(+, - ,*,/,< <,...等等)。

我已經得到這樣的提示:Decompose expression in base operation: ANTLR + StringTemplate

我需要知道實現我的任務最好的解決方案。我想我必須以流水線方式使用所有解決方案,但我不想使用試驗和錯誤方法來解決問題。

我嘗試了不同的(分離的)解決方案,但整合在一起對我來說很難。

我最後的問題是分離矢量和常量之間的表達式和矢量和矢量之間的表達式。實際上使用plsql我有不同的功能來處理這些情況。即表達式vactor1 + 5(或5 + vector1)必須像PKG_FUN.constant_sum(cursor1,5)一樣被翻譯,而不是vector1 + vector2必須翻譯爲PKG_FUN.vector_sum(vector1,vector2)。此外,我可以有產生向量的函數或表達式,以及產生常量的其他函數或表達式,這在分析表達式(即向量a =向量1 +((5 + var2)* ln(向量2)* 2)^ 2)時必須考慮。

這種語言的一個例子可以是:

DEFINE my_new_method(date date_from, date date_to, long variable1, long variable2){ 
    vector result; 
    vector out1; 
    vector out2; 
    int max = -5+(4);  

    out1 = GET(date_from, date_to, variable1, 20); 
    out2 = GET(date_from, date_to, variable2); 

    if(avg(out1) > max) 
    { 
     result = sqrt(ln(out2) + max)*4; 
    }else 
    { 
     result = out1 + ln(out1) + avg(out2); 
    } 

     for(int i=0; i<result.length ; i++) 
     { 
      int num = result.get(i); 
      result.set(num*5, i); 
     } 

     return result; 

} 

我應該在PLSQL,C或C++或其他語言它翻譯。

任何幫助,將不勝感激。

+0

對於像這樣的論壇來說,這是個大問題。請閱讀[常見問題](http://stackoverflow.com/faq)關於您[可](http://stackoverflow.com/faq#questions)和[不應該]的問題(http:// stackoverflow.com/faq#dontask)問。 –

+0

你好,我只需要知道如何擴展答案:http://stackoverflow.com/questions/13817046/decompose-expression-in-base-operation-antlr-stringtemplate/14198140#comment19695920_14198140處理矢量常量表達和矢量 - 矢量表達式以便以不同的方式對它們進行轉換。此外,我想知道,如果ANTLR + StringTemplate是實現我想要做的最好的方法。 –

回答

1

你需要的是「類型推斷」。對於每個表達式,您需要知道其操作數的類型以及每個運算符符號的結果類型。

您可以通過幾個步驟獲得此:

1)通過構建一個記錄申報實體的類型在變量的作用域符號表通過走各的表情,計算類型的

2)葉節點:對於表達式,在您的語言中,至少所有常量值都是標量,任何標識符都有類型,您可以在符號表中查找。對於大多數語言,運算符結果的類型可以根據運算符的語言規則計算,並給定其操作數類型。 (某些語言需要通過約束傳播計算的類型)。計算了所有這些類型後,您需要將每個樹節點與其類型相關聯(或者至少能夠按需計算節點的類型)。使用此計算的類型信息,可以區分不同的運算符(例如,向量上的+,向量的第一個操作數和標量的第二個等),並選擇要生成的目標語言結構。

除了爲您提供樹之外,ANTLR不會爲構建和管理符號表或計算類型信息提供任何支持。一旦你有樹和所有類型的信息,你可以選擇使用哪個字符串模板來生成代碼,給你和即時風格的翻譯。所以這樣做只是很多汗水。 (做一個動態翻譯有一個缺點:你最好在那個地方生成你想要的確切代碼,因爲你沒有機會優化生成的結果,這可能意味着對樹的巨大案例分析選擇什麼生成)。

我們的DMS Software Reengineering Toolkit確實爲您提供了額外的支持,用於構建符號表,以及使用屬性語法評估器計算對樹的推理,以及用於編寫顯式轉換的其他方法,這些方法很容易根據此類查找進行。轉換從源語言的樹映射到目標語言的樹。然後,您可以「更簡單」地翻譯成目標語言,並使用額外的顯式變換在目標語言中應用優化。這可以大大簡化翻譯過程。

但無論如何,爲一種語言(更不用說3)建立一個完整的翻譯是很多工作,對於那些有經驗和背景的人來說。你提出這個問題的事實表明你可能不瞭解許多與分析和轉換代碼有關的問題。我建議你在繼續之前閱讀一本好的編譯器書(例如,Aho/Ullman/Sethi「Compilers」),否則你可能會遇到類似的其他問題。