没有线路终结器的调车场 - 如何根据操作员的意愿停车?

时间:2018-04-12 14:28:04

标签: parsing operators expression shunting-yard

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

我的语言包含数字文字,字母数字变量名称,运算符“+”,“*”和“ - ”,其中包含一些arity,associativity和priority,以及括号。但是语言中还有其他语句,语言没有行终止字符。

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

示例:

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 *"

前四个案例已经有效,现在最后三个案例呢?

1 个答案:

答案 0 :(得分:1)

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

这里的操作数是:

  • 标识符

  • 文字常量

  • 开括号

一般来说,当你将代数表达式划分为标记时,你可以处于两种状态之一'

  1. 期待操作数。

  2. 期待操作员。

  3. 除括号外,这些状态是交替的。看到操作数后,需要一个操作符;看到运算符后,需要一个操作数。但是,括号不会改变状态。你只能看到一个,当你期望一个操作数;之后,你仍然期待一个操作数。同样,你只能看到当你使用期望一个操作符时之后你还在期待一个接线员。

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

    状态机以“期望操作数”状态启动,并且只能接受“期望操作员”状态的输入结束。