問題タブ [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 部分) には、次のデータ型があります。
そのため、解析後、宣言され、データ「ArithmeticInt 0」で初期化されたすべての変数のリストを取得できます。
プロンプトで「happy」コマンドを実行すると、すべて問題ありません。
しかし、結果の .hs ファイルを GHCI にロードすると、次のようになります。
VariablesList
type を typeに一致させることができないという広範なエラーが表示されます[(String,ArithmeticExpression)]
。私が行ったさまざまなテストにより、問題は私のVariablesList
文法規則の 2 番目のパターンにあることがわかっています。
特にその($2,ArithmeticInt 0):$4
部分。私は Haskell の初心者で、4 番目の引数 ($4) は型VariablesList
であり、型(String,ArithmeticExpression)
をそれに連結 (:) できないことを理解できます。
どんな種類のヘルプやガイダンスも大歓迎です:)。
編集: 請願により、最小限の作業用 Happy ファイルを次に示します。
実行:
次に、GHCI で以下をロードします。
最後に、それをテストするには:
または、変数が 3 つ未満の任意のリスト。
parsing - トークンなしでルールの関連付けを定義する方法は?
次の最小化された文法があります
Exp Exp
ルールは、値に関数を適用するために使用されます。しかし、そのようなものがあればmyFunc 1 2
、デフォルトで precendencemyFunc (1 2)
になりますが、これは私が望むものではありません。(myFunc 1) 2
カリー用に が欲しい。
しかし、非終端記号がない場合、どのように関連付けを定義できますか? やろうとしても%left Exp
役に立たないようです。
parsing - Parsec で複雑なファイルを解析する
複数のデータ シーケンス (同じ列数、同じ内容など) を含むファイルを Haskell で解析したいと考えています。データ シーケンスは前後のキーワードで区切られます。
私の問題は、Parsec でいくつかのテストを行った結果、Parsec はファイル全体ではなく、ファイルを 1行ずつ解析するように作成されているという印象を受けることです。
Parsecは私が望むものを作成するための正しい方法ですか、それとも Happy や Alex のような他のツールを検討する必要がありますか?
Parsecで複雑なテキスト ファイルを解析する例を提供する Web サイト (または他のリソース) はありますか?
注 : 私が示す例は非常に単純なものです。私のファイルでは、より多くのキーワードと組み合わせを使用すると、事態はより複雑になります。
parsing - Happy プロジェクトでは、「templates/wrappers.hs」はどこにありますか?
アレックスとハッピーを使ってパーサーを作ろうとしています。この投稿の指示に従っていますが、問題があります。次のタイプのエラーの原因を突き止めようとしています。
私のレクサーは src/AnsiParser/FrontEnd/Lex.x にあります。そこで、dist/build/AnsiParser/FrontEnd/Lex.hs を調べたところ、次のようなものしか見つかりませんでした。
しかし、システム上に「wrapper.hs」という名前のファイルが見つかりません。このエラーの原因を追跡するにはどうすればよいですか?
役に立つ場合に備えて、Parse.y の縮小版を次に示します。
そして Lex.x:
parsing - Happy が解析エラーをスローする原因は何ですか?
私は Alex で字句解析器を書き、それを Happy で書かれたパーサーに接続しようとしています。膨大な量のコードを貼り付けずに、問題を要約するために最善を尽くします。
lexer の単体テストから、文字列"\x7"
が lexed されることを知っています。
私のトークンタイプ(レクサーによって吐き出される)はToken
. ここで説明したようにlexWrap
andを定義しました。これにより、次のヘッダーとトークンの宣言が得られます。alexEOF
パーサーとレクサーの組み合わせを次のように呼び出します。
そして、ここに私の最初のいくつかの作品があります:
Expr
andのデータ型宣言NonPrint
は長く、ここではコンストラクターCmd
とNonPrint
マターだけなので省略します。この関数parseNonPrint
は、Parse.y の下部で次のように定義されています。
また、私のエラー処理関数は次のようになります。
このように書くと、次の hspec テストに合格することが期待されます。
しかし、代わりに、"exprs 30"
print once (5 つの異なる単体テストを実行しているにもかかわらず) とparseExpr
returnのすべてのテストが表示されRight []
ます。なぜそうなるのかはわかりませんが、exprs
それを防ぐためにプロダクションを変更しました:
これで、ヒットした最初のトークンですべてのテストが失敗します --- 次のようにparseExpr "\x7"
失敗します。
exprs -> expr -> nonprint -> NONPRINT
そして、パーサーがパスをたどって成功することを期待していたので、私は完全に混乱しています。この入力によってパーサーがエラー状態になる理由がわかりません。どのtrace
ステートメントもヒットしません (最適化されていますか?)。
私は何を間違っていますか?
haskell - Stack で Happy、Alex、その他のビルド ツールを呼び出すにはどうすればよいですか?
コンパイラの一部として、ビルド プロセスの一部として実行する必要がalex
あります。happy
Stack はこのシナリオをどのようにサポートしますか?
おまけ:どうすればalex
andhappy
をコンパイル時の依存関係として登録できますか?
parsing - Happy による解析: 左再帰と右再帰
Happy ユーザーマニュアルのセクション 2.2では、右再帰は「非効率的」であるため、右再帰ではなく左再帰を使用するようにアドバイスしています。基本的に彼らは、アイテムの長いシーケンスを解析しようとすると、右再帰は解析スタックをオーバーフローさせるのに対し、左再帰は定数スタックを使用すると言っています。与えられた標準的な例は
残念ながら、これはアイテムのリストが逆向きに出てくることを意味します。
これで、最後に適用するのは簡単です (ただし、パーサーが定義されている場所ではなく、パーサーが呼び出されるreverse
たびにこれを行う必要があるのは非常に面倒です)。しかし、アイテムのリストが大きい場合、Haskell スタックもオーバーフローするのでしょうか? いいえ?reverse
基本的に、任意のサイズのファイルを解析し、結果を正しい順序で取得できるようにするにはどうすればよいですか?
parsing - Happyでルールエイリアスを定義する
私は言語仕様を読んでいて、それ用のパーサーを書こうとしています。仕様では、同じものに対して複数の名前が使用されている場合があります。これを次のように Happy 文法にコピーしようとしました。
残念ながら、これにより Happy はひっくり返り、「競合の削減/削減」について愚痴をこぼし始めます。基本的に、問題は、 a を見たときに、それを aまたは afoo
に減らすかどうかわからないことのようです。真実はもちろん、それらはすべて同一であるため、私は気にしません。しかし、それはまだハッピーを動揺させます—それは言語的に皮肉なことですが、他に何もありません.bar
baz
bar
(また、 を言及するルールと を言及する別baz
のルールがある場合、「間違った」リダクションが選択された場合、正しいルールが実行されない可能性があることも少し怖いです。つまり、パーサーには 100% の問題が発生します。デバッグすることは不可能です。)
Happyに「私が何を言おうと、私が言っbar
たふりをfoo
して、あなたの人生を続けてください」と伝える方法はありますか?
明らかに、外部ツールを使用してテキストの検索と置換を行うこともできますが、ビルドステップをさらに追加する必要はありません...
parsing - あいまいな文法と可能な修正
したがって、私はこの言語の文法を持っています。文法には確かにいくつかのあいまいさが含まれていますが、これを修正するのは少し異常に難しいと感じています。以下は、この言語の BNF 文法であり、その下に私のハッピー パーサー ファイルの部分があります。
提案された言語の BNF:
パーサー.y
編集: BNF 形式に矢印を追加しました。これは、文法のあいまいさの原因と思われるものを示しています。
haskell - Haskell: GHC 7.10.3 で Happy 1.19.5 を使用する際の問題
Happy の最新バージョンでは、GHC 7.10.4 で次のエラー メッセージが表示されます。
インスタンス宣言のスーパークラスから生じる (Applicative HappyIdentity) のインスタンスはありません
Happyを台無しにするべきではないと思いますが、どうすれば問題を解決できますか?