使用Python对求和运算符和有符号整数进行词法分析
如何构建原始表达式来区分求和运算符和有符号整数?我正在使用Python 不幸的是,这不起作用:使用Python对求和运算符和有符号整数进行词法分析,python,regex,lexer,ply,Python,Regex,Lexer,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) 并定义语法: n
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-z]
是一元数,+[a-z]
是二进制数(我们还列出了-+
,*+
等用于检测一元数)
然后又出现了另一个问题:外围也将附加到令牌。在这个例子中:它将是
[a]
和[++b]
,而不是[a]
,[++]
和[+b]
,这里有一个提示(-ish),加号是一元运算符。加法是一个二进制运算符。谢谢你的提示,但我还是不知道怎么做。
a ++ b // binary +, unary +