【问题标题】:Shunting yard without line terminator - how to stop based on operator arity?没有线路终结器的调车场 - 如何根据操作员数量停止?
【发布时间】:2018-04-12 14:28:04
【问题描述】:

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

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

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

例子:

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

前四个案例已经奏效,那么后三个呢?

【问题讨论】:

    标签: parsing operators expression shunting-yard


    【解决方案1】:

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

    这里的操作数是:

    • 标识符

    • 文字常量

    • 开括号(

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

    1. 期待一个操作数。

    2. 期待一个操作员。

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

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

    状态机以“期望操作数”状态开始,并且只能在“期望操作数”状态下接受输入结束。

    【讨论】:

      猜你喜欢
      • 2013-04-29
      • 2022-07-04
      • 2021-07-31
      • 2018-04-02
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多