计算算术表达式
此示例演示如何使用内置Julia解析器来分析和计算算术表达式。
导言
算术表达式的计算是将数学表达式的字符串表示转换为可以解释和计算的数据结构的过程。 它是许多软件系统的关键元素,如计算器,编译器和解释器。
此过程通常涉及两个主要步骤:
- 解析-将字符串转换为[抽象句法дерево](https://ru.wikipedia.org/wiki/Абстрактное_синтаксическое_дерево )(AST)
- 计算-遍历树并进行数学运算
这种方法用于:
-编程语言的编译器和解释器
-数学计算器
-计算机代数系统
-科学计算中的数学表达式分析
使用Julia中的表达式
Julia提供了用于处理表达式并计算它们的内置函数。 功能 Meta.parse() 将带有代码的字符串转换为类型的对象 Expr (expression),这是一个抽象的语法树。
# 用算术表达式定义字符串
expr = "2 * (3 -1) + 2 * 5"
# 将字符串转换为表达式(AST)
parsed = Meta.parse(expr) # Julia提供对语言解析器的低级访问,用于创建AST/Expr
解析后,我们得到一个类型的对象 Expr,这是一个抽象语法树(AST)。 这是一个树结构,其中每个节点对应于一个操作或操作数。
# 获取对象类型
t = typeof(parsed)
类型的对象 Expr 有字段:
:head-节点类型(例如,加法运算:+):args-节点参数(操作数)
# 查看Expr类型字段
fieldnames(t) # 显示类型的字段
我们的主要领域是 args,其中包含表达式的参数。
对于我们的表达式,第一个参数是操作符号。 :+,其余的参数是子表达式。
# 让我们来探索'Expr'对象的内部结构
parsed.args # 检查"Expr"类型的内容
如您所见,表达式可以嵌套。 我们表达式的第二个参数也是类型的对象 Expr.
# 'Expr'类型可以嵌套
typeof(parsed.args[2])
# 查看嵌套表达式的参数
parsed.args[2].args
深入树下,我们到达最基本的元素-数字和简单的操作。
# 我们继续下降到AST的最低水平
parsed.args[2].args[3].args # 它将被投资到最低的AST水平.
最后,当树构建时,我们可以使用函数计算结果 eval().
# 计算表达式
eval(parsed)
其他示例
让我们演示该算法如何在其他表达式上工作。:
# 一个更复杂的表达式与除法
eval(Meta.parse("1 - 5 * 2 / 20 + 1"))
# 具有多个括号嵌套级别的表达式
eval(Meta.parse("2 * (3 + ((5) / (7 - 11)))"))
结论
我们已经回顾了Julia中计算算术表达式的算法的实现,使用内置的语言功能来解析和计算表达式。
我们成功了:
-
将数学表达式的字符串表示形式转换为抽象语法树(AST)
-
调查生成的树的结构
-
执行表达式的计算,同时考虑到操作和括号的优先级。
这种方法对于:
-创建数学计算器
-DSL(领域特定语言)开发
-构建编译器和解释器
-科学应用中的数学表达式的分析和处理
该示例是使用[Rosetta代码]的材料开发的(https://rosettacode.org/wiki/Arithmetic_evaluation )