数字的PLY词法分析器总是返回两倍

时间:2013-11-06 19:39:20

标签: python lex ply

我在使用以下程序使用int和double时在ply lex中遇到了麻烦。 DOUBLE_VAL返回1,而我期望INT_VAL。在改变INT_VAL和DOUBLE_VAL函数的顺序时,我得到小数点的错误。我该如何解决它们?

tokens = (
'VERSION',
'ID',
'INT_VAL',
'DOUBLE_VAL'
)

t_ignore = ' \t'
def t_VERSION(t):
    r'VERSION'
    return t

def t_DOUBLE_VAL(t):
    '[-+]?[0-9]+(\.[0-9]+)?([eE][-+]?[0-9]+)?'
    return t

def t_INT_VAL(t):
    r'[-+]?[0-9]+'
    return t

def t_ID(t):
    r'[a-zA-Z_]([_a-zA-Z0-9]*[a-zA-Z0-9])?'
    return t

def t_error(t):
    print "Error: ", t
    #exit(-1)

import ply.lex as lex
lexer = lex.lex()
lexer.input('VERSION 1 4.0')
while True:
    tok = lexer.token()
    if not tok: break
    print tok

1 个答案:

答案 0 :(得分:0)

您的语法是将整数与t_DOUBLE_VAL匹配。将t_DOUBLE_VAL的表达式更改为仅在存在小数点时匹配:

def t_DOUBLE_VAL(t):
    '[-+]?[0-9]+(\.([0-9]+)?([eE][-+]?[0-9]+)?|[eE][-+]?[0-9]+)'
    return t