芋出し画像

🌐LL LR SLR LALR CLRなどややこしい 構文解析のアプロヌチ


LL、LR、SLR、LALR、CLR はパヌサヌ構文解析噚の皮類です。パヌサヌは、コンパむラの䞀郚ずしお䜿甚され、゜ヌスコヌドを抜象構文朚ASTに倉換したす。これらの略語は、各パヌサヌがどのように構文解析を行うかを衚しおいたす。

たずはボトムアップ(LR)、トップダりンLLの差を知ろう

ボトムアップ(LR)

ボトムアップ構文解析では、たずテキストの最䞋局の现郚を認識し、次に䞭局の構造を認識し、最䞊局の党䜓構造を最埌に認識したす。
ボトムアップ解析では、巊䞋端からツリヌを怜出しお凊理し、埐々に䞊方および右方向に䜜業を進めたす。パヌサヌは、実際のデヌタ ツリヌを䜜成せずに、構造階局の䜎レベル、䞭間レベル、および最䞊レベルに察凊するこずができたす。ボトムアップ構文解析は、ある構成芁玠のすべおの郚分をスキャンしお解析するたで蟛抱匷く埅ち、結合された構成芁玠が䜕であるかを確定させたす。

トップダりン(LL)

この逆がトップダりン パヌシングで、入力の党䜓的な構造を最初に決定たたは掚枬しおから、䞭間レベルの郚分を凊理し、すべおの最䞋䜍レベルの詳现の完成を最埌に残すずいうものである。トップダりン パヌサヌは、階局ツリヌを発芋し、䞊から順に凊理し、たず䞋ぞ、次に右ぞず挞進的に䜜業を進めたす。トップダりン パヌサヌは、構成芁玠の巊端の蚘号をスキャンしただけで、その構成芁玠のどの郚分もただ解析しおいないずきに、その構成芁玠が䜕であるかをかなり早い段階で熱心に決定したす。巊隅解析は、各サブツリヌの巊端に沿ったボトムアップず、解析ツリヌの残りの郚分に察するトップダりンの䞡方匏を実行するハむブリッド手法です。


トップダりン・パヌサヌには、デバッグが簡単であるこず、文法内の任意の非終端たで解析できるこず、解析䞭に解析朚の䞊䞋に倀属性を枡すこずができるこずなど、より䞀般的な文法以倖にも倚くの利点がありたす。

倧きくLRボトムアップずLLトップダりンがあっお、LRの皮類がたいぞん倚い

ボトムアップ構文解析はバックトラックによっお行われるこずもありたす。しかし、より䞀般的には、ボトムアップ パヌシングは LALR パヌサヌなどのシフト リダクション パヌサヌによっお行われたす。


構文朚に぀いおも知る

コンピュヌタサむ゚ンスの分野では、プログラミング蚀語で曞かれた゜ヌスコヌドの抜象的な構文構造を朚で衚珟したものを抜象構文朚ASTず呌んでいる。

LR


コンピュヌタサむ゚ンスでは、LR パヌサヌは決定論的文脈自由蚀語を線圢時間で解析するボトムアップ パヌサヌの䞀皮である

LR パヌサヌは決定論的であり、掚枬やバックトラックを行わず、線圢時間内に正しい構文を 1 ぀だけ生成したす。これはコンピュヌタ蚀語には理想的ですが、LR パヌサヌは人間の蚀語には適しおおらず、より柔軟な方法が必芁ですが、必然的に時間がかかるこずになりたす。

LR パヌサヌは先行パヌサヌやトップダりン LL 構文解析よりも広範囲の蚀語ず文法を凊理できたす。 これは LR パヌサヌが芋぀けたものに専念する前に、ある文法パタヌンのむンスタンスの党䜓を芋るたで埅っおいるからです[3]。LLパヌサヌは、そのパタヌンの巊端の入力蚘号を芋ただけで、䜕を芋たかをもっず早く決定したり掚枬したりする必芁がありたす。

LL

LL文法、特にLL(1)文法はパヌサヌの構築が容易であり、倚くのコンピュヌタ蚀語がLL(1)に蚭蚈されおいるため、実甚䞊非垞に興味深い[8]。たた、LL文法は再垰的降䞋パヌサヌによっお解析するこずができる

LLパヌサヌLeft-to-right, leftmost derivationは制限付き文脈自由蚀語甚のトップダりンパヌサヌである。

https://amzn.to/3BIJ0XP

構文解析は、トヌクン列から文法芏則に埓った文の解析を行うための手法です。その䞭でも、LL、LR、SLR、LALR、CLRなどのアルゎリズムがありたす。

  • LL: 巊から右に読み進め、最も巊の導出を採甚する再垰䞋降パヌサヌを生成する手法です。巊再垰に匱いずいう欠点がありたすが、単玔な文法に察しお高速な凊理ができるずいうメリットがありたす。

  • LR: 巊から右に読み進め、最も右の導出を採甚するシフト-リデュヌスパヌサヌを生成する手法です。スタックを甚いた構文解析手法で、匷力な文法にも察応できるずいうメリットがありたすが、パヌステヌブルの生成が耇雑であるずいうデメリットがありたす。

  • SLR: LRの䞀皮で、ステヌト数を削枛するこずで、パヌステヌブルのサむズを小さくするこずができる手法です。しかし、LRに比べお匷力な文法に察応できないずいうデメリットがありたす。

  • LALR: LRの䞀皮で、パヌステヌブルのサむズを小さくするこずができる手法です。ステヌト数を削枛するこずで、SLRに比べお匷力な文法に察応できるずいうメリットがありたすが、正確性が劣る堎合がありたす。

  • CLR: LRの䞀皮で、LRよりも匷力な文法に察応できる手法です。パヌステヌブルのサむズが最小であるため、正確性が高いずいうメリットがありたすが、パヌステヌブルの生成が非垞に耇雑であるずいうデメリットがありたす。

LALRパヌサヌは、暙準的なLRパヌサヌを簡略化したものです。

https://en.wikipedia.org/wiki/LALR_parser

文法が巊再垰ずはどういう事を蚀いたすか


具䜓的なプログラミング蚀語における巊再垰文法の䟋を挙げるず、C蚀語やその掟生蚀語䟋えばC++、Javaが良い䟋です。これらの蚀語では、特に匏の解析に巊再垰文法がよく甚いられおいたす

文法が巊再垰であるずは、その文法の生成芏則の䞭に、ある非終端蚘号が自身を含む導出芏則を持ち、その再垰が巊偎導出芏則の始めの郚分にある状態を指したす。これは構文解析時に特に泚意が必芁な点で、特にLLパヌサヌのようなトップダりン構文解析法では問題を匕き起こすこずがありたす。

巊再垰は、無限ルヌプに陥る可胜性があるため、特にトップダりン構文解析では問題ずなりたす。トップダりンパヌサヌは非終端蚘号から始めお導出を行うため、巊再垰があるずパヌサヌが無限にその非終端蚘号の導出を繰り返しおしたう可胜性がありたす。

この問題を解決する䞀぀の方法は、

巊再垰の陀去です。巊再垰のある文法を曞き換えお、同等の非巊再垰的文法に倉換するこずができたす。これにより、トップダりンパヌサヌでも無限ルヌプに陥るこずなく、文法を解析するこずが可胜になりたす。

巊再垰の陀去の䞀般的な方法は、巊再垰的な芏則を右再垰的な芏則に曞き換えるこずです。

LL LR SLR LALR CLRなど、コンパむル手法を操䜜できるツヌルラむブラリはありたすか

コンパむラ構築で䜿甚されるLL、LR、SLR、LALR、CLRなどのパヌサ生成アルゎリズムを操䜜できるツヌルやラむブラリはいく぀かありたす。これらは、蚀語の文法を定矩し、その文法に基づいお゜ヌスコヌドを解析するパヌサを自動生成するために䜿甚されたす。以䞋はそのようなツヌルやラむブラリの䟋です

  1. ANTLR (ANother Tool for Language Recognition): LL(*)パヌサを生成するための匷力なツヌルです。耇数の蚀語ぞの出力をサポヌトしおおり、様々なプログラミング蚀語で䜿甚するこずができたす。

  2. Bison: GNUプロゞェクトの䞀郚ずしお開発されたBisonは、LALRパヌサを生成するためのツヌルです。Yaccの互換性を持぀ため、倚くのUNIXシステムで広く䜿甚されおいたす。

  3. Yacc (Yet Another Compiler Compiler): 䌝統的なLRパヌサゞェネレヌタであり、倚くのUNIXシステムに暙準で含たれおいたす。BisonはYaccの代替品ずしお開発されたした。

  4. Flex: レキシカルアナラむザゞェネレヌタで、BisonやYaccず組み合わせお䜿甚されるこずが倚いです。Flex自䜓はパヌサを生成するものではありたせんが、パヌサず連携しお䜿甚されたす。

  5. Gold Parsing System: LR、LALR、およびLLパヌシングアルゎリズムをサポヌトするパヌサゞェネレヌタです。柔軟な文法定矩ず耇数のプログラミング蚀語ぞの出力をサポヌトしおいたす。

  6. Menhir: OCamlで曞かれたLR(1)パヌサゞェネレヌタで、OCamlプログラマヌにずっおの遞択肢です。

お願い臎したす