2013-11-06 2 views
0

У меня возникли проблемы с lex с int и double, используя следующую программу. DOUBLE_VAL возвращается для 1, тогда как я ожидал INT_VAL. При изменении порядка функций INT_VAL и DOUBLE_VAL, я получаю ошибку в десятичной точке. Как я могу их решить?PLY lexer для чисел всегда возвращает double

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 

ответ

0

Ваша грамматика соответствует целым числам с t_DOUBLE_VAL. Выражение Изменение t_DOUBLE_VAL «s, чтобы соответствовать только если десятичная точка присутствует:

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

Я хочу признать двойной независимо от десятичной точки. например 2e10 действует двойным. – satish

+0

См. Обновленную версию. Но вы не можете совместить double полностью независимо от десятичной точки - вы хотите совместить 1 как целое число 1, а не как double. Примечание. Эта форма по-прежнему требует цифры слева от «.». - Вы хотите принять «.123» как двойной? Если да, то еще раз расширьте регулярное выражение. Ваше регулярное выражение также может быть более читаемым, если вы используете '\ d' вместо' [0-9] 'всюду. – PaulMcG

+0

Согласен. double должен иметь десятичную точку, отличающуюся от целого. Таким образом, 5e9 может быть 5.0e9 вместо этого. Благодарю. – satish

 Смежные вопросы

  • Нет связанных вопросов^_^