質問

Lua用のjFlexレクサーを作成していますが、言語仕様の特定の部分に一致する正規表現の設計に問題があります:

  

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

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

役に立ちましたか?

解決

\[(=*)\[.*?\]\1\]

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

他のヒント

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

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

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

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

\[(=*)\[.*?\]\1\]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top