2

如何构建原始表达式以区分求和运算符和有符号整数?我正在使用 PLY Python。

不幸的是,这没有用:

t_sum=r'\+'
def t_integer(token):
    r'[-+]?\d+'
4

2 回答 2

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 中所见)

于 2012-09-16T23:30:38.157 回答
0

如果您可以通过其周围环境检测一元运算符(仅当您的语言足够简单以列出所有情况时才适用):

a ++ b  // binary +, unary +

所以我们说它++[a-z]是一元的,并且+[a-z]是二元的(我们列出-+*+来检测一元)。

然后又出现了另一个问题:surrundings 也会附加到 token 上。在示例中:它将是[a]and [++b],而不是[a], [+]and [+b]

于 2020-11-06T18:45:13.723 回答