問題タブ [ragel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
xml - 簡単な Ragel トークナイザー (バックトラッキングなし) を作成するにはどうすればよいですか?
更新 2
|**|
元の質問:バックトラッキングが必要ない場合、Ragel の使用を避けることはできますか?
()*
更新された回答: はい、バックトラッキングが必要ない場合は、簡単なトークナイザーを作成できます。
更新 1
私が行っていることは XML に固有のものではないため、XML のトークン化について尋ねるのは危険であることに気付きました。
更新を終了
次のようなファイルで FooBarEntity 要素を単純に検索する Ragel スキャナー/トークナイザーがあります。
スキャナーのバージョン:
スキャナー以外のバージョン (つまり、()*
の代わりに使用|**|
)
私はこれを理解し、 https://github.com/seamusabshere/ruby_ragel_examplesでテストを書きました
https://github.com/seamusabshere/ruby_ragel_examples/blob/master/lib/simple_scanner.rlおよびhttps://github.com/seamusabshere/ruby_ragel_examples/blob/master/lib/simple_tokenizerで読み取り/バッファリング コードを確認できます。 .rl
c - Ragel に (スペース* ":" スペース*) で区切られた 2 つの名前を解析させるにはどうすればよいですか?
以下を解析したいと思います。
ここで、名前は alnum で始まり、alnum で終わり、alnum とスペースの任意の組み合わせを内部に含めることができます。空白の場合もあります。これに対する私のルールは次のとおりです。
名前はコロンで区切ることができ、オプションで名前とコロンの間にスペースを入れることもできます。これに対する私のルールは次のとおりです。
space*
どうやらinidentifier
とspace*
insep
がパーサーを混同するため、これは機能しません。fName
名前のすべてのスペースでアクションが実行されることになります。
sep を次のように変更した場合:
その後、すべてが順調です。パーサーが意図したとおりに動作するように、これらのルールを変更するにはどうすればよいですか?
この質問のソース コード: https://gist.github.com/1661150
ragel - ファイルの先頭または改行を一致させます(Ragel)
ホスト言語としてCを使用してragelを使用しています。
'\ n'で改行を認識できますが、代わりにファイルの先頭を認識する必要があります。
正規表現の他の実装では、これは\A
またはによって指定できますが、他の目的のために予約されており、他の何か(アラーム?)にマップされ、パーサーエラーが発生します。$
$
'\A'
\A
grammar - RFC 2068 は、コメント内にネストされたコメントを許可しますか?
RFC 2068によると:
コメント テキストを括弧で囲むことにより、一部の HTTP ヘッダー フィールドにコメントを含めることができます。コメントは、フィールド値定義の一部として「コメント」を含むフィールドでのみ許可されます。他のすべてのフィールドでは、括弧はフィールド値の一部と見なされます。
関連するルールは次のとおりです。
コメント内のコメント? これはばかげているようです。私の主張は次のとおりです。(1) コメント内にネストされたコメントは必要ありません。(2) その場合、コメント ルールは次のように表現した方がよいでしょう。
私の主張は正しいですか?そうでない場合、ネストされたコメントが実際に使用されるのはいつですか? 他の図書館は気にしますか?これについてあなたが知っている歴史/解説はありますか? (「RFC 2068 ネストされたコメント」で Web 検索を試みてもあまり役に立ちません。)
(動機: RFC 2068 用に (Ragel を使用して) lexer を作成しているので気にします。コメントをネスト可能にする必要がある場合、それは再帰ルールを意味します。これは、私が理解しているように、Ragel のスイート スポットではありません。場合によっては、Ragel が再帰規則を処理できることを示すいくつかの兆候がありますが、それについてはよくわかりません. また、Unicorn Ragel コードも調べていますが、これは役に立ちます.)
PS 簡単にするために、別のルールの詳細については意図的に掘り下げませんquoted-string
。
更新 2012-08-20 : 以下の 1 つの回答は、RFC 2068 の新しいバージョンを参考に引用しています。これは、解析規則を明確にするという点で役立ちます。ただし、それは私の他の点に対処していません:
コメント内にコメントを含めるという仕様の説得力のある根拠は見当たりません。それは単に不必要に思えます。おそらくオーバーエンジニアリングされているか、見過ごされているのでしょう。これは、再帰的なルールによってフォーマットが非正規言語になるため、煩わしくも重要でもあります。これは、仕様の作成者が通常は警戒すべきことですよね?
私は (まだ?) コメント内でコメントを使用する実際の例を見たことがありません。もしそうなら、世界は暗黙のうちに「ネストされたコメントはあまり重要ではない」と言ったことになります。
ruby - 括弧のバランスをとる単純な Ragel の例?
文法の出発点は次のとおりです。
(xxxx(oo)()xx)
たとえば、 を処理します。ネストされたグループを許可するように拡張するにはどうすればよいですか。例えば(xxxx(o(x)o)()xx
?
通常、1 台の Ragel マシンでは再帰がサポートされないことはわかっています。したがって、これは機能しません:
Ragel State Machine Compiler User Guide (PDF)から: (強調のために太字のテキストを追加):
「一般に、Ragel は再帰構造を処理できません。これは、文法が通常の言語として解釈されるためです。ただし、何を解析する必要があるかによっては、手動コーディング手法を使用して再帰部分を実装することが実用的な場合があります。これは、再帰構造が括弧のバランスをとるなど、単純で認識しやすいです。」
「再帰構造を解析する 1 つのアプローチは、カウンターをインクリメントおよびデクリメントするアクションを使用するか、再帰構造への入り口と出口を認識し、fcall と fret を使用して適切なマシン定義にジャンプすることです。別の方法として、セマンティック条件を使用してカウンターをテストすることもできます。変数。
「より伝統的なアプローチは、再帰構造に入ったときに別の解析関数 (ホスト言語で表現された) を呼び出し、後で終了が認識されたときに戻ることです。」
ネストされたブラケットに関するメーリング リストのディスカッションから、同じ 3 つのアプローチが言及されています。
prepush と postpop を使用して成長可能なスタックを指定してから、fcall と fret を使用します。
カウントしてから、アクションまたは条件で確認します。
再帰構造に入ったときに、(ホスト言語で) 新しい解析関数を呼び出します。
できれば上記の例を使用して、Ruby でのそれぞれの例を教えてもらえますか? ありがとう!
ragel - Ragel が入力全体と一致したことを確認する
Ragel がすべての入力を消費することを要求するより良い方法はありますか? これが私が今使っているものです:
data.length == p
テストを除いて、上記のほとんどはボイラープレートです。これは機能しますが、レクサーが最終状態で終了したことを確認しないことを除きます。そのため、入力全体が正常に解析されなかった場合でもトークンを返すテスト ケースがあります。
より良い方法はありますか?
(最終状態を直接テストする方がうまくいくかもしれません。その方法を検討しています。アイデアはありますか?)
java - Ragel 6.7 によって生成された Java コードのコンパイル エラー
Ragel を使用して単純なレクサーを作成し、それを Java の有効なコードに出力しようとしていますが、生成されたコードはコンパイルされません。
私が使用している Lexer.rl は次のとおりです。
生成されたファイルとエラー出力は次の場所にあります: https://gist.github.com/3495276 (大きすぎてここに貼り付けられないため =S )
それで、私は何を間違っていますか?
ruby - このあいまいさを Ragel で解決するにはどうすればよいでしょうか?
次の形式を解析しようとしています: (identifier/)?identifier(/keyword)?
、最初の識別子とオプションのキーワードを使用します。キーワードを識別子として使用することはできません。たとえば、up
がキーワードの場合:
simple
2 番目の識別子に一致し、first/second
first
最初の識別子として一致しsecond
、2 番目の識別子として、second/up
second
2 番目の識別子およびup
キーワードとして一致します。
Ruby でRagelを使用して、次の FSM を定義しました。
これにより、次の出力が得られます。
最初の部分は である必要があるため、これは正しくありませんが、私が与えた優先順位First: first
Second: second
により予想されます。:>
さまざまな優先順位の組み合わせを試しましたが、期待した結果を得ることができませんでした。この問題を Ragel で解決する方法はありますか (つまり、先読みなしで解決できますか)?
c - Ragel で先読みを実装する方法
2 つの状態があります。一方は、他方のより一般的な状態の特定のインスタンスです。両方の状態に同時に入るのを避ける正しい方法は、k>1 で先読みを実装することだと思いますが、これを行う方法の例は見つかりません。
Ragle のユーザー ガイドには次のように書かれています。
fhold と fexec の両方を使用する場合、ユーザーは、現在の位置が調整される遷移が他のマシンからの遷移と結合されないように、結果のマシンを別のマシンと結合することに注意する必要があります。
これが何を意味するのかは完全にはわかりませんが、おそらく「現在の式の最後を超えて読み取ろうとしないでください」ということを除いて.
私のマシンは次のようになります。
JPEG ヘッダーをトークン化し、未知のセグメントをスキップして、JFIF のような既知のセグメントを処理したいと考えています。JPEG アプリケーション セグメント app0 は で始まります0xFFE0
。app0 に JFIF データが含まれている場合、app0 マーカーの後に 2 バイトの長さと文字列 " JFIF\0
" が続きます。これは、アプリケーション セグメントを識別するときに 7 バイトの先読みが必要であることを意味します。