3

PLYを使用してパーサーを作成しています。質問はこれに似ていますエスケープが二重引用符文字である文字列リテラルに一致する正規表現を書く方法? . ただし、文字列の開閉には二重引用符を使用します。例えば:

「\"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)'

正しくない理由を教えてください。

4

1 に答える 1

3

小さな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 '"'

$最後の注意として、おそらく正規表現に文字列アンカーは必要ありません。

于 2015-04-23T14:56:12.387 に答える