問題タブ [ll]
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.
algorithm - 文脈自由文法の構文解析
ボトムアップパーサーは、左再帰文法を受け入れることができるため、トップダウンパーサーよりも優れていることを私は知っていますが、トップダウン構文解析よりもボトムアップ構文解析を好む他の理由は何でしょうか。
parsing - 関数型プログラミングにおける非再帰的予測テーブル駆動型 LL(1) パーサー
関数型プログラミングで非再帰的予測テーブル駆動型 LL(1) パーサーを構築する最良の方法はどれか知りたい: Haskell または OCaML でのハンドコーディング、またはこれを支援するツールが存在するか?
compiler-construction - 文脈自由文法を左因子化する方法は?
私が理解しているように、次の場合、トップダウンパーサーを構築するには左ファクタリングが必要です。しかし、それを行う方法を理解するのは難しいですか?誰かがここで私を助けてくれますか?ありがとう。
haskell - Parsec: 予測解析
私は haskell のスキルを少ししか持っていないので、parsec で予測解析 (LL*) を実装する方法について助けが必要です。
私は文脈自由文法を持っています:
http://research.microsoft.com/en-us/um/people/daan/download/parsec/parsec.pdf (チャプター予測パーサー) に基づいて、次のコードを書きました。
このコードは '(' との一致を試み、そうでない場合はパーサーが継続して識別子のみに一致することを期待していました。このコードは一致する識別子 '(' args ')' に対してのみ機能します。
識別子「a」でのみ呼び出すと、次がスローされます。
compiler-construction - ANTLRまたはANTLR3を備えたLL(1)テーブル駆動型コンパイラ
ANTLRまたはANTLR3を使用してLL(1)テーブル駆動型(非再帰的)コンパイラーを作成することは可能ですか?
parsing - LL(1) テーブル駆動 (非再帰) ジェネレーター
助けが必要です。LL(1) テーブル駆動 (非再帰) ジェネレーターを探しています。インターネットで何も見つかりません。私が見つけたのは、一連の LR または再帰的解析ジェネレーターだけです :( よろしくお願いします。
ruby - ASTを手動で構築する方法は?
私は現在解析について学んでいますが、AST を生成する方法について少し混乱しています。式が文法に準拠しているかどうかを正しく検証するパーサーを作成しました (式が準拠している場合はサイレントになり、準拠していない場合は例外が発生します)。AST を構築するには、ここからどこに行けばよいですか? LL(1) パーサーの構築に関する情報はたくさん見つかりましたが、AST を構築するための情報はほとんどありませんでした。
私の現在のコード (非常に単純な Ruby で記述され、レクサーとパーサーを含む) は、github にあります: https://gist.github.com/e9d4081b7d3409e30a57
現在持っているものからASTに移行する方法を誰かが説明できますか?
または、Ruby に慣れていなくても C は知っている場合は、ウィキペディアの再帰降下解析の記事で、C コードの AST を構築する方法を教えてください。
注意してください、yacc や antlr のようなパーサー ジェネレーターを使用して作業を実行したくありません。すべてをゼロから実行したいのです。
ありがとう!
antlr - backtrack = trueを使用せずにこれを解決するにはどうすればよいですか?
演算子の優先順位がない文法を作成しようとしていますが、1つの演算子を使用するか、括弧で囲む必要があります。(簡単にするために、ここでは有効な演算子のリストの代わりに、および代わりにtest
使用id|int_literal etc
します)。+
したがって、たとえば:
backtrack = trueを必要としないこのための文法を書く方法はありますか?ここでは左再帰が実際には意味をなさないと思います。構文述語がどのように役立つかはわかりません。
これが私が持っているものです(必須backtrack=true
):
parsing - Scalaパーサーを使用した演算子の結合性
だから私はScalaのパーサーを使って電卓を書こうとしてきましたが、演算子の結合性が逆方向であり、文法を左再帰にしようとすると、完全に明確であるにもかかわらず、次のようになります。スタックオーバーフロー。
明確にするために、次のようなルールがある場合:def extract:Parser [Int] = num〜 "-" 〜add {x => x._1._1 --x._2}次に、7-4-3を評価すると次のようになります。 0ではなく6。
私が実際にこれを実装した方法は、演算子が非リーフノードであり、リーフノードが数値である二分木を構成しているということです。私がツリーを評価する方法は、左の子(オペレーター)の右の子です。7-4-5のツリーを構築するとき、私がそれをどのように見せたいかは次のとおりです。
ここで、-はルート、その子は-と5、2番目の-の子は7と4です。
しかし、私が簡単に構築できる唯一のツリーは
これは違いますが、私が望むものではありません。
基本的に、簡単な括弧は7-(4-5)ですが、私は(7-4)-5が必要です。
どうすればこれをハックできますか?演算子の優先順位に関係なく、正しい演算子の優先順位で計算機を作成できるはずだと感じています。最初にすべてをトークン化してから、トークンを逆にする必要がありますか?右の子の左の子をすべて取り、右の子の親の右の子にし、親を元の右の子の左の子にすることで、ツリーを反転させても大丈夫ですか?一見良いようですが、あまり深く考えていません。足りないケースがあるに違いない気がします。
私の印象では、LLパーサーはスカラパーサーでしか作成できません。別の方法を知っているなら、教えてください!
parsing - 述語パーサーLL1パーサーを使用してこれを解決します
述語パーサーLL1パーサーを使用してこの質問を解決します
E-> EOE | (E)| id
O-> + /-/%/