問題タブ [ocamlyacc]
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.
f# - オプションの構文と繰り返しをOcamlYacc/FsYaccで表す
文法の字句解析/構文解析のスキルを身に付けようとしています。SQL用に作成した単純なパーサーを振り返っていますが、完全に満足しているわけではありません。パーサーを作成するためのより簡単な方法があったはずです。
SQLにはオプションのトークンと繰り返しがたくさんあるので、私はつまずきました。例えば:
と同等です:
ON
and句はオプションであり、WHERE
複数回発生する可能性があります。私はこれらをパーサーで次のように処理しました。
つまり、オプションの構文を個別のルールに分割して処理し、再帰を使用して繰り返しを処理しました。これは機能しますが、解析が小さなサブルーチンの束に分割され、文法が実際に何を表しているかを確認するのは非常に困難です。
角かっこ内にオプションの構文を指定し、*または+で繰り返しを指定できれば、はるかに簡単に記述できると思います。これにより、whereClauseとjoinListのルールが次のようになります。
このフォームははるかに読みやすく、キャプチャしようとしている文法をより直感的に表現していると思います。残念ながら、この表記法または同様のものをサポートするOcamlまたはF#のドキュメントには何も見つかりません。
OcamlYaccまたはFsYaccでオプションまたは反復トークンを使用して文法を表す簡単な方法はありますか?
parsing - 不完全な文法規則を無視するパーサー/レクサー
私は ocamlyacc と ocamllex で書かれたパーサーとレクサーを持っています。行末のセミコロンを忘れた場合のように、解析するファイルが途中で終わっても、アプリケーションは構文エラーを発生させません。私はEOFを発生させてキャッチしているため、lexerが未完成のルールを無視しているためだと認識していますが、構文エラーを発生させるにはどうすればよいですか?
これが私の現在のパーサーです(簡略化)、
およびレクサー (簡体字)、
サンプル入力ファイル、
解決策の 1 つは、コマンド ルールに再帰呼び出しを最後に追加し、空のルールを追加することです。これらはすべて、メイン プログラムに戻るリストを作成します。私はおそらくEofを期待として解釈し、レクサーのエラーではなく終了条件を解釈していると思いますが、これは正しいですか?
ocaml - ocamlyacc 解析エラー: どのトークン?
私は ocamlyacc と ocamllex を使用しています。カスタム例外を通知する文法のエラー生成があります。これまでのところ、エラーの位置を報告するように取得できます。
しかし、どのトークンが読み取られたかも知りたいです。方法があるはずです---誰か知っていますか?
ありがとう。
ocaml - ocamlyacc での関数適用の文法と優先順位
私は OCaml の初心者で、単純な OCaml のような文法を書こうとしていますが、これがわかりません。私の文法では、次のようなことができます。
ただし、そのように定義された関数を使用したい場合は、: と書くことはできます(sub 7) 3
が、 と書くことはできませsub 7 3
ん。何らかの理由で、私が書いたかのように解釈されます(これは引数を持つ関数としてsub (7 3)
扱われます)。関連するセクションは次のとおりです。7
3
ありがとう!
ocaml - ocamllex で複数のトークンを返す
OCamlLex で複数のトークンを返す方法はありますか?
インデント ベースの言語用のレクサーとパーサーを作成しようとしてDEDENT
います。インデント レベルが以前よりも低いことに気付いたときに、レクサーが複数のトークンを返すようにしたいと考えています。これにより、複数のブロックが終了したときにパーサーに通知できます。
この方法に従うことで、 and のドロップイン置換として and を使用できます。これは、これらINDENT
2つのトークンがandトークンによって暗示されるためです。DEDENT
BEGIN
END
INDENT
DEDENT
python - PythonからCIL(C Intermediate Language)への翻訳
私は最近、Python ソース コードの静的解析に取り組んでいます。私たちのグループには、すでに CIL(C Intermediate Language) 用の Ocaml で書かれた静的アナライザーがあります。このアナライザーを再利用したいので、理想的なアプローチは Python を CIL に変換することです。
現在、Python 組み込みの ast モジュールを使用して、Python を Python AST に解析しています。次に、ast.dump が出力した Python AST を C AST に変換します。C AST から CIL API および静的アナライザーはすべて Ocaml で記述されていることを考慮してください。Ocamllex&Ocamlyacc を選択して、Python AST を C AST に解析します。ただし、いくつかの大きな問題があります。
ast.dump が出力した AST 表現を特定するのは困難です。そのため、パーサーの実装が容易ではありません。一方、Ocaml を使用して Python の ast 内部構造にアクセスすることはできません。とはいえ、Ocamlとはデータ構造が違う。
Python コードから C AST への変換で最初に間違ったアプローチを選択したのではないでしょうか? 私の要件を満たす可能性のある他の既存のツールまたはアプローチはありますか?
私が見逃しているものがあれば、私にとって多くの助けになることを指摘してください. ありがとう。
ocaml - パーサーは解析の途中で停止します
私は完全にアイデアがありません。私はこの日に毎分自由な時間を費やしていますが、私は完全にアイデアがありません。
これが私のOcamlyacc
文法です:
解析を開始def foo(a,b) a+b
すると、デバッグメッセージによると、関数とプロトタイプ宣言が取得されたことがわかります。しかし、代わりに、proto
ルールの解析に関するメッセージしか表示されません。
さらにデバッグメッセージは、パーサーがa
式のまで到達してからa+b
停止することを示しています。エラーメッセージはありません。他には何もありません。のルールを満たさずに、テキストハット全体が完全に解析されたかのように停止しますstmt
。
シフト/リデュースエラーなどはありません。ASTタイプも問題ではありません。もうわからない、多分誰か他の人が助けてくれるだろう。確かにそれは明らかなことですが、私には見えません。
編集:人気のある需要によるレクサー:
ocaml - OCamlyaccでの外部型宣言の使用
expr.mlファイルにexpr型があります。parser.mly(OCamlyaccファイル)で、exprルールを定義し、次のタイプを指定します。
しかし、私は得る:
追加してみました
.mlyファイルの先頭にありますが、それでも機能しません。このexprタイプを外部ファイルで定義し、ルールの戻り値として使用するにはどうすればよいですか?ありがとう。
parsing - ocamlyaccを使用して競合を減らす/減らす
型付き式と変数アクセスを含む文法に苦労しています。このアクセスの結果タイプは、解析中に確認できず、2番目のステップで評価されます。この評価は問題ではありませんが、明確なパーサールールを作成するのは難しいようです。
異なるタイプで機能するすべての操作(比較演算子など)は、reduce/reduce
競合を引き起こします。明らかに、これは、タイプが不明であるため、パーサーが「」を「 」x.a = y.b
として解析するか「」として解析するかを決定できないためです。ただし、ルールの結果タイプは特定です(常にブール値であるため)。bool_expr EUQAL bool_expr
num_expr EUQAL num_expr
comp_op
解析中にすべての型情報を破棄せず、評価フェーズで常にチェックすることなく、この問題の解決策はありますか?
短縮された文法の例を次に示します(ocamllexとocamlyaccを使用)。
ご協力いただきありがとうございます。
optimization - ocamllex と ocamlyacc を使用して 3 つのアドレス コードを記述する方法は?
ocamllex と ocamllyacc を使用して 3 つのアドレス コードを記述する方法を考えていました。私はこれについてたくさんグーグルで調べましたが、ocamlyacc を使用して何も見つけることができませんでした。パーサーとレクサーが動作しています (もちろん、両方とも ocamlyacc と ocamllex を使用しています) が、これらを使用して 3 つのアドレス コード ジェネレーターを作成する必要があります。たとえば、このパーサー (電卓) があるとします。
3つの住所コードはどのように書けばよいですか?
パーサー:
例:
入力:
5+(5*7)
3 つのアドレス コード出力:
t1 = 5*7
t2 = 5+t1