正規表現を使用して端末を照合する再帰降下パーサーを Ruby で作成しています。ターミナルは実際には正規表現であり、文字列内の現在の位置と照合されます。
問題は、端末の正規表現には、改行に一致する正規表現を含め、何でも含めることができることです。たとえば、括弧内のすべてに一致する端末は、/\([^\)]*\)/
カウントする必要がある改行を含め、空白を消費します。私はいくつかの解決策を考え出しましたが、それらにはすべて、私が特に気に入らない欠点があります。
端末が一致するたびに、一致した のすべての出現をカウントします
\n
。これは事実上、すべての文字列が 1 回ではなく 2 回一致することを意味します。現在の行を格納する代わりに、文字列の現在の位置を格納し、必要なときにのみ文字列を走査して行番号と列番号を取得できます。行番号が必要になるたびに文字列全体がトラバースされるため、明らかに問題があります。
端末として正規表現を許可する代わりに、ANTLR で許可されているものと同様に、より単純な形式のマッチャーを許可してから、手動で文字列を照合し、改行をカウントすることができます。ただし、これには少なからず余分な作業が必要であり、正規表現のマッチング機能が失われます。
私は3番目の解決策に傾いていますが、誰かが同様の問題に対処し、問題を解決するより良い解決策を持っているかどうかを確認したいと思います.