Python lex - TypeError: Unknown text
Python lex - TypeError: Unknown text
我正在尝试编写一个简单的词法分析器。目前是:
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 个正则表达式:
一个用于以 #
开头的行
一个不以 #
开头的行
但它不起作用。
我不明白我的正则表达式有什么问题。
你能帮忙吗?
西蒙
在 python 正则表达式(PLY 使用)中,^
指的是字符串的开头,而不是行的开头,除非设置了多行模式。因此,由于您的两个规则都以 ^
开头,因此它们只能匹配第一行。
您可以通过将正则表达式包装在 (?m:...)
中来解决此问题,这样可以启用多行模式,但这在这里甚至没有必要。相反,您可以从规则的开头删除 ^
,它将按您的预期工作。由于您的两个规则始终匹配整行,因此下一个标记将始终从行的开头开始 - 无需锚定它们。
我正在尝试编写一个简单的词法分析器。目前是:
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 个正则表达式:
一个用于以
#
开头的行
一个不以
#
开头的行
但它不起作用。 我不明白我的正则表达式有什么问题。
你能帮忙吗?
西蒙
在 python 正则表达式(PLY 使用)中,^
指的是字符串的开头,而不是行的开头,除非设置了多行模式。因此,由于您的两个规则都以 ^
开头,因此它们只能匹配第一行。
您可以通过将正则表达式包装在 (?m:...)
中来解决此问题,这样可以启用多行模式,但这在这里甚至没有必要。相反,您可以从规则的开头删除 ^
,它将按您的预期工作。由于您的两个规则始终匹配整行,因此下一个标记将始终从行的开头开始 - 无需锚定它们。