使用PLY Python 解析求和运算符和带符号整数
我该如何构建我的表达式,以区分加法运算符和带符号的整数呢?我正在使用PLY这个Python库。
不幸的是,这个方法没有成功:
t_sum=r'\+'
def t_integer(token):
r'[-+]?\d+'
2 个回答
0
如果你能通过周围的环境来判断一元运算符(这只有在你的编程语言简单到可以列出所有情况时才成立):
a ++ b // binary +, unary +
那么我们可以说 ++[a-z]
是一元运算符,而 +[a-z]
是二元运算符(我们也会列出 -+
、*+
等来帮助识别一元运算符)。
接下来又出现了一个问题:周围的环境也会和这个符号绑定在一起。在这个例子中,它会变成 [a]
和 [++b]
,而不是 [a]
、[+]
和 [+b]
。
3
可以这样理解:与其在词法分析的时候就试图区分+
的用途,不如等到解析的时候再说(在解析时我们确定它的意思)。所以我们可以保留:
t_PLUS = r'\+'
t_MINUS = r'\-'
def t_INTEGER(token):
r'\d+'
return int(token)
然后定义一个语法规则:
number -> number PLUS number #sum, binary operator
number -> number MINUS number
number -> PLUS number #signed integer, unary operator
number -> MINUS number
number -> INTEGER
#By writing each as a parse functions like...
def p_number_ADD(p):
"number : number PLUS number"
p[0] = p[1]+p[2]
注意:这样做会允许以下行为 +-+2 = +(-(+2)) = -2
(在Python中可以看到)。