没有线路终结器的调车场 - 如何根据运营商数量停止?
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 *"
前四种情况已经有效,那么后三种呢?
从示例中可以明显看出,当您看到两个连续的操作数时,表达式就终止了。 (假设栈上没有括号。如果发现括号内有两个连续的操作数,则语法错误。)
此处的操作数是:
一个标识符
文字常量
左括号(
一般来说,当你将一个代数表达式划分为标记时,你可以处于两种状态之一'
需要一个操作数。
等待接线员。
这些状态交替出现,括号除外。看到一个操作数后,您需要一个运算符;看到运算符后,您需要一个操作数。但是,括号不会改变状态。等操作数时只能看到(,之后还是等操作数。同理,等操作数时只能看到)正在使用期待操作员,之后您仍然期待操作员。
这个简单的状态机还可以让您处理一元运算符:如果您需要一个运算符,则 - 是一个二元运算符;如果您需要一个操作数,则它是一个一元运算符。
状态机在"expecting an operand"状态下启动,在"expecting an operator"状态下只能接受输入结束
这是一个关于扩展非常基本的 调车场 表达式解析器的问题。
我有一种语言,其表达式由数字文字、字母数字变量名称、运算符“+”、“*”和“-”组成,具有一些元数、关联性和优先级以及括号。但是语言中还有其他语句,语言没有行终止符。
当运算符的元数已知时,停止解析或发出错误信号的正确方法是什么?
示例:
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 *"
前四种情况已经有效,那么后三种呢?
从示例中可以明显看出,当您看到两个连续的操作数时,表达式就终止了。 (假设栈上没有括号。如果发现括号内有两个连续的操作数,则语法错误。)
此处的操作数是:
一个标识符
文字常量
左括号(
一般来说,当你将一个代数表达式划分为标记时,你可以处于两种状态之一'
需要一个操作数。
等待接线员。
这些状态交替出现,括号除外。看到一个操作数后,您需要一个运算符;看到运算符后,您需要一个操作数。但是,括号不会改变状态。等操作数时只能看到(,之后还是等操作数。同理,等操作数时只能看到)正在使用期待操作员,之后您仍然期待操作员。
这个简单的状态机还可以让您处理一元运算符:如果您需要一个运算符,则 - 是一个二元运算符;如果您需要一个操作数,则它是一个一元运算符。
状态机在"expecting an operand"状态下启动,在"expecting an operator"状态下只能接受输入结束