問題タブ [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 happy - 「予想される型と一致しませんでした」
Haskell に適したパーサー生成システムのエラー メッセージを理解するのにいくつか問題があります。
たとえば、このコード
正常に動作します。
でもそんなことしたら
巨大なエラー メッセージが表示されます。ですので、ご理解いただけると大変助かります。
前もって感謝します
parsing - (Show ([(String, Int)] -> Int)) のインスタンスがありません
ラムダ式を使用している場合、幸せなプロダクションルールでその場で式の値を計算することはできません。
たとえば、このコード
http://www.haskell.org/happy/doc/html/sec-using.htmlからは機能しません。
または、より正確には、エラー メッセージが表示されました
何を変更しなければならないかを説明していただければ幸いです。
ラムダ式と環境変数 p と関係があるはずです。
データ型を使用しているときは、すべて問題ありません。
javascript - JS: 数字とスペースの正規表現?
私はhappyJSを使用しており、その下の正規表現を電話の検証に使用しています
ただし、これは数字のみを許可します。ユーザーがスペースを入力できるようにしたい
なぜreturn /^(?:[0-9 ]+$)/.test(val);
トリックをしていないのですか?
grammar - 文法にポインタを導入するときの競合を減らす/減らす
自分の言語を作成することの難しさをより深く理解するために、私は小さなコンパイラーに取り組んでいます。現在、文法にポインタ機能を追加する段階にありますが、それを実行することで、reduce/reduceの競合が発生しました。
これは、によってコンパイルできる私の文法の簡略化されたバージョンですbnfc
。私はhappy
パーサジェネレータを使用していますが、これは、reduce/reduceの競合があることを通知するプログラムです。
私は文法がどのように機能するかを学習している段階にあります。しかし、私は何が起こるかを知っていると思います。これらの2つのプログラムを検討してください
と
(typedef
とのmain(){}
部分は関連性がなく、私の文法ではありません。しかし、それらはいくつかの文脈を与えます)
a "*" b
最初のプログラムでは、それがとして解析されることを望みます。Stmt ==(SExpr)==> Expr ==(EMult)==> Expr * Expr ==(..)==> Ident "*" Ident
つまり、基本的にSExpr
ルールを使用してステップを開始します。
同時に、my_type * my_type_pointer_variable
ルールを使って拡張していきたいと思います。Stmt ==(SDecl)==> Type Ident ==(TPointer)==> Type "*" Ident ==(TAlias)==> Ident "*" Ident
。
しかし、文法段階では、識別子が元々型エイリアスなのか変数なのかわかりません。
(1)reduce / reduceの競合を取り除くにはどうすればよいですか?(2)この問題を抱えているのは私だけですか?明らかな解決策はありますか?c文法はこの問題をどのように解決しますか?
これまでのところ、「*」の代わりに「&」またはその他の記号を使用して言語の構文を変更することに成功しましたが、これは非常に望ましくありません。また、さまざまな公開文法からは理解できず、なぜこの問題が発生しないのかを調べようとしましたが、運が悪かったのです。
そして最後に、どうすればこのような問題を自分で解決できますか?より詳細な出力から私が理解したhappy
のは、競合がどのように発生するかということだけです。賢さは、これらの競合を回避する唯一の方法ですか?たとえば、紹介するときに、さらに多くの問題に遭遇するのではないかと心配しています。EIndir. Expr = '*' Expr;
parsing - Parsec または happy (alex を使用) または uu-parsinglib
Verilog (または vhdl) 言語のパーサーを作成し、解析されたデータの多くの操作 (一種の変換) を行う予定です。私は非常に大きなファイル (完全な Verilog デザイン、最大 10,000 行) を解析するつもりであり、最終的にはほとんどの Verilog をサポートする予定です。タイピングは気にしませんが、他のルールのサポートを追加するたびに、コードのどの部分も書き直したくありません。
Haskell で、どのライブラリをお勧めしますか? 私は Haskell を知っており、以前に Happy を (プレイするために) 使用したことがあります。コード内の解析された文字列を変換するために Parsec を使用する可能性があると感じています (これは大きな利点です)。私は uu-paringlib の経験がありません。
Verilog/VHDL の完全な文法を解析するには、どれが推奨されますか? 私の主な関心事は、気まぐれで解析されたデータを操作できる簡単さと「正確さ」です。速度は主要な関心事ではありません。
parsing - Happy の命題論理パーサーでの Shift/Reduce 競合
私は、この命題論理文法のBNF 定義に基づいて、Happy で簡単な命題論理パーサーを作成しています。これが私のコードです。
さて、ここで2つの問題があります
- 何らかの理由で、4 つのシフト/リデュースの競合が発生します。優先順位によって解決されると思っていたので、競合がどこにあるかはわかりません (BNF 文法に正しく従ったと思います)...
- (これはどちらかというと Haskell の問題です) 私のレクサー関数では、何らかの理由で、'¬' をどうするかを記述している行で解析エラーが発生します。その行を削除すると機能します。(この問題は解決済みです)
どんな助けでも素晴らしいでしょう。
haskell - cabal-install は、ハッピーのバージョンを保持しません
私はやろうとしましたが、依存関係cabal install hoogle
にヒックアップがあります:haskell-src-exts-1.13.5
実行しようとするとcabal install happy
、正常に終了したように見えますが、cabal-install はバージョンを保持しません:
ご覧のとおり、バージョンは[ Unknown ]
. cabal install happy
それは不明のままで、再度実行しようとしても cabal-install は無視されたままです。
何を与える?
前もって感謝します!
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 でこのツリーを変更するための最良の方法は何ですか?