問題タブ [ocamllex]
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.
ocaml - コンテキストに依存するトークンの意味
区切り文字の意味がコンテキストに依存する奇妙な文字列構文があります。次のサンプル入力では:
結果は 2 つの文字列のリストです["foo"; "bar"]
。括弧の外側のペアはリスト モードに入ります。次に、次の括弧のペアが文字列を区切ります。文字列内では、バランスの取れた括弧のペアが文字列の一部として扱われます。
現在、レクサーはグローバル変数に応じて何を返すかを決定しますinside
。
区切り文字は括弧です。レクサーが左括弧にヒットした場合、
inside
がfalseの場合、Enter
トークンを発行し、 trueinside
に設定されます。inside
がtrue の場合、適切にネストされた括弧のペアを文字列の一部として扱う文字列レクサーに切り替えます。ネスト レベルがゼロに戻ると、文字列バッファーがパーサーに渡されます。
閉じ括弧が文字列の外側にある場合、Leave
トークンが発行され、inside
設定が解除されます。
私の質問は次のとおりです。グローバル変数なしでレクサーを書き直すにはどうすればよいですinside
か?
Fwiw 私は menhir を使用していますが、ocamlyacc でも同じことが言えます。(これが混乱しているように聞こえる場合は、申し訳ありません。私は yacc/lex アプローチの初心者です。PEG として考えなくても上記のすべてを表現できますが、精神的にレクサーとパーサーを分離しておくことに慣れていません。遠慮なく指摘してください。コードの他の問題を解決してください!)
簡単な例: *sample_lexer.mll*
*sample_scanner.mly*:
main.ml :
ocaml - Ocamllex構文上の問題
主な機能の仕組みを教えてもらえますか?正規表現の部分を理解し、主な機能を理解することはできますが、正確な意味はわかりません。
syntax - Ocamllex - 文字の違いは何ですか? ( # )
#
2 つの文字または文字セットの違いである ocamllex を持つ演算子があります。
ここで、私には理解できない概念があります。それは文字の違いです。文字の違いとはどういう意味ですか? だから誰かが私を説明できるなら、私はそれを取る!
ocaml - ocamllex によって生成されたファイル
理論によると、lex ツール (私は ocamllex を読みました) について、正規表現のコレクションを DFA (実際には NFA と NFA2DFA) の C (OCaml) コードに変換します。DFA M の正式な定義は、5 つのタプル M = {Q, Sigma, transition_function, q0, F} です。生成されたファイルで見つけたのは次のとおりです。
- Lexing モジュールのフィールドを持つ __ocaml_lex_tables というレコード
- 再帰関数
DFA のオブジェクト/構造と ocamllex によって生成された構造の間にマッピングがありますか? 私はそれを「見る」ことができません....また、助けを求めてグーグルで検索しましたが、役立つ例は見つかりませんでした。
ocamllex ツールからの回答は、DFA コンテキスト(7 ステート、279 トランジション、テーブル サイズ 1158 バイトなど)で意味があります。
状態遷移表ですか?それを「読む」方法は?リンク/ヒントをありがとう!
ocaml - 一致した文字列 ocamllex の一部にアクセスする
単純な言語をスキャンして解析するために、ocamllex および ocamlyacc コードを手配しようとしています。同じ抽象構文を定義しましたが、複雑なルールをスキャンするのが難しいと感じています。これが私のコードです
しかし、一致した文字列の特定の部分にアクセスできません。式の宣言は再帰的であるため、ネストされた関数も役に立ちません(?)。助けてください。
parsing - 有用な情報を出力してパーサーをデバッグする
、、、、などの一連の式X[3]
を解析したいと思います。X[-3]
XY[-2]
X[4]Y[2]
myparser.mly
では、index
( の内部にあります[]
) は次のように定義されています。
tokenなどはINTEGER
、MINUS
通常どおり lexer で定義されます。
例を解析しようとしましたが、失敗しました。ただし、コメント| MINUS INTEGER { 0 - $2 }
するとうまくいきます。したがって、問題は確かにそれに関連しています。デバッグするには、より多くの情報を取得したい、つまり、 と見なされるものを知りたいですMINUS INTEGER
。印刷を追加しようとしました:
ただし、解析中には何も出力されません。
情報を出力したりデバッグしたりする方法を教えてもらえますか?
tree - ツリー記述の文法例 (lex/yacc)
このツリーを記述するファイルからツリーを解析したい (これは実際には分類法です)。
ツリーの説明を提供する文法の例 (理想的には lex/yacc ファイル) を探しています。記述されたツリーが二分探索ツリーではなく、代わりに各ノード (おそらく) が複数の子を持つツリー (ファミリー ツリー? 平面ツリーと呼ばれますか?) である場合は、より良いでしょう。
理想的には、この lex/yacc が実際に OCaml ライブラリに含まれていれば完璧です。しかし、ツリーを記述するための優れた文法があれば、私は満足します。
Google や Stackoverflow で例を見つけようとしましたが、研究結果は解析ツリー関連の質問に圧倒されます。自分で文法を作成することもできますが、良い出発点を得るために、最初に例を見てみたいと思います.
ocaml - ocamlyacc で削減されないルール
ocaml を使用してレクサーをコンパイルすると、警告が表示されます。
そして、文字列を解析したいので、レクサーが引用を読み取ったときに開始し、他の引用を読み取ったときに終了する特別なルールを作成します。この場合、文字列を返し、他のすべての文字のルールトークンを呼び出します。
ファイルは次のとおりです。
parsing - サブルーチンのリストを解析する
を解析できるparser_sub.mly
andを書きました。Aは、とで囲まれたステートメントのブロックです。lexer_sub.mll
subroutine
subroutine
Sub
End Sub
実際、私が処理したい生ファイルには、サブルーチンのリストといくつかの役に立たないテキストが含まれています。次に例を示します。
したがって、すべてのコメント (たとえば、など) を無視して を呼び出し、サブルーチンのリストを返すことで、このファイルを解析できるparser.mly
andを記述する必要があります。lexer.mll
haha
' hehe
parser_sub.main
Sub
パーサーが役に立たない文 ( aと以外の文) をすべて無視する方法を誰か教えてもらえますEnd Sub
か?ここに
/li>parser.mly
私が書いてみた部分があります:のルールと解析
procedure_body
は複雑で、実際には と で定義さparser_sub.mly
れlexer_sub.mll
てparser.mly
いlexer.mll
ますparser_sub.main
。