問題タブ [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 - ocamllex で複数のトークンを返す
OCamlLex で複数のトークンを返す方法はありますか?
インデント ベースの言語用のレクサーとパーサーを作成しようとしてDEDENT
います。インデント レベルが以前よりも低いことに気付いたときに、レクサーが複数のトークンを返すようにしたいと考えています。これにより、複数のブロックが終了したときにパーサーに通知できます。
この方法に従うことで、 and のドロップイン置換として and を使用できます。これは、これらINDENT
2つのトークンがandトークンによって暗示されるためです。DEDENT
BEGIN
END
INDENT
DEDENT
f# - fslexのLuaの長い文字列
私は暇なときにLuafslexlexerに取り組んでおり、ocamllexのマニュアルを参考にしています。
長い文字列を正しくトークン化しようとしているときに、いくつかの問題が発生しました。「長い文字列」はとトークンで区切られ'[' ('=')* '['
ます。標識']' ('=')* ']'
の数は同じでなければなりません。=
最初の実装では、レクサーは[[
パターンを認識しないようでLBRACKET
、最長の一致ルールにもかかわらず2つのトークンを生成しましたが[=[
、バリエーションは正しく認識されました。さらに、正規表現は']' ('=')* ']'
、実際の長い文字列の「レベル」に関係なく、正しい終了トークンが使用されていることを確認できず、最初のキャプチャで停止しました。また、fslexは正規表現の「as」構文をサポートしていないようです。
私はレクサーの別のルールで問題を解決しようとしています:
しかし、2つの理由で行き詰まっています。1つは、長い文字列を読み終えたら、いわば次のルールへのトークンを「プッシュ」できないと思います。次に、正しい終了トークンが見つかるまで文字ごとに読み取るというアイデアが好きではないため、現在のデザインは役に立たなくなります。
fslexでLuaの長い文字列をトークン化するにはどうすればよいですか?読んでくれてありがとう。
ocaml - OCamllexは行頭に一致しますか?
私は ocamllex を使って OCaml でおもちゃのプログラミング言語を書いていて、言語を Python スタイルのインデント変更に敏感にしようとしていましたが、行頭を ocamllex の正規表現ルールと一致させるのに問題があります。私は^
行頭を一致させるために使用することに慣れていますが、OCaml ではそれが文字列連結演算子です。残念ながら、Google検索はあまりヒットしませんでした:(これがどのように機能するか知っている人はいますか?
ocaml - OCaml lex: まったく動かない
私はここでロープの終わりにいます。ocamllex で何も動作させることができず、気が狂いそうです。これは私の.mll
ファイルです:
入力として渡すファイルの内容は次のとおりです。
しかし、コンパイルして実行すると、最初の文字が無効であるというエラーが表示されます。正直なところ、何が起こっているのかわかりません。Google はまったく役に立ちませんでした。どうすればこれが可能になるのでしょうか? ご覧のとおり、私はここで本当に困惑しています。
編集:
私は長い間働いていたので、パーサーをあきらめました。これは私のメインファイルの関連コードです:
「line: 1, col: 1」を出力します。
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 - 文字列の字句解析にOcamllexを使用する(Tigerコンパイラ)
Appelの「MLでの最新のコンパイラ実装」に従おうとしており、Ocamllexを使用してレクサーを記述しています。
仕様では、エスケープシーケンスを変換した後、レクサーが文字列を返すように求めています。次のコードは、ocamllex入力ファイルからの抜粋です。
もっと良い方法はありますか?
ocaml - OCamllex構文エラー
レクサーの定義セクションでいくつかの識別子を定義するとき(ここで説明されているように)、私は次の形式の何かを書き込もうとしています。
id_charを、空白文字またはop_charではないすべての文字として定義します。ただし、2行目の「op_char」で構文エラーが発生します。これはどのように書くべきですか?ありがとう。
optimization - ocamllex と ocamlyacc を使用して 3 つのアドレス コードを記述する方法は?
ocamllex と ocamllyacc を使用して 3 つのアドレス コードを記述する方法を考えていました。私はこれについてたくさんグーグルで調べましたが、ocamlyacc を使用して何も見つけることができませんでした。パーサーとレクサーが動作しています (もちろん、両方とも ocamlyacc と ocamllex を使用しています) が、これらを使用して 3 つのアドレス コード ジェネレーターを作成する必要があります。たとえば、このパーサー (電卓) があるとします。
3つの住所コードはどのように書けばよいですか?
パーサー:
例:
入力:
5+(5*7)
3 つのアドレス コード出力:
t1 = 5*7
t2 = 5+t1
ocaml - ocamllex 正規表現の外部定義
コード内の型を読み込み/出力するために、レクサー/パーサー/プリティプリンターの通常の組み合わせを実装しました。通常、記号、句読点、またはセパレーターに使用されるプレーン文字列の正規表現に関しては、レクサーとプリティプリンターの間に冗長性があることがわかりました。
たとえば、私は今持っています
私のlexer.mll
ファイルで、次のような関数:
きれいな印刷用。TURNSTILE の文字列を変更することにした場合、コード内の 2 つの場所を編集する必要がありますが、これは理想的とは言えません。
どうやら、OCaml lexer は、正規表現を定義し、ファイル内でmll
それらを参照する特定の機能をサポートしています。したがってlexer.mll
、次のように書くことができます
しかし、これでは外部からアクセスすることはできませんsymb_turnstile
。たとえば、きれいな印刷機能からです。実際、 を実行した後、 inocamllex
は発生しません。の OCaml エピローグでこれらの識別子を参照することさえできません。symb_turnstile
lexer.ml
lexer.mll
これを達成する方法はありますか?
parsing - ocamllex/ocamlyaccを使用して文法の一部を解析する
私は正規表現を使用して、Verilogファイルの山を調べ、特定のステートメントを引き出してきました。現在、正規表現で問題ありませんが、ネストされた構造を処理するために実際のパーサーが必要になるところまで来ているので、ocamllex/ocamlyaccを調査しています。最初に正規表現の実装で得たものを複製してから、文法にゆっくりと追加したいと思います。
現在、私は主にモジュール宣言とインスタンス化を引き出すことに興味があります。この質問をもう少し簡潔にするために、モジュール宣言のみを見てみましょう。
Verilogでは、モジュール宣言は次のようになります。
私の現在の正規表現の実装は、特定の名前で宣言されたモジュールがあることを確認するだけです(興味のある名前のリストと照合します-すべてのモジュール宣言を特定の名前のものだけで見つける必要はありません)。したがって、基本的に、解析したいVerilogファイルの各行を取得し、次のように照合します(PythonishおよびRubyish要素を含む疑似OCaml):
それはうまくいきます。モジュール宣言は、Verilogファイルのどこでも発生する可能性があります。ファイルにその特定の宣言が含まれているかどうかを確認したいだけです。そのファイルに他に何が含まれている可能性があるかは気にしません。
これをocamllex/ocamlyaccに変換する最初の試み:
verLexer.mll:
verParser.mly:
次に、REPLで試してみます。
それは素晴らしいです、それはうまくいきます!
ただし、実際のVerilogファイルには、モジュール宣言以上のものが含まれます。
そのモジュール定義の前後に何が表示されるかはあまり気にしません。文法のその部分を抽出して、Verilogファイルに「modulefoo(」ステートメントが含まれていることを確認する方法はありますか?はい、正規表現はこれには問題なく機能しますが、前述のように、この文法をゆっくりと成長させ、さらに要素を追加することを計画しています。正規表現が機能しなくなります。
編集:lexルールにmatch any charを追加しました:
これまで一致しなかった文字をスキップすることを考えていますが、それは機能していないようです: