我正在写一个javascript语言的编译器来获得乐趣。又名我正在学习轮子,所以我为自己做了一件事,试图找出一切,但现在我陷入了困境。如何将方法调用转换为后缀表示法?
我知道,调度场算法是一个很好的一个简单的解析表达式中缀时。我能够弄清楚如何为前缀和后缀运算符扩展这种算法,并且能够解析简单的函数。
例如:2+3*a(3,5)+b(3,5)
变成2 3 <G> 3 5 a() * + <G> 3 5 b() +
(<G>
是压入堆栈它将存储返回地址等()
保护令牌是在堆栈的顶部调用该函数的调用命令那个弹出的参数的必要量和推回在返回的结果。)
如果函数名字只是一个符号,我可以简单地把它标记为函数符号,如果直接跟着一个括号。在这个过程中,如果我遇到一个函数符号,我将它推到运算符堆栈上,并在完成参数转换后弹出。
这工作到目前为止。
但是,如果我添加的选项有成员函数,该.
运营商。事情变得更加棘手。例如,我想转换a.b.c(12)+d.e.f(34)
我不能将c和f标记为功能,因为a.b.c
和d.e.f
是函数。如果我在像这样的表达式上启动解析器,结果将是a b . <G> 12 c() . d e . <G> 34 f() .
这显然是错误的。我希望它是<G> 12 a b . c .() <G> 34 d e . f.()
看起来正确。 但是,如果我添加一些括号,可以使事情更加复杂:(a.b.c)()
。或者我创建一个函数,返回一个我再次调用的函数:f(a,b)(c,d)
。
有没有简单的方法来处理这些棘手的情况?
'.'与'+'一样是一个操作符。 – delnan 2011-01-14 16:50:20
@delnan是对的。我们应该像普通的操作员那样对待点。 – mahdix 2017-12-04 10:37:25