私は、いわゆる適応LL(*)アルゴリズムに基づいたパーサージェネレータであるANTLR v4について学んでいます。 LL(*)アルゴリズムと比較して大きな改善点であると主張している。しかし、私はLRのようないくつかのアルゴリズムについても聞いた。パーサを構築するためにどのように多くの現代のアルゴリズムパーサーを構築する方法はいくつありますか?
- あります
ので、好奇心から全体像を取得しますか?
- ANTLRのアダプティブLL(*)アルゴリズムの利点/限界は何ですか?
私は、いわゆる適応LL(*)アルゴリズムに基づいたパーサージェネレータであるANTLR v4について学んでいます。 LL(*)アルゴリズムと比較して大きな改善点であると主張している。しかし、私はLRのようないくつかのアルゴリズムについても聞いた。パーサを構築するためにどのように多くの現代のアルゴリズムパーサーを構築する方法はいくつありますか?
ので、好奇心から全体像を取得しますか?
パーサーを構築するためにいくつの現代的なアルゴリズムがありますか?
まず、一般的なパーサージェネレータのリストを見ることができます。
参照:Comparison of parser generatorsおよび見出しParsing algorithm
を参照してください。
ALL(*)
Backtracking Bottom-up
Backtracking LALR(1)
Backtracking LALR(k)
GLR
LALR(1)
LR(1)
IELR(1)
LALR(K)
LR(K)
LL
LL(1)
LL(*)
LL(1), Backtracking, Shunting yard
LL(k) + syntactic and semantic predicates
LL, Backtracking
LR(0)
SLR
Recursive descent
Recursive descent, Backtracking
PEG parser interpreter, Packrat
Packrat (modified)
Packrat
Packrat + Cut + Left Recursion
Packrat (modified), mutating interpreter
2-phase scannerless top-down backtracking + runtime support
Packrat (modified to support left-recursion and resolve grammar ambiguity)
Parsing Machine
Earley
Recursive descent + Pratt
Packrat (modified, partial memoization)
Hybrid recursive descent/operator precedence
Scannerless GLR
runtime-extensible GLR
Scannerless, two phase
Combinators
Earley/combinators
Earley/combinators, infinitary CFGs
Scannerless GLR
delta chain
パーサジェネレータに加えて、解析する他のアルゴリズム/手段もあります。特にPrologはDCGであり、正式なトレーニングなしに最初のパーサを最初から書いた人の多くは、通常recursive descent
で始まります。また、Chart parserおよびLeft corner parser。
パーザを書く際に、私が常に尋ねる最初の質問は、Chomsky hierarchyの中で最も高いタイプの言語の文法をどうやって作ることができるかということです。ここで、最低はタイプ0であり、最高はタイプ-3である。
タイプ2の文法(context-free grammars)のほぼ90%は、より簡単なタスクではタイプ3の文法(regular grammars)です。私はタイプ1の文法(context-sensitive grammars)とタイプ0の文法(unrestricted grammars)で実験しました。
ANTLRのアダプティブLL(*)アルゴリズムの利点/制限は何ですか?実用的な観点から
Adaptive LL(*)
で Adaptive LL(*) Parsing: The Power of Dynamic Analysisは、あなたがより速くあなたがいるのでできるだけ多くの解析理論を理解する必要がないため、作業パーサに文法から取得することができます:
Terrence ParrAdaptive LL(*)
の作成者によって書かれた紙を参照してください。 Adaptive LL(*)
は、あなたが知らないうちに文法に載せている鉱山を踏み外すのに十分な機敏さです。これは、あなたが知らないうちに文法に入れた鉱山の中には、パーサーの実行時に非効率につながるものがあるということです。
最も実用的なプログラミング言語の目的では、Adaptive LL(*)
で十分です。 IIRC Adaptive LL(*)
を行うことができないタイプ0文法(unrestricted grammars)私が言ったようにPrologのDCGは、しかし、ほとんどの人と最も一般的なプログラミングタスクのみ3.
はまた、ほとんどのパーサジェネレータは、タイプ2のためのもののいずれかのタイプ2またはタイプを必要とすることができましたしかし、それは彼らがタイプ1をやっていないか、あるいはタイプ0をすることができないということを意味するものではありません。
解析ツールまたはライブラリを使用するたびに、それを使用する方法とできないことを学習する学習曲線があります。あなたが/解析を字句する新機能で、本当にそれはもっとしてコースを受講および/またはこのテーマに書かれていCompilers: Principles, Techniques, and Tools (2nd Edition)
はい、あなたが本当に望んでいるのは、最小限の大騒ぎで最も幅広い範囲の言語をカバーするパーサージェネレータエンジンです。実際の問題として、GLRはこの正面(任意の文脈自由文法)で非常にうまく機能し、多くのツールで利用可能です。 GLLも同様に良いですが、見つけるのはかなり難しいです。 EarleyはOKですが、効率的ではありません。少なくともコード化は比較的簡単です。実際の文法には他のすべてが問題を抱えています。どの構文解析ピットの中に入るのか、特定の文法のためにピットをどれくらい外に出すのかを選択するだけです。 ANTLRを含む。 –
私はイラクヴァスターが言っている方法が好きです。「あなたはどのパース・ピットに入るのかを選択するだけです。あなたの特定の文法のためにピットを登るのにどれだけの労力が必要ですか? ANTLRを含む。 –
全体の本を読んで理解したい場合は
は、私はこの質問があまりにも広く、怖いですSOのために。 –
このトピックについていくつかの本をお勧めしますか?ありがとう。 – smwikipedia
IMHOでは、さまざまな文法やレクサー/パーサーを作成するというテーマは、実際の興味よりも学問的です。完了した作業とコンパイラで費やされた時間の大半は「オプティマイザ」にあります。 –