我正在使用PLY编写解析器。问题类似于这个问题How to write a regular expression to match a string literal where the escape is a doubling of the quote character?。但是,我使用双引号来打开和关闭字符串。例如:
“我不知道是什么\”A \“是”
我将普通字符串词法分析器定义为:
t_NORMSTRING = r'"([^"\n]|(\\"))*"$'
我有一个变量的另一个词法分析器:
def t_VAR(t):
r'[a-zA-Z_][a-zA-Z_0-9]*'
问题是我的词法分析器无法识别“我不知道是什么”A \“是”作为NORMSTRING令牌。它返回错误
Illegal character '"' at 1
Syntax error at 'LexToken(VAR,'do',10,210)'
请告诉我为何不正确。
答案 0 :(得分:2)
通过一个小PLY程序探讨了这个问题,我认为你的问题与数据处理中handling raw and non-raw strings之间的差异有关,而与PLY解析和词汇匹配本身无关。 (正如旁注,在这个字符串处理领域python V2 and python v3之间存在细微差别。我已将代码限制为python v2。)
如果您使用非原始字符串或使用input
而不是raw_input
,则只会收到错误。这从我的示例代码和结果中显示:
命令:
$ python --version Python 2.7.5 $ python string.py
import sys
if ".." not in sys.path: sys.path.insert(0,"..")
import ply.lex as lex
tokens = (
'NORMSTRING',
'VAR'
)
def t_NORMSTRING(t):
r'"([^"\n]|(\\"))*"$'
print "String: '%s'" % t.value
def t_VAR(t):
r'[a-zA-Z_][a-zA-Z_0-9]*'
t_ignore = ' \t\r\n'
def t_error(t):
print "Illegal character '%s'" % t.value[0]
t.lexer.skip(1)
lexer = lex.lex()
data = r'"I do not know what \"A\" is"'
print "Data: '%s'" % data
lexer.input(data)
while True:
tok = lexer.token()
if not tok: break
print tok
输出:
Data: '"I do not know what \"A\" is"' String: '"I do not know what \"A\" is"'
data = '"I do not know what \"A\" is"'
print "Data: '%s'" % data
lexer.input(data)
while True:
tok = lexer.token()
if not tok: break
print tok
输出:
Data: '"I do not know what "A" is"' Illegal character '"' Illegal character '"' String: '" is"'
lexer.input(raw_input("Please type your line: "));
while True:
tok = lexer.token()
if not tok: break
print tok
输出:
Please type your line: "I do not know what \"A\" is" String: '"I do not know what \"A\" is"'
lexer.input(input("Please type your line: "));
while True:
tok = lexer.token()
if not tok: break
print tok
输出:
Please type your line: "I do not know what \"A\" is" Illegal character '"' Illegal character '"'
作为最后一点,您可能不需要正则表达式中的字符串锚$
。