Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python对求和运算符和有符号整数进行词法分析_Python_Regex_Lexer_Ply - Fatal编程技术网

使用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

如何构建原始表达式来区分求和运算符和有符号整数?我正在使用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-z]
是一元数,
+[a-z]
是二进制数(我们还列出了
-+
*+
等用于检测一元数)


然后又出现了另一个问题:外围也将附加到令牌。在这个例子中:它将是
[a]
[++b]
,而不是
[a]
[++]
[+b]

这里有一个提示(-ish),加号是一元运算符。加法是一个二进制运算符。谢谢你的提示,但我还是不知道怎么做。
a ++ b  // binary +, unary +