【问题标题】:Vala - Equation parsingVala - 方程解析
【发布时间】:2016-03-23 06:51:40
【问题描述】:

我正在尝试了解一些有关 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 不容易提供的完整表达式解析器。
  • GNOME Calculator 是用 Vala 编写的,如果这是一个有用的参考的话。

标签: parsing math string-parsing vala


【解决方案1】:

这是我发现的可以完成工作的东西。我使用了 C++ libmatheval 库,为此我首先需要一个 vapi 文件将其绑定到 Vala。我找到了here。在名为vala-extra-apis 的项目下有很多可用的 vapi 文件,它们在 GNOME 的 Vala List of Bindings 中被识别,尽管它们在安装时不包括在内。

【讨论】:

    【解决方案2】:

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

    compiler createsCodeContext 并在一个(或多个).vala 文件上运行 Vala 解析器。

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

    据我所知,目前还没有表达式评估器可以做到这一点。这是因为通常 vala 代码会被翻译成 C 代码,然后 C 编译器会执行编译时表达式评估,或者完成的可执行文件会执行运行时评估。

    Python 不同,因为它主要是一种脚本语言,并且在运行时/解释器中直接构建了评估。

    【讨论】:

    • 我找到了一种通过 vapi 文件绑定 C++ matheval 库的方法,但您能否进一步解释一下 CodeContext 和 CodeVisitor 类?
    • 你想知道什么?请注意,stackoverflow 不是讨论论坛。如果您还有其他具体问题,请继续提出新问题。
    • 如果你对编译器的工作原理感兴趣,我建议你研究一下vala源代码:git.gnome.org/browse/vala/tree Hacking Vala页面上也有一些信息:wiki.gnome.org/Projects/Vala/Hacking
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 2011-05-16
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多