使用PLY Python 解析求和运算符和带符号整数

2 投票
2 回答
733 浏览
提问于 2025-04-17 06:52

我该如何构建我的表达式,以区分加法运算符和带符号的整数呢?我正在使用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中可以看到)

撰写回答