Vala - 方程解析

3

我想学习一些关于Vala的知识,并希望创建一个计算器来测试Gtk的工作方式。问题在于,我编码时所有东西都是基于这样的假设:有一种方法可以解析包含所需操作的字符串。就像这样:

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)是否可以使用字符串模板找出解决方案?

字符串模板的方法在这里行不通。你需要一个完整的表达式解析器,而 Vala 并没有提供得很方便。 - Jens Mühlenhoff
GNOME 计算器是使用 Vala 编写的,如果这是一个有用的参考。 - AlThomas
2个回答

2
我找到了一些可以完成工作的东西。我使用了C++ libmatheval库,为此我首先需要一个vapi文件将其绑定到Vala上。我在这里找到了它:这里。在名为vala-extra-apis的项目中有许多可用的vapi文件,尽管它们未被包含在安装中,但它们被认可为GNOME的Vala绑定列表中的一部分。

0

您可以使用 libvala(它是编译器的一部分)解析表达式。

编译器 创建一个 CodeContext 并在一个或多个 .vala 文件上运行 Vala 解析器。

然后,您可以创建自己的 CodeVisitor 子类,访问解析树的必要节点并评估表达式。

就我所知,还没有这样做的表达式求值器。这是因为通常 vala 代码被翻译成 C 代码,然后 C 编译器进行编译时表达式求值或完成的可执行文件进行运行时求值。

Python 不同,因为它主要是一种脚本语言,并且直接内置了运行时 / 解释器中的求值。


我通过使用vapi文件绑定C++ matheval库找到了一种方法,但您能否进一步解释CodeContext和CodeVisitor类是什么? - Alvaro Bravo
你想知道什么?请注意,stackoverflow不是一个讨论论坛。如果你有进一步的具体问题,应该直接提出一个新问题。 - Jens Mühlenhoff
如果你对编译器的工作原理感兴趣,我建议你学习Vala源代码:https://git.gnome.org/browse/vala/tree/。同时,在Hacking Vala页面上也有一些信息: https://wiki.gnome.org/Projects/Vala/Hacking - Jens Mühlenhoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接