2016-03-23 62 views
3

我想學習一點關於Vala,並想創建一個計算器來測試Gtk如何工作。問題在於我編碼的一切都圍繞假設有一種解析包含所需操作的字符串的方式。這樣的事情:Vala - 公式解析

string operation = "5+2/3*4" 

我已經完成了這與Python,它就像使用編譯器解析器一樣簡單。我知道Python是數學導向的,但我認爲也許會有Vala庫等待我作爲答案...如果它存在,我還沒有找到它,但是當我在查看字符串文檔時,我注意到了這一點部分:

/* Strings prefixed with '@' are string templates. They can evaluate 
* embedded variables and expressions prefixed with '$'. 
* Since Vala 0.7.8. 
*/ 
string name = "Dave"; 
println (@"Good morning, $name!"); 
println (@"4 + 3 = $(4 + 3)"); 

所以......我想,也許有辦法讓它工作方式,也許是這樣的:

stdout.printf(@"$(operation)") 

我明白,這不是一個準確的假設作爲它只會替代變量並需要進一步實際評估它。

現在我所遇到的兩個主要疑問是:a)是否有一個庫函數能夠做到這一點?和b)是否可以使用字符串模板來制定解決方案?

+0

字符串模板方法在這裏不會有任何好處。你需要一個Vala不容易提供的完整的表達式分析器。 –

+0

[GNOME計算器](https://git.gnome.org/browse/gnome-calculator/tree/src)是用Vala編寫的,如果這是一個有用的參考。 – AlThomas

回答

0

您可以使用libvala(它是編譯器的一部分)解析表達式。

​​a CodeContext並通過(或幾個).vala文件運行Vala語法分析程序。

然後,您可以創建自己的CodeVisitor decendant類,該類訪問分析樹的必要節點並評估表達式。

據我所見,目前還沒有表達式評估器可以做到這一點。這是因爲通常將vala代碼轉換爲C代碼,然後C編譯器會編譯時間表達式評估,或者完成的可執行文件執行運行時評估。

Python是不同的,因爲它主要是一種腳本語言,並具有直接進入運行時/解釋器的評估。

+0

我發現了一種通過vapi文件綁定C++ matheval庫的方式,但是您能否在CodeContext和CodeVisitor類上進一步解釋一下? –

+0

你想知道什麼?請注意,stackoverflow不是一個論壇。如果您有更具體的問題,您應該繼續並提出一個新問題。 –

+0

如果您對編譯器的工作方式感興趣,我建議您學習vala源代碼:https://git.gnome.org/browse/vala/tree/ Hacking Vala頁面上還有一些信息:https ://wiki.gnome.org/Projects/Vala/Hacking –

2

這是我發現會做這項工作的東西。我使用了C++ libmatheval庫,爲此我首先需要一個vapi文件將它綁定到Vala。我發現了其中的here。名爲vala-extra-apis的項目下有很多可用的vapi文件,它們在GNOME的Vala綁定列表中被識別,儘管它們在安裝時不包括在內。