Python lex - 类型错误:未知文本

我正在尝试编写一个简单的 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 个正则表达式:


一个以开头的行 #


一个用于不以开头的行 #


但它不起作用。我不明白我的正则表达式有什么问题。


你能帮忙吗?


慕码人8056858
浏览 217回答 1
1回答

心有法竹

在 python 正则表达式(PLY 使用的)中,^指的是字符串的开头,而不是行的开头,除非已设置多行模式。因此,由于您的两个规则都以 开头^,因此它们只能在第一行匹配。您可以通过将正则表达式包装在 中来解决此问题(?m:...),这将启用多行模式,但这在这里甚至没有必要。相反,您可以^从规则的开头删除,它会按您的意愿工作。由于您的两个规则始终与整行匹配,因此下一个标记将始终从该行的开头开始 - 无需锚定它们。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python