【发布时间】:2019-01-26 22:29:17
【问题描述】:
这是我的情况:输入是一个字符串,其中包含一个普通的数学运算,例如5+3*4。函数也是可能的,即min(5,A*2)。这个字符串已经被标记化了,现在我想使用堆栈来解析它(所以没有 AST)。我首先使用了调车场算法,但这里出现了我的主要问题:
假设你有这个(标记化的)字符串:min(1,2,3,+),这显然是无效的语法。但是,SYA 将其转换为输出堆栈1 2 3 + min(,希望您能看到问题的出现。从左到右解析时,它首先看到+,计算2+3=5,然后计算min(1,5),结果为1。因此,我的算法说这个表达式完全没问题,但它应该抛出一个语法错误(或类似的东西)。
防止此类事情发生的最佳方法是什么?添加一个特殊的分隔符(例如逗号),使用不同的算法,还是什么?
【问题讨论】:
-
Shunting-Yard 解析器的伪代码可以理解this answer 中的函数调用。请注意,当伪代码告诉您“将
(标记为后缀运算符”时,这意味着您需要将其视为函数调用。
标签: algorithm function parsing expression