使用PLY匹配普通字符串

时间:2014-01-02 13:13:54

标签: python-2.7 lex lexer ply

我正在使用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)'

请告诉我为何不正确。

1 个答案:

答案 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 '"'

作为最后一点,您可能不需要正则表达式中的字符串锚$