1

私はPythonモジュールPLYを使用してパーサーを作成しており、実装を進めています。文字列を検出するための簡単なルールがあります。

r'("|\').*("|\')'

レクサーエラーがスローされると、次のようになります。

def t_error (t) :
    print 'Illegal lexer input line ' + str(t.lineno) + ' ' + t.value[:16]
    sys.exit(-1)

パーサーに次の入力を与えると:

parse("preg_match('%^[\*\%]+$%', $keywords)")

私はこれを返します:

Illegal lexer input line 1 %^[\*\%]+$%', $k

私の質問は次のとおりです。

1) この文字列を解析しないのはなぜですか? 私の正規表現はこの文字列を適切に処理する必要があるようです。

2) どうすればこれを修正できますか?

編集:

問題を少し絞り込みました。次の文字列は、それ自体で不正なレクサー入力エラーをスローします。

'%'
'^'
4

1 に答える 1

2

この正規表現が機能していたとしても、実際には文字列ではないを受け入れ"this'ます。これは、「不正なレクサー入力」の原因でもあります...

仕事を終え"preg_match('てレクサーの最初の文字列が発見された後、次の 11 文字の%^[\*\%]+$%それぞれが不正である (および ではない) と、またはt_ignoreで始まらないため、動揺します。"'

.

"andの 2 つのケースでこれを試してみて'くださいあれは:

r'("[^"]*")|(\'[^\']*\')'

または、エスケープされたスピーチ マークを含める場合は、次のようにします。

r'("(\\"|[^"])*")|(\'(\\\'|[^\'])*\')'
于 2012-09-02T23:21:32.267 に答える