Python lex - TypeError: неизвестный текст - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь написать простой синтаксический анализатор lex.В данный момент используется:

from ply import lex

tokens = (
      'COMMENT',
      'OTHER'
  )

  t_COMMENT = r'^\#.*\n'

  t_OTHER = r'^[^\#].*\n'

  def t_error(t):
      raise TypeError("Unknown text '%s'" % (t.value,))

  lex.lex()

lex.input(yaml)
  for tok in iter(lex.token, None):
      print repr(tok.type), repr(tok.value)

Но не удается проанализировать простой входной файл:

    # This is a real comment
    #And this one also

    #/*
    # *
    # *Variable de feeu
    # */
    ma_var: True

    It is done, over, kaput    

Со следующим выводом:

l
'COMMENT' '# This is a real comment\n'
Traceback (most recent call last):
  File "parser_adoc.py", line 62, in <module>
    main2()
  File "parser_adoc.py", line 57, in main2
    for tok in iter(lex.token, None):
  File "/usr/lib/python2.7/site-packages/ply/lex.py", line 384, in token
    newtok = self.lexerrorf(tok)
  File "parser_adoc.py", line 44, in t_error
    raise TypeError("Unknown text '%s'" % (t.value,))
TypeError: Unknown text '#And this one also

#/*
# *
# *Variable de feeu
# */
ma_var: True

this is done
'

Итак, в итоге,Я определил 2 регулярных выражения:

  • Один для строки, начинающейся с #

  • Один для строк, начинающихся не с #

Но это не работает.Я не понимаю, что не так с моим регулярным выражением.

Не могли бы вы помочь?

Саймон

1 Ответ

0 голосов
/ 09 марта 2019

В регулярных выражениях Python (которые использует PLY), ^ относится к началу строки, а не к началу строки, если не был установлен многострочный режим.Так как оба ваших правила начинаются с ^, они могут совпадать только в первой строке.

Вы можете исправить это, поместив свои регулярные выражения в (?m:...), что включает многострочный режим, но это не такдаже необходимо здесь.Вместо этого вы можете просто удалить ^ из начала ваших правил, и он будет работать так, как вы хотите.Поскольку оба ваших правила всегда соответствуют всей строке, следующий токен всегда будет начинаться с начала строки - не нужно их привязывать.

...