4

この質問は JFlex に関するものですが、おそらく lex や flex などの他のスキャナー ジェネレーターにも当てはまります。

何らかのルールがある場合、そのルールの一部でキャプチャ グループを作成し、そのキャプチャ グループの結果をルール マッチング時に呼び出されるコードの引数として使用するにはどうすればよいですか?

たとえば、SGML タグに一致する単純なルールがあるとします。

"<"[a-zA-Z]+">"    {return new Token(Type.OPEN_TAG);}

内側の文字部分 ([a-zA-Z]+) をキャプチャして、Token コンストラクターの引数として使用するにはどうすればよいですか?

編集:単純に yytext() を使用して一致した値全体を取得し、コード内の他の部分を分離できることは承知していますが、必要以上に複雑になるようです。

4

1 に答える 1

2

スキャナー ジェネレーターは通常、グループのキャプチャをサポートしていません。正直なところ、スキャナー ジェネレーターでキャプチャ グループが必要になることはありません。通常、他の RegEx エンジンでキャプチャ グループを使用するほとんどの処理は、パーサーまたはアクション内の単純なコードによってより適切に処理されます。

次のようなものはおそらくうまくいくはずです。

"<"[a-zA-Z]+">"    {
                     String matchedText = yytext();
                     String label = matchedText.substring(1, matchedText.length() - 1);
                     return new Token(Type.OPEN_TAG, label);
                   }

グループ キャプチャを実装すると、遷移テーブルのサイズを縮小するためにスキャナー ジェネレーターによって実行される多くの最適化が妨げられる傾向があります。私は JFlex を使用したことがありませんが、flex が制限された形式のバックトラッキングをサポートし、前方/後方を見ていることを覚えているようですが、使用するとパフォーマンスに関する警告が表示されます。

于 2011-02-23T08:38:55.867 に答える