ExpressionParser

ExpressionParser 包解析和评估数学表达式,并生成 LaTeX 翻译和评估结果。

例如,以下

let e = ExpressionParser("(-b+sqrt(b^2-4a*c))/2a")
Ident.addSymbol(("a", 1))
Ident.addSymbol(("b", -3))
Ident.addSymbol(("c", -4))
if let b = e.parse() {
    print(b)
}

产生如下输出:

("\\frac{-{b}+\\sqrt{{b}^{2}-4{}{a}\\times{c}}}{2{}{a}}", 4.0)

其中 LaTeX 字符串给出以下排版方程

$\frac{-{b}+\sqrt{{b}^{2}-4{}{a}\times{c}}}{2{}{a}}$

用法

在您项目的 Package.swift 文件中添加如下依赖项

dependencies: [
    .package(url: "https://github.com/mgriebling/ExpressionParser.git", from: "0.1.0"),
]

理论

ExpressionParser 包含两个源文件,Parser.swiftScanner.swift。 它们是由 Coco 编译器 [https://github.com/mgriebling/Coco] 翻译输入 ATG (Attributed Grammar) 文件 (exp.atg) 生成的,该文件以紧凑的文本格式描述要扫描和解析的操作。 Coco 编译器生成器还需要一些 .frame 文件,代码段被插入到这些文件中以生成最终的 swift 解析器和扫描器文件。 抽象语法树表示 (AST) 是使用 AST.swift 数据类型构建的。 然后评估此树以生成 LaTeX 翻译并评估结果。 有关 Coco 的更多详细信息,请参阅 https://ssw.jku.at/Research/Projects/Coco/ 网站。