問題タブ [happy]
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 - Haskell - 幸せな数式と変数のパーサー
私は幸せな数学式と変数のパーサーに取り組んでいます。問題は、変数の値を保存して後で使用する方法がわからないことです。何か案は?
これは、式と変数の割り当てを認識する方法です。
式には変数を含めることができます。例えば:
パーサーが行 'a = 2 + 1' を解析しているときに変数 'a' の値を保存し、パーサーが行 'a + 2' を解析しているときに変数 'a' の値を取得する必要があります。
xml - Alex と Happy を使用して電子メール メッセージを Lex、解析、およびシリアライズして XML にする方法
任意の電子メール メッセージを入力し、同等の XML エンコーディングを出力できるように取り組んでいます。
メールヘッダーの 1 つである「From ヘッダー」から始めます。
From ヘッダーの例を次に示します。
この XML に変換したい:
字句解析器 "Alex" ( http://www.haskell.org/alex/doc/html/ ) を使用して、From ヘッダーを分解 (トークン化) したいと考えています。
パーサー「Happy」( http://www.haskell.org/happy/ ) を使用してトークンを処理し、解析ツリーを生成したいと考えています。
次に、シリアライザーを使用して解析ツリーをたどり、XML を出力したいと考えています。
From ヘッダーの形式は、Internet Message Format (IMF) の RFC 5322 ( https://www.rfc-editor.org/rfc/rfc5322 ) で指定されています。
From ヘッダーと必要な XML 出力の例をいくつか次に示します。
表示名のないヘッダーから:
必要な XML 出力:
表示名がなく、アドレスが山かっこで囲まれていないヘッダーから:
必要な XML 出力:
それぞれがコンマで区切られた複数のメールボックスを持つヘッダーから:
必要な XML 出力:
RFC 5322 によると、コメントの構文は ( … ) です。以下は、コメントを含む From ヘッダーです。
字句解析中にすべてのコメントを削除したい。
目的の XML 出力は次のとおりです。
RFC によると、From ヘッダー全体に「折りたたみ空白」が散らばっている可能性があります。以下は、1 行目に From: トークン、2 行目に表示名、3 行目にアドレスを含む From ヘッダーです。
XML 出力は、折り畳みの空白の影響を受けません。
RFC によると、アドレスの @ 文字の後には、次のように角かっこで囲まれた文字列を指定できます。
そのようなメールを見たことがないことを認めなければなりません。それにもかかわらず、RFC はそれが許可されていると述べているので、レクサーとパーサーがそのような入力を処理することは確かに必要です。目的の出力は次のとおりです。
エラー処理
Fromヘッダーが正しくない場合にエラーを生成したい。誤った From ヘッダーと目的の出力の例をいくつか示します。
アドレスの後に表示名が誤って配置されています。
出力には、エラーが発見された場所が示されているはずです。
この From ヘッダーには、表示名の前に誤った「23」があります。
繰り返しますが、出力にはエラーが発見された場所が示されているはずです。
レクサー、パーサー、シリアライザーの実装方法を教えてください。
haskell - Haskellの文法仕様から抽象構文木を構築するには?
私は、BNF で形式化された Java の非常に小さなサブセットで特定の構造を最適化するプロジェクトに取り組んでいます。
これを Java で行う場合は、AST を構築する JTB と JavaCC を組み合わせて使用します。その後、訪問者はツリーを操作するために使用されます。しかし、Haskell で解析するための膨大なライブラリ (parsec、happy、alex など) を考えると、適切なライブラリを選択するのに少し混乱しています。
簡単に言えば、言語が BNF で指定されている場合、AST を構築する最も簡単な手段を提供するライブラリはどれでしょうか? そして、慣用的な Haskell でこのツリーを変更するための最良の方法は何ですか?
haskell - HappyでAlexモナディックレクサーを使用するには?
私は Alex + Happy を使用してパーサーを構築することを学ぼうとしています。特にmonad
、Alex のラッパーの使用法を学ぶことに興味があります。私はすでに Alex とHappyのドキュメントを見てきましたが、私にとっては、それらを一緒に使用するための有用な情報が本当に不足しています。basic
私はそれらをとposn
ラッパーと一緒に動作させることができましたが、と途方に暮れていmonad
ます。
私はすでにアレックス、ハッピー、およびモナドレクサーに関する SO に関する別の質問を見てきました (以下を含む:アレックス + ハッピーを使用して単純なインタープリターを構築するためのチュートリアルはありますか?monad
オンラインのコードのほとんどは、カスタム レクサー関数で Happy を使用するか、basic
またはposn
Alex ラッパーを使用します。
以下は、ini に似た構文の単純なレクサーです。
相対的な Happy パーサーは次のとおりです。
多くのコンパイラ エラーが発生します。
パーサーを使用するにはどのように変更すればよいalexMonadScan
ですか? Happyのドキュメントはまったく明確ではなく、明確にする例を使用しないように努めています (または、提供されている例は、私の観点からは明確ではありません)。
必要に応じて、この同じレクサー + パーサーの私のposn
バージョンを投稿できます。
parsing - noob は小さな言語のパーサーを作りたいと思っています
let-in-expression 言語に適したパーサーを作成したいと考えています。たとえば、次の文字列を解析したい:
大学では属性文法を研究していますが、このトリックを使用して、解析された let-in-expression の値を直接計算したいと考えています。Happy ファイルでは、解析関数のデータ型を Int に設定し、envという新しい属性を作成しました。この属性は、変数名を値に関連付ける String から Int への関数です。私の例を参照してください:
ここで、私の文法がある幸せなファイルの下にここに置きます。
上記の happy ファイルから生成された haskell ファイルをロードすると、次のエラーが発生します。
幸せなファイルでタイプ Parser.Int を定義していないため、なぜこれを取得するのかわかりません。Int を Prelude.Int に置き換えようとしましたが、他のエラーが発生します。
どうすれば解決できますか? 最適ではないことをしている場合、一般的なヒントを教えてもらえますか?
parsing - Happy で解析し、セマンティクス/バインディングを追加します
Pascal (ネストされたサブルーチンを許可する) などの静的スコープのネストされた言語のソースを解析しながら、バインディング情報 (ソースで検出された名前と値のペアのリスト) を維持する方法はありますか? 問題は、ネストされた 2 つのサブルーチンを含む外部レベルのルーチンがある場合、2 番目に解析されたサブルーチンは、グローバルまたは外部レベルのルーチン内で確立されたバインディングを「継承」する必要がありますが、最初に解析されたものは継承しないことです。ルーティーン。したがって、モナドパーサーでは問題を処理できないように思えますが、それは私がそれらを十分に使用する方法を知らないためかもしれません。
何か案は ?十分に明確に説明したことを願っています。
parsing - 文法規則 (構文解析) とは?
インタープリターを作成しようとしていますが、プロセスの理論的基盤を理解するのに苦労しています。
最初の部分は、文字列を有効なトークンのリストに分割するレクサーを記述し、次にパーサーを使用して、このトークンの文字列に対応する抽象構文ツリーを生成することであることを理解しています。ただし、パーサーは文法規則を使用して構築されているため、理解が困難です。
結果の抽象構文ツリーのルールを作成するために文法ルールが使用されることは明らかですが、この中間ステップはどのように機能するのでしょうか。文字列文字とトークンの特定のリストまたは . . .?
どんな種類の直感や説明も歓迎します。ありがとう!