問題タブ [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 - あいまいな文法と可能な修正
したがって、私はこの言語の文法を持っています。文法には確かにいくつかのあいまいさが含まれていますが、これを修正するのは少し異常に難しいと感じています。以下は、この言語の BNF 文法であり、その下に私のハッピー パーサー ファイルの部分があります。
提案された言語の BNF:
パーサー.y
編集: BNF 形式に矢印を追加しました。これは、文法のあいまいさの原因と思われるものを示しています。
haskell - Haskell: GHC 7.10.3 で Happy 1.19.5 を使用する際の問題
Happy の最新バージョンでは、GHC 7.10.4 で次のエラー メッセージが表示されます。
インスタンス宣言のスーパークラスから生じる (Applicative HappyIdentity) のインスタンスはありません
Happyを台無しにするべきではないと思いますが、どうすれば問題を解決できますか?
parsing - Haskell Happy パーサーが先に進まない
Oberon に似た言語のパーサーを実装しています。レクサーによって返されるトークンのリストが正しいことがわかるので、Alex を使用してレクサーを正常に作成できました。
パーサーにトークン リストを渡すと、最初のトークンで停止します。
これは私のパーサーです:
これは、パーサーに与えるテスト コードです。
これは、レクサーによって返されるトークン リストです。
パーサーはエラーを出しませんが、私の ProcedureDeclaration ルールに固執し、C のみを出力します。
出力は次のようになります。
理由はありますか?
アップデート:
私は最初の一歩を踏み出し、以前に与えられたテスト入力を解析することができました. 今度はパーサーを変更して、同じレベルの複数のプロシージャーの宣言を認識できるようにしました。これを行うために、これは私の新しいパースがどのように見えるかです:
問題は、コンパイルに失敗して次のエラーが発生することです。
ルールの 2 番目の要素が原因であることは確かですが、そのProcedureDeclarationsList
理由はわかりません。
haskell - 構文ハッピーパーサーの意味
Happy の公式サイトで提供されている happy パーサーにこの文法セクションがありますが、括弧内のルールの意味についてより深い説明が必要です。これがトークンの定義です
そしてここに文法セクションがあります
私が理解しているのは、ファイルの下で定義されているレクサーは、定義されたタイプのトークンのみを生成し、文法を使用して解析ツリーを構築する必要があるということです。しかし、「{Let $2 $4 $6}」とは正確にはどういう意味ですか? $2 が 2 番目のルール引数などを指していることは知っていますが、誰かがルールの「人間が読めるバージョン」をくれれば、私は本当に幸せです。私がはっきりしていることを願っています。
前もって感謝します。
grammar - 関数呼び出しからコンマと括弧を削除する方法
yacc/bison と非常によく似た happy パーサーを使用して記述された関数型言語コンパイラで、次のルールを使用して、いくつかのコア関数map
、concat
およびをリストに実装しました。filter
これは問題なく機能しますが、ほとんどの関数型言語には括弧やコンマがないため、代わりmap(myfun, [1,2,3])
にmap myfun [1,2,3]
. 文法の明らかな変更は次のとおりです。
しかし、この変更には多くのreduce-reduce競合が含まれています。コンマと括弧なしで関数呼び出しを解析するにはどうすればよいですか?
私が抽出できた最小の矛盾する文法は次のとおりです。
4 つの削減/削減競合が生成されます。ルールのいずれかを削除すると、競合が発生します。興味のある方は、ここに完全な文法があります。