小さなPLYプログラムでこの問題を調査したところ、あなたの問題は、データ処理における生の文字列と非生の文字列の処理の違いに関連していると思います.PLYの解析と語彙の一致自体ではありません. (ちなみに、この文字列処理の領域では、 python V2 と 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 '"'
$
最後の注意として、おそらく正規表現に文字列アンカーは必要ありません。