我正在使用pythonSLY模块为一种玩具编程语言编写一个lexer。但我的代码无法检测到像-123e456或123.456e-789这样的指数数字。它将“e”或“e”检测为变量。如何修改我的代码,使其能够检测正整数或负整数、浮点和指数成员,如123、-123.456、-123e456、-123.456e-789等等??有人能帮我解决这个问题吗。数字模式应该是什么??这是我的密码
from sly import Lexer
class CalcLexer(Lexer):
tokens = {ID, NUMBER, PLUS, MINUS, TIMES, DIVIDE, POWER, MODULUS, ASSIGN, EQUAL, NOT_EQUAL, GREATER, GREATER_EQUAL, LESS, LESS_EQUAL, LPAREN, RPAREN}
ignore = ' \t'
# Other ignored patterns
ignore_comment = r'\#.*'
ignore_newline = r'\n+'
NUMBER = r"(?<![a-df-zA-DF-Z:])[-+]?\d*\.?\d+"
ID = r'[a-zA-Z_][a-zA-Z0-9_]*'
PLUS = r'\+'
MINUS = r'-'
TIMES = r'\*'
DIVIDE = r'/'
POWER = r'\^'
MODULAS = r'%'
NOT_EQUAL = r'!='
EQUAL = r'=='
ASSIGN = r'='
GREATER = r'>'
GREATER_EQUAL = r'>='
LESS_EQUAL = r'<='
LESS = r'<'
LPAREN= r'\('
RPAREN = r'\)'
#@_(r"(?<![a-df-zA-DF-Z:])[-+]?\d*\.?\d+")
def NUMBER(self, t):
if t.value.count('.') == 0: t.value = int(t.value)
elif t.value.count('.') < 2: t.value = eval(t.value)
else: print("ERROR"); break
return t
if __name__ == '__main__':
data = "abc_123_X = a + 123e45 -c * d / e ^(f%g)"
lexer = CalcLexer()
for tok in lexer.tokenize(data):
print("type = %r, value = %r" %(tok.type, tok.value))
这是一个非常标准的浮点数正则表达式:
如果至少有一个数字,则第一部分将任何数字序列与可能的小数点匹配。(避免
.e3
被识别为浮点数。)第二部分(可选)与指数匹配实际上,在lexer中根本不需要使用lookarounds。尤其要记住,词法模式只在前一个标记结束后立即尝试,因此无需确保模式仅在标记开始时匹配;这种情况已经得到了解决
相关问题 更多 >
编程相关推荐