这是关于扩展一个非常基本的 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 *"
前四个案例已经有效,现在最后三个案例呢?
答案 0 :(得分:1)
从示例中可以明显看出,当您看到两个连续的操作数时,表达式终止。 (假设堆栈中没有括号。如果在括号内找到两个连续的操作数,则会出现语法错误。)
这里的操作数是:
标识符
文字常量
开括号(
一般来说,当你将代数表达式划分为标记时,你可以处于两种状态之一'
期待操作数。
期待操作员。
除括号外,这些状态是交替的。看到操作数后,需要一个操作符;看到运算符后,需要一个操作数。但是,括号不会改变状态。你只能看到一个(,当你期望一个操作数;之后,你仍然期待一个操作数。同样,你只能看到)当你使用期望一个操作符时之后你还在期待一个接线员。
这个简单的状态机还允许你处理一元运算符:如果你期望一个操作符,那么 - 是一个二元运算符,如果你期望一个操作数,那么它是一元运算符。
状态机以“期望操作数”状态启动,并且只能接受“期望操作员”状态的输入结束。