問題タブ [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.
ocaml - パーサー内で解析エラーが発生する入力文字列を取得します
menhir
文字列から式ASTへの式を解析しようとするフロントエンドが書かれています。フロントエンドのエントリ ポイントは、Parser_e.main
私の OCaml コードのいくつかの異なる場所で呼び出されます。そのため、外部ではなくフロントエンド内で発生する可能性のあるエラーをキャッチできるようにしたいと考えています。エラーをキャッチするときに表示したい特定の重要な情報は、フロントエンドが解析できない入力文字列全体です。(フロントエンドはほとんどすべてを読み取ることができるため、レクサーからのエラーは非常にまれです)。
そこで、このスレッドをたどって、エラーが発生したときに詳細情報を出力しようとしました。にparser_e.mly
、追加しました
しかし、まだ入力文字列を情報として持っていません。それを得るために私が欠けている機能がある場合、誰かがいますか?
ocaml - menhir でパーサーを生成するときに、より多くのものをエクスポートする方法はありますか?
私は menhir を使用してパーサーを生成していますが、現在、parser.mly ファイルから生成された parser.mli ファイルは次のようになっています。
パーサーのインターフェースにより多くのものを含める方法はありますか? 特に、AST (現在は別のタイプ モジュールにあります) のデータ型と、トークン データ型で動作するいくつかの関数 (たとえば、それらを文字列に変換する関数) もエクスポートできるようにしたいと考えています。
parser.mly の後に Ocaml コードを追加しようと%%
しましたが、そのコードが parser.ml に表示される一方で、宣言した関数が parser.mli に表示されません。
makefile - OCamlbuild 経由で Menhir エラー メッセージ生成を使用するには?
--compile-errors
の機能を使用しており、menhir
非常に満足しています。ocamlbuild
プロジェクトのコンパイルの管理にも使用しています。このプロジェクトは非常に基本的なものであるため、ビルド インフラストラクチャはこれまでのところ簡単なままです。
プロジェクトのルートに単一の_tags
ファイルと単純なものがあります。Makefile
まだファイルがありませmyocamlbuild.ml
ん。この_tags
ファイルには次の 1 行しか含まれていません。
Makefile の関連部分は次のとおりです。
OCamlbuild と Menhir は通常うまく統合されてい--compile-errors
ますが、かなり新しい機能のようです。src/ParsingErrors.ml
ビルド ディレクトリではなく、ソース ディレクトリに自動生成されたファイルを配置するのが嫌いなので、私の設定は理想的ではありません。Menhir にこのエラー メッセージ ファイルをビルドしてもらいたいことを OCamlbuild に説明するには、どうすればよいでしょうか? ファイルの命名規則を (たとえば、src/Parser.messages
とsrc/Parser.ml
に) 変更しても、物事が単純化されるのであれば問題ありません。
注:myocamlbuild.ml
他のプロジェクトにファイルがありますが、オンライン ソースからコピーしました。解読するのは難しいと思いますし、これらの書き方もよくわかりません。
ocaml - menhir - 式のシーケンスを削減するための結合規則
ラムダ式のパーサーを書き、
ファイルを作成するとき.mly
、式のシーケンスという考えをどのように表現できますか
として解析する必要があります
ルールの使用:
(e1 , (e2 , (e3 , e4)))
とは対照的に、構造を与える(((e1, e2), e3), e4)
。トークンではなくルールの結合性を制御する方法はありますか?
yacc - ocamlyacc での競合のシフト/削減
次のパーサーがあります。
私はそれが完全ではないことを知っています.
この行を追加すると、| expr Bigger expr {$1 > $3}
10個のシフト/削減の競合が発生します...しかし、この行を次のように括弧で追加すると:
| LP expr RP Bigger LP expr RP {$2 > $6}
LP は「(」を表し、RP は「)」を表します
それは完全に適合し、エラーもシフト/削減の競合もありません
これは問題の正しい解決策ですか? もしそうなら、なぜですか?もう 1 つ質問します。パーサーで何か間違ったことをしていますか? それとも完全ではないだけですか?
ありがとうございます!
parsing - 言語用に ocamlyacc を使用してパーサーを作成しようとしていますが、どの型を配置すればよいですか?
私は次のコードにも expr のようなものがあります: int {} | BOOL {} などですが、このパーサーの型に書くべき型が何であるかわかりません。int で動作する電卓の例があり、型は int ですが、私のプログラムには float char 文字列などがあります..ありがとう