0

这是一个关于扩展一个非常基本的Shunting Yard表达式解析器的问题。

我有一种语言,其表达式由数字文字、字母数字变量名称、运算符“+”、“*”和“-”组成,并带有一些数量、关联性和优先级以及括号。但是该语言中还有其他语句,并且该语言没有行终止符。

当运算符的数量已知时,停止解析或发出错误信号的正确方法是什么?

例子:

10 ==> 10
10+20*30 ==> 10 20 30 * +
(10+20)*30 ==> 10 20 + 30 *
a+b ==> a b +
10 a ==> 10 ; but leave "a" unparsed
10+a 30 ==> 10 a + ; but leave "30" unparsed
10+20* ==> error "missing argument for *"

前四个案例已经奏效,那么后三个呢?

4

1 回答 1

1

从示例中可以明显看出,当您看到两个连续的操作数时,表达式终止。(假设堆栈上没有括号。如果在括号内找到两个连续的操作数,则存在语法错误。)

这里的操作数是:

  • 标识符

  • 字面常量

  • 开括号(

通常,当您将代数表达式划分为标记时,您可以处于两种状态之一

  1. 期待一个操作数。

  2. 期待运营商。

这些状态交替出现,括号除外。看到操作数后,需要操作符;在你看到一个操作符之后,你需要一个操作数。但是,括号不会改变状态。您只能(在期望操作数时看到 a ;之后,您仍然期待一个操作数。同样,您只能)在使用时看到 a,期待一个运算符,然后您仍然期待一个运算符。

这个简单的状态机还允许您处理一元运算符:-如果您期望一个运算符,a 是一个二元运算符,如果您期望一个操作数,它是一个一元运算符。

状态机以“期望操作数”状态开始,并且只能在“期望操作数”状态下接受输入结束。

于 2018-04-12T16:44:50.797 回答