Parsing 无线路终端的调车场-如何根据操作员的熟练程度停止?

Parsing 无线路终端的调车场-如何根据操作员的熟练程度停止?,parsing,operators,expression,shunting-yard,Parsing,Operators,Expression,Shunting Yard,这是一个关于扩展非常基本的调车场表达式解析器的问题 我有一种语言,它的表达式由数字文字、字母数字变量名、运算符“+”、“*”和“-”以及一些算术、关联性和优先级以及括号组成。但是该语言中还有其他语句,并且该语言没有行终止字符 当运算符的算术已知时,停止解析或发出错误信号的正确方法是什么 示例: 10 ==> 10 10+20*30 ==> 10 20 30 * + (10+20)*30 ==> 10 20 + 30 * a+b ==> a b + 10 a ==>

这是一个关于扩展非常基本的调车场表达式解析器的问题

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

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

示例:

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

前四种情况已经起作用了,那么后三种情况如何?

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

这里的操作数是:

  • 标识符

  • 文字常数

  • 开括号(

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

  • 应为操作数

  • 正在等接线员

  • 除括号外,这些状态是交替的。看到操作数后,需要一个运算符;看到运算符后,需要一个操作数。但是,括号不会改变状态。只能看到a(当需要一个操作数时;之后,仍然需要一个操作数。类似地,只能看到a)当您使用expecting运算符时,之后仍然使用expecting运算符

    这个简单的状态机还允许您处理一元运算符:如果需要运算符,则a-为二元运算符;如果需要操作数,则为一元运算符

    状态机在“预期操作数”状态下启动,并且只能接受“预期运算符”状态下的输入结束