Ragel を使用して非常に単純なパーサーを実装しました。「主な」構造はスキャナーです。
私はこのようなものを実装しています:
action doSomething
{
doSomething(fpc);
}
foo = 'foo';
bar = 'bar';
main := |*
foo => { matchFoo(); };
bar => { matchBar(); };
space;
*|;
他のルールに一致しないものすべてに一致させるにはどうすればよいですか (つまり、基本的にエラー状態、何らかの不正な入力)。不正な入力がある行でエラーを取得できるように実装したいと思います。スキャナーの最後に「any」条件を使用しようとしましたが、それは常に「最長一致」であり、スキャナーは毎回一致するため、もちろん機能しません。他のすべてのトークンを含むリストからある種の否定を取りたいとは絶対に思いません (「any」からそれらを除外するため)。 . Ragel のスキャナーで他のものと一致しないものをすべて一致させるにはどうすればよいですか?
編集:いくつかのテストを行いましたが、スキャナーの最後にある「any」と一致するだけで機能します。文字が一致しない場合は、その式に移動します。ただし、「any+」と一致させようとすると、毎回そこに移動するため機能しません (すべてのデータについて、常にスキャナーで最も長い一致になります)。「任意」に一致するだけの問題は、一致しないデータの連続ブロック全体へのトークン開始ポインターとトークン終了ポインターを取得できないことです。「他に一致しない最長連続文字ブロック」を一致させるにはどうすればよいですか?