如何在python模块中检测指数数?

2024-10-02 14:27:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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))

Tags: 代码idnumbervalue数字equal指数less
1条回答
网友
1楼 · 发布于 2024-10-02 14:27:51

这是一个非常标准的浮点数正则表达式:

([0-9]*\.[0-9]+|[0-9]+\.?)([Ee][+-]?[0-9]+)?

如果至少有一个数字,则第一部分将任何数字序列与可能的小数点匹配。(避免.e3被识别为浮点数。)第二部分(可选)与指数匹配

实际上,在lexer中根本不需要使用lookarounds。尤其要记住,词法模式只在前一个标记结束后立即尝试,因此无需确保模式仅在标记开始时匹配;这种情况已经得到了解决

相关问题 更多 >