通用编程语言如何解析中缀表达式?
Posted
技术标签:
【中文标题】通用编程语言如何解析中缀表达式?【英文标题】:How do general programming languages parse infix expressions? 【发布时间】:2018-12-24 23:43:20 【问题描述】:我最近在阅读有关数据结构的文档时遇到了这个问题。
“处理中缀符号的算法在时间和空间消耗方面可能是困难且昂贵的”。
算术表达式可以用前缀表示法或后缀表示法编写,而不会改变表达式的本质或输出。 我的担忧是:
对于给定的表达式,在处理中缀表示法与前缀或后缀表示法的表达式时,内存空间和处理时间是否有显着差异?
通用编程语言如何处理中缀表达式?
我。他们是直接按原样处理它们,还是
二。他们是否在处理它们之前首先将它们转换为后缀/前缀表示法,如果是这样,为什么不能直接访问此转换功能以使人们能够直接运行后缀和前缀表示法?
附注: 我尝试在 google chrome 的 v8 javascript 控制台上为简单的算术表达式 a + b 运行前缀/后缀表示法,首先将变量 a 和 b 分配给整数值,然后将它们作为 ab+ 和 +ab 运行,我最终分别得到 SyntaxError 和 ReferenceError 。我想知道引擎是否在显示结果之前对表达式进行了自己的转换(在解释级别)。
【问题讨论】:
我认为最终它们被解析为 AST ......所以没有太大区别。但不太确定。 Shunting yard algorithm,或they get the developer to do it for them。更一般地说,大多数计算机上的处理器足够强大,前缀与后缀的成本无关紧要——这是“重新打最后一场战争”的情况。ab+
和 -ab
也不是有效的 Java 表达式。
@bob jarvis 我一定是被整个话题所吸引而忽略了基本的语法规则。此外,在处理涉及具有不同优先级和关联性的运算符作为中缀或前缀/后缀的复杂表达式时,会有什么不同吗?
将中缀表达式转换为前或后缀是编程语言中的一个常见问题,但老实说这并不难。调车场算法是一个非常基本的算法,它是一个常见的新生编程任务 - 我在 40 多年前在 IBM 370 汇编器中完成了它。同样,处理不同的操作员优先级等也不是一个难题。我建议你看看它(上面的链接)。祝你好运。
【参考方案1】:
1) 处理后缀表达式实际上比处理中缀表达式更快并且使用更少的内存,但这种差异并不显着。所需的代码也简单得多,但这通常也不重要。一般来说,如果有人正在为一门新语言编写编译器或解释器,那么他们应该能够有效地处理中缀表达式,并且该语言的语法应该被设计为使其尽可能有用,而不是让它尽可能容易编译或解释。
2) 编程语言解释器 可以直接处理中缀表达式。然而,所有编译器和大多数解释器都会将表达式和语句翻译成另一种根本不是表达式的形式,因为它不是文本。有时这是一个中间表示(IR),可以再次翻译成机器代码。中间表示可以是基于堆栈的、SSA 或其他的。同样,这不是文本,因此它没有表达式,也不需要解析。
https://en.wikipedia.org/wiki/Intermediate_representation https://en.wikipedia.org/wiki/Static_single_assignment_form
【讨论】:
以上是关于通用编程语言如何解析中缀表达式?的主要内容,如果未能解决你的问题,请参考以下文章
《C#零基础入门之百识百例》(八十五)系统类Stack栈解析 -- 简单中缀表达式转后缀表达式