問題タブ [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.

0 投票する
1 に答える
264 参照

parsing - Haskell パーサー ジェネレーターとのデータ型の不一致 - Happy

私はこの問題に数日間対処してきましたが、アイデアがありません。うまくいけば、私を助けてくれます:

私のトークンリストは次のとおりです。

私の文法規則は次のとおりです。

命令型プログラミング言語で見られるような変数のリストを定義するだけです (この特定の言語では、変数には整数のみを割り当てることができます)。

私の字句解析器 (ファイルの Haskell 部分) には、次のデータ型があります。

そのため、解析後、宣言され、データ「ArithmeticInt 0」で初期化されたすべての変数のリストを取得できます。

プロンプトで「happy」コマンドを実行すると、すべて問題ありません。

しかし、結果の .hs ファイルを GHCI にロードすると、次のようになります。

VariablesListtype を typeに一致させることができないという広範なエラーが表示されます[(String,ArithmeticExpression)]。私が行ったさまざまなテストにより、問題は私のVariablesList文法規則の 2 番目のパターンにあることがわかっています。

特にその($2,ArithmeticInt 0):$4部分。私は Haskell の初心者で、4 番目の引数 ($4) は型VariablesListであり、型(String,ArithmeticExpression)をそれに連結 (:) できないことを理解できます。

どんな種類のヘルプやガイダンスも大歓迎です:)。

編集: 請願により、最小限の作業用 Happy ファイルを次に示します。

実行:

次に、GHCI で以下をロードします。

最後に、それをテストするには:

または、変数が 3 つ未満の任意のリスト。

0 投票する
1 に答える
39 参照

parsing - トークンなしでルールの関連付けを定義する方法は?

次の最小化された文法があります

Exp Expルールは、値に関数を適用するために使用されます。しかし、そのようなものがあればmyFunc 1 2、デフォルトで precendencemyFunc (1 2)になりますが、これは私が望むものではありません。(myFunc 1) 2カリー用に が欲しい。

しかし、非終端記号がない場合、どのように関連付けを定義できますか? やろうとしても%left Exp役に立たないようです。

0 投票する
1 に答える
187 参照

parsing - Parsec で複雑なファイルを解析する

複数のデータ シーケンス (同じ列数、同じ内容など) を含むファイルを Haskell で解析したいと考えています。データ シーケンスは前後のキーワードで区切られます。

私の問題は、Parsec でいくつかのテストを行った結果、Parsec はファイル全体ではなく、ファイルを 1ずつ解析するように作成されているという印象を受けることです。

Parsecは私が望むものを作成するための正しい方法ですか、それとも Happy や Alex のような他のツールを検討する必要あります?

Parsecで複雑なテキスト ファイルを解析する例を提供する Web サイト (または他のリソース) はありますか?


注 : 私が示す例は非常に単純なものです。私のファイルでは、より多くのキーワードと組み合わせを使用すると、事態はより複雑になります。

0 投票する
1 に答える
221 参照

parsing - Happy プロジェクトでは、「templates/wrappers.hs」はどこにありますか?

アレックスとハッピーを使ってパーサーを作ろうとしています。この投稿の指示に従っていますが、問題があります。次のタイプのエラーの原因を突き止めようとしています。

私のレクサーは src/AnsiParser/FrontEnd/Lex.x にあります。そこで、dist/build/AnsiParser/FrontEnd/Lex.hs を調べたところ、次のようなものしか見つかりませんでした。

しかし、システム上に「wrapper.hs」という名前のファイルが見つかりません。このエラーの原因を追跡するにはどうすればよいですか?

役に立つ場合に備えて、Parse.y の縮小版を次に示します。

そして Lex.x:

0 投票する
1 に答える
835 参照

parsing - Happy が解析エラーをスローする原因は何ですか?

私は Alex で字句解析器を書き、それを Happy で書かれたパーサーに接続しようとしています。膨大な量のコードを貼り付けずに、問題を要約するために最善を尽くします。

lexer の単体テストから、文字列"\x7"が lexed されることを知っています。

私のトークンタイプ(レクサーによって吐き出される)はToken. ここで説明したようにlexWrapandを定義しました。これにより、次のヘッダーとトークンの宣言が得られます。alexEOF

パーサーとレクサーの組み合わせを次のように呼び出します。

そして、ここに私の最初のいくつかの作品があります:

Exprandのデータ型宣言NonPrintは長く、ここではコンストラクターCmdNonPrintマターだけなので省略します。この関数parseNonPrintは、Parse.y の下部で次のように定義されています。

また、私のエラー処理関数は次のようになります。

このように書くと、次の hspec テストに合格することが期待されます。

しかし、代わりに、"exprs 30"print once (5 つの異なる単体テストを実行しているにもかかわらず) とparseExprreturnのすべてのテストが表示されRight []ます。なぜそうなるのかはわかりませんが、exprsそれを防ぐためにプロダクションを変更しました:

これで、ヒットした最初のトークンですべてのテストが失敗します --- 次のようにparseExpr "\x7"失敗します。

exprs -> expr -> nonprint -> NONPRINTそして、パーサーがパスをたどって成功することを期待していたので、私は完全に混乱しています。この入力によってパーサーがエラー状態になる理由がわかりません。どのtraceステートメントもヒットしません (最適化されていますか?)。

私は何を間違っていますか?

0 投票する
1 に答える
1818 参照

haskell - Stack で Happy、Alex、その他のビルド ツールを呼び出すにはどうすればよいですか?

コンパイラの一部として、ビルド プロセスの一部として実行する必要がalexあります。happyStack はこのシナリオをどのようにサポートしますか?

おまけ:どうすればalexandhappyをコンパイル時の依存関係として登録できますか?

0 投票する
1 に答える
806 参照

parsing - Happy による解析: 左再帰と右再帰

Happy ユーザーマニュアルのセクション 2.2では、右再帰は「非効率的」であるため、右再帰ではなく左再帰を使用するようにアドバイスしています。基本的に彼らは、アイテムの長いシーケンスを解析しようとすると、右再帰は解析スタックをオーバーフローさせるのに対し、左再帰は定数スタックを使用すると言っています。与えられた標準的な例は

残念ながら、これはアイテムのリストが逆向きに出てくることを意味します。

これで、最後に適用するのは簡単です (ただし、パーサーが定義されている場所ではなく、パーサーが呼び出されるreverseたびにこれを行う必要があるのは非常に面倒です)。しかし、アイテムのリストが大きい場合、Haskell スタックもオーバーフローするのでしょうか? いいえ?reverse

基本的に、任意のサイズのファイルを解析し、結果を正しい順序で取得できるようにするにはどうすればよいですか?

0 投票する
0 に答える
36 参照

parsing - Happyでルールエイリアスを定義する

私は言語仕様を読んでいて、それ用のパーサーを書こうとしています。仕様では、同じものに対して複数の名前が使用されている場合があります。これを次のように Happy 文法にコピーしようとしました。

残念ながら、これにより Happy はひっくり返り、「競合の削減/削減」について愚痴をこぼし始めます。基本的に、問題は、 a を見たときに、それを aまたは afooに減らすかどうかわからないことのようです。真実はもちろん、それらはすべて同一であるため、私は気にしません。しかし、それはまだハッピーを動揺させます—それは言語的に皮肉なことですが、他に何もありません.barbaz

bar(また、 を言及するルールと を言及する別bazのルールがある場合、「間違った」リダクションが選択された場合、正しいルールが実行されない可能性があることも少し怖いです。つまり、パーサーには 100% の問題が発生します。デバッグすることは不可能です。)

Happyに「私が何を言おうと、私が言っbarたふりをfooして、あなたの人生を続けてください」と伝える方法はありますか?

明らかに、外部ツールを使用してテキストの検索と置換を行うこともできますが、ビルドステップをさらに追加する必要はありません...

0 投票する
1 に答える
138 参照

parsing - あいまいな文法と可能な修正

したがって、私はこの言語の文法を持っています。文法には確かにいくつかのあいまいさが含まれていますが、これを修正するのは少し異常に難しいと感じています。以下は、この言語の BNF 文法であり、その下に私のハッピー パーサー ファイルの部分があります。

提案された言語の BNF:

パーサー.y

編集: BNF 形式に矢印を追加しました。これは、文法のあいまいさの原因と思われるものを示しています。

0 投票する
1 に答える
68 参照

haskell - Haskell: GHC 7.10.3 で Happy 1.19.5 を使用する際の問題

Happy の最新バージョンでは、GHC 7.10.4 で次のエラー メッセージが表示されます。

インスタンス宣言のスーパークラスから生じる (Applicative HappyIdentity) のインスタンスはありません

Happyを台無しにするべきではないと思いますが、どうすれば問題を解決できますか?