Python词法 - 类型错误:未知图形

2024-03-28 09:35:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我想写一个简单的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)

但is无法解析简单输入文件:

    # 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个正则表达式:

  • 一个用于以#

    开头的行
  • 一个用于不以#

    开头的行

但它不起作用。 我不明白我的正则表达式怎么了。你知道吗

你能帮忙吗?你知道吗

西蒙


Tags: textinpytokenparserisvalueline
1条回答
网友
1楼 · 发布于 2024-03-28 09:35:57

在python正则表达式(PLY使用)中,^表示字符串的开头,而不是行的开头,除非设置了多行模式。因此,由于这两个规则都以^开头,因此它们只能在第一行匹配。你知道吗

您可以通过将regex包装在(?m:...)中来解决这个问题,这将启用多行模式,但这里甚至不需要这样做。相反,您可以从规则的开头删除^,它将按您的意愿工作。因为您的两个规则总是匹配整行,所以下一个标记总是从行的开头开始-不需要锚定它们。你知道吗

相关问题 更多 >