Python 用于数字的PLY lexer始终返回double

Python 用于数字的PLY lexer始终返回double,python,lex,ply,Python,Lex,Ply,我在使用以下程序时遇到了使用int和double的ply-lex的问题。返回1的DOUBLE_VAL,而我期望的是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)

我在使用以下程序时遇到了使用int和double的ply-lex的问题。返回1的DOUBLE_VAL,而我期望的是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

您的语法正在将整数与
t\u DOUBLE\u VAL
匹配。将
t\u DOUBLE\u VAL
的表达式更改为仅在存在小数点时匹配:

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

您的语法正在将整数与
t\u DOUBLE\u VAL
匹配。将
t\u DOUBLE\u VAL
的表达式更改为仅在存在小数点时匹配:

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

不管小数点是多少,我都要识别double。e、 g.2e10为有效双精度。请参阅更新版本。但无论小数点是多少,都无法完全匹配double-您希望将1作为整数1匹配,而不是作为double匹配。注意-此表单仍需要“.”左边的数字-是否接受“.123”为双精度?如果是,则进一步扩展正则表达式。如果您在整个过程中使用
\d
而不是
[0-9]
,您的正则表达式也可能更具可读性。我同意。double必须有小数点才能与integer不同。所以5e9可以改为5.0e9。谢谢。我想识别不带小数点的double。e、 g.2e10为有效双精度。请参阅更新版本。但无论小数点是多少,都无法完全匹配double-您希望将1作为整数1匹配,而不是作为double匹配。注意-此表单仍需要“.”左边的数字-是否接受“.123”为双精度?如果是,则进一步扩展正则表达式。如果您在整个过程中使用
\d
而不是
[0-9]
,您的正则表达式也可能更具可读性。我同意。double必须有小数点才能与integer不同。所以5e9可以改为5.0e9。谢谢