1

我在使用以下程序使用 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
4

1 回答 1

1

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

def t_DOUBLE_VAL(t):
    '[-+]?[0-9]+(\.([0-9]+)?([eE][-+]?[0-9]+)?|[eE][-+]?[0-9]+)'
    return t
于 2013-11-06T19:42:49.613 回答