0

Lua 用の jFlex lexer を作成していますが、言語仕様の特定の部分に一致するように正規表現を設計する際に問題が発生しています。

リテラル文字列は、長い括弧で囲まれた長い形式を使用して定義することもできます。レベル n の左長い括弧は、左角括弧の後に n 個の等号が続き、その後に別の左角括弧が続くものとして定義します。したがって、レベル 0 の左大括弧は [[ と記述され、レベル 1 の左大括弧は [=[ と記述されます。以下同様です。閉じ長括弧も同様に定義されます。たとえば、レベル 4 の閉じ長括弧は ]====] のように記述されます。長い文字列は、任意のレベルの左長い括弧で始まり、同じレベルの最初の長い閉じ括弧で終わります。このブラケット形式のリテラルは、複数行にわたって実行でき、エスケープ シーケンスを解釈せず、他のレベルの長いブラケットを無視します。適切なレベルの閉じ括弧以外は何でも含めることができます。

一言で言えば、長い開き括弧、その間の文字列の内容、長い閉じ括弧に一致する正規表現を設計しようとしています。開始長括弧と終了長括弧の等号の数が同じである場合にのみ、一致が発生する必要があります。

4

3 に答える 3

6

さて、正規表現を使用したトークン化は、このタスクには十分ではないのではないかと思います。正規表現は十分に強力ではありません。

jFlexの単純な正規表現を使用して、「=」マークの数を比較する方法はありません。Perlにはそのためのハックがありますが(上記で提案したように\ 1)、Perlのプログラミングについてではなく、jFlexレクサーについて話します。

解決策は、左角かっこトークンに\ [= * \ [、右角かっこトークンに\] = * \]を使用し、上のレイヤー(パーサー)で長さが一致するかどうかを比較することです。

とにかく、llex.cのluaソースコードのread_long_string()を見て、正規表現をまったく使用せずにどのように実行したかを確認できます。

于 2009-06-22T05:27:10.647 に答える
4
\[(=*)\[.*?\]\1\]

\1 は最初の () をキャプチャします。

于 2009-06-21T12:07:34.403 に答える
3
\[(=*)\[.*?\]\1\]
于 2009-06-21T12:07:59.723 に答える