没有线路终结器的调车场 - 如何根据运营商数量停止?

Shunting yard without line terminator - how to stop based on operator 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. 需要一个操作数。

  2. 等待接线员。

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

这个简单的状态机还可以让您处理一元运算符:如果您需要一个运算符,则 - 是一个二元运算符;如果您需要一个操作数,则它是一个一元运算符。

状态机在"expecting an operand"状态下启动,在"expecting an operator"状态下只能接受输入结束