如何构建原始表达式以区分求和运算符和有符号整数?我正在使用 PLY Python。
不幸的是,这没有用:
t_sum=r'\+'
def t_integer(token):
r'[-+]?\d+'
考虑这一点的一种方法是,而不是试图区分词法分析的目的,而是+
等到解析(我们确定含义)。所以保持:
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 中所见)。
如果您可以通过其周围环境检测一元运算符(仅当您的语言足够简单以列出所有情况时才适用):
a ++ b // binary +, unary +
所以我们说它++[a-z]
是一元的,并且+[a-z]
是二元的(我们列出-+
等*+
来检测一元)。
然后又出现了另一个问题:surrundings 也会附加到 token 上。在示例中:它将是[a]
and [++b]
,而不是[a]
, [+]
and [+b]
。