問題タブ [menhir]
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.
parsing - OCaml+Menhirコンパイル/書き込み
OCamlに関しては、私は完全な初心者です。私は最近(約2週間前に)その言語を使い始めたばかりですが、残念ながら、構成された言語の構文アナライザー(パーサー+レクサー、その機能は文を受け入れるかどうかのどちらかです)を作成する必要がありますMenhirを使用します。今、私はインターネット上でOCamlとMenhirに関するいくつかの資料を見つけました:
メンヒルマニュアル。
SourceforgeのTossのホームページにあるMenhirの短いチュートリアル。
derdonによるgithubのMenhirの例。
OCamlに関する本(ocamllex +ocamlyaccに関するいくつかのことを含む)
SooHyoungOhによるランダムなocamllexチュートリアル。
そして、Menhirのソースコードに付属している例。
(2つ以上のハイパーリンクを配置できないため、ここで言及しているWebサイトの一部に直接リンクすることはできません。申し訳ありません!)
ご覧のとおり、このプログラムの作成に役立つ資料を必死に探しています。残念ながら、私はまだ多くの概念を理解することができず、そのため、私は多くの、多くの困難を抱えています。
手始めに、プログラムを正しくコンパイルする方法がわかりません。私は次のコマンドを使用しています:
私のプログラムは4つの異なるファイルに分かれています:main.ml; lexer.mll; parser.mly; tokens.mly。main.mlは、引数として指定されたファイルシステム内のファイルから入力を取得する部分です。
2番目のファイルはlexer.mllです。
3番目のファイルはparser.mlyです。
4つ目はtokens.mlyです
ここに未使用のシンボルがたくさんあることはわかっていますが、パーサーでそれらを使用するつもりです。ファイルにいくつ変更を加えても、コンパイラーは私の顔を爆破し続けます。私は考えられるすべてのことを試しましたが、何もうまくいかないようです。バインドされていないコンストラクターと未定義の開始シンボルの多数のエラーでocamlbuildを爆発させているのは何ですか?プログラムを正しくコンパイルするには、どのコマンドを使用する必要がありますか?メンヒルについて学ぶための意味のある資料はどこにありますか?
parsing - Menhir/Ocamlyaccでのオペレーターの動的優先順位と優先順位の指定
Menhirパーサー(Ocamlyaccと同様)を使用して、演算子が動的属性(優先順位と優先順位)を持つ言語を解析しようとしています。字句解析フェーズでは、すべての演算子がOP:string
トークンを入力します(したがって、「+」はなどに変わります(OP "+")
)。
演算子の属性は解析時に決定され、演算子とその属性を関連付けるテーブルに入力されます。このテーブルが与えられた場合、このテーブルのデータに基づいて演算子を解析するルールの優先度を動的に変更するようにMenhirに指示するにはどうすればよいですか?
ありがとう、CharlieP。
parsing - Menhir を使用して非常に寛容な文法を作成することは可能ですか?
Verilog の一部を解析しようとしています。主に、モジュールの定義とインスタンス化を抽出することに関心があります。
Verilog では、モジュールは次のように定義されます。
モジュールは、次の 2 つの異なる方法のいずれかでインスタンス化されます。
この時点では、定義済みまたはインスタンス化されたモジュールの名前を見つけることにのみ関心があります。上記の両方の場合で「foo」。
このメンヒル文法 (verParser.mly) を考えると:
menhir インタープリターでこれを試してみると、モジュール インスタンスをうまく抽出できます。
単一モジュールのインスタンス化では問題なく機能します。
しかしもちろん、これらのいずれかの前に現れる IDENT がある場合、拒否されます。
...そしてもちろん、これらの定義の前に実際の Verilog ファイルに識別子があります。
Verilog 文法を完全に指定する必要はないようにしています。代わりに、文法をゆっくりと段階的に構築して、最終的にはより多くの言語を解析したいと考えています。
IDENT をジャンク ルールに追加すると、上記の問題は修正されますが、ジャンク ルールが IDENT をキャプチャしているため、モジュールのインスタンス化ルールは機能しません。
一致させたくないものをバイパスする非常に寛容なルールを作成することは可能ですか、それとも実際にこのようなことを行うには完全な文法を作成する必要がありますか?
一致させるルールを作成することは可能ですか:
「stuff*」は、最初は RPAREN 以外のすべてに一致しますか?
何かのようなもの :
私は過去に、そのような構造を可能にする PEG パーサーを使用しました。
build - js_of_ocaml でモジュールを使用するには?
私は現在、OCaml で記述され、js_of_ocaml を使用して JavaScript にコンパイルされた Web サイト プロジェクトに取り組んでいます。コマンドを使用するソース ファイルが 1 つしかない限り、これはかなりうまく機能しocamlfind ocamlc -package js_of_ocaml -package js_of_ocaml.syntax -syntax camlp4o -linkpkg -o file.byte file.ml
ますが、プロジェクトに複数のモジュールを含めたいと考えています。どうやってやるの ?
他のモジュールは、実際には ocamllex と menhir によって生成されたレクサーとパーサーです。js_of_ocaml で ocamllex と menhir を使用する方法に関するチュートリアルを読みましたが、js_of_ocaml がインストールされている場所 (私は opam でインストールしました) について間違った仮定をしており、ocamlbuild を使用しています。 ocamlbuild などのツール。
parsing - menhir を使用したオプションの文法規則のシーケンス
Menhir パーサーを使用して OCaml で次の文法を実装したいと思います。
4 つの異なるステートメントが次々に来るはずですが、そのうちの 3 つが欠落している可能性があります。したがって、どのプログラムにもこれらのステートメントが少なくとも 1 つ含まれていますが、特定の順序でさらに多くのステートメントを含めることができます。
文法は次のとおりです。
より簡潔な表現で表現することはできますか?
parser.mly
この文法の例を次に示します。
この場合、menhir は警告を生成します。
A B C D
、A
、A C
、などのケースB D
は一致しません。これを修正するために文法/パーサーの実装を改善するにはどうすればよいですか?
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 - ocamlbuild で .mly ファイルのバッテリーを使用する
OCaml .ml ファイルと Menhir .mly ファイルを含むプロジェクトがあります。プロジェクトのコンパイルには ocamlbuild を使用します。
私の _tags ファイルには、次の 1 行が含まれています。
.mly ファイルでバッテリーを使用する場合を除いて、すべて正常に動作します。.mlyファイルと.mly ファイルopen Batteries ;;
の間で、ocamlbuild を呼び出すと、「エラー: モジュールのバッテリーがバインドされていません」というメッセージが表示されます。%{
%}
次のように、ocamlbuild が menhir を呼び出しているようです。
menhir-package batteries
のオプションに (または同等のものを)追加するのを忘れています。--ocamlc
どうすれば修正できますか?_tags ファイル内の .mly ファイルの特別なルールが役立つのではないでしょうか? それとも ocamlbuild のバグですか?