構文解析における先読みとは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > ウィキペディア小見出し辞書 > 構文解析における先読みの意味・解説 

構文解析における先読み

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2016/03/13 01:32 UTC 版)

先読み」の記事における「構文解析における先読み」の解説

先読みは、コンパイラでの構文解析でも重要な概念である。構文解析器次に適用すべき生成規則決定する際に入力トークン列を何個先読みする。 LL法LR法LALR法などの構文解析では、後に括弧つき先読みするトークン数を記することが多い(LALR(1)など)。 多くプログラミング言語は、限定的な先読み(1個が典型的)で構文解析できるよう設計されている。というのも先読み制限した方が構文解析器効率化されるためである。1990年Terence Parr は博士論文ANTLR作成し、この傾向重大な変化もたらしたANTLRは、効率的な LL(k) 構文解析器生成するパーサジェネレータであり、k として任意の固定値が可能である。 構文解析器は、各トークン参照したときにとりうるアクション限られている。 shift - トークンスタック積み後で reduce する。 reduce - スタックからトークン取り出し生成規則適用して構文要素構築するend - 構文解析終了終了トークン受け取ったとき) error - 構文規則にないトークン並び入力され場合 conflict - shift すべきか reduce すべきか判断できないまた、reduce適用可能な規則複数あって判断できない場合もある。 先読みには次の2つ利点がある。 conflict 発生時、構文解析器正しい判断をするのを助ける。例えif 文先読みすることで then 節や else 節が完了したことが容易にわかる。 状態数大幅に減らすことができる。C言語先読みしない構文解析器は約10,000の状態があるが、先読みするとこれを約300減らせる。 例として、"1 + 2 * 3" という式を構文解析する場合を示す。この場合生成規則構文規則)は次の通り。 Rule1: E → E + E (式は式と式の加算である) Rule2: E → E * E (式は式と式の乗算である) Rule3: E → number (式は単なる数値である) Rule4: + は * より優先順位が低い。 APLなどの一部例外除いて一般に加算よりも乗算優先順位が高い。従って、上記の例は (1 + (2*3)) と解釈するのが正しい。上記のRule4は生成規則ではなく意味論的規則である点に注意されたい。これを生成規則として表すことも可能である。しかし、意味論的規則全て生成規則変換できるわけではない単純な先読みのない構文解析器次のように動作するreduce - Rule3 に基づき '1' を式 E にする。その E はスタック置かれるshift - 入力 '+' から Rule1 が適用可能となることを予測しつつ、スタック退避するreduce - Rule3 に基づき '2' を式 E にする。 reduce - スタック上の E+新たな入力 E に対して Rule1 を適用して E とする。 shift - 入力 '*' から Rule2 が適用可能となることを予測しつつ、スタック退避するreduce - Rule3 に基づき '3' を式 E にする。 reduce - スタック上の E* と新たな入力 E に対して Rule2 を適用して E とする。 これによって生成される構文木コードは、Rule4 が考慮されていないため正しくない先読みなしで正しく構文解析するには、次のような対処法がある。 ユーザー括弧付きで式を書く。これが不可能なことも多い。 構文解析器バックトラック機能追加し規則違反発生したときなどに再試行する。同様の手法LL法使われている。 reduce 実施遅延させるような論理導入し、どちらの規則先に reduce させるのが適切かを規則照らして判断するLR法このような手法採用している。これによって正し構文解析が可能となるが、状態数増えスタック深くなる先読みのある構文解析器では、次のように動作するshift - 入力 '1' を Rule3 が適用されることを予想しつつスタック退避する即座にreduce しない。 reduce - '+' を先読みして、スタック上の '1' を Rule3 に基づいて E に reduce する。規則上、'+' の前には E しかないため。 shift - 入力 '+' を Rule1 が適用されることを予測しつつスタック退避するshift - 入力 '2' を Rule3 が適用されることを予測しつつスタック退避するreduce - '*' を先読みして、スタック上の '2' を Rule3 に基づいて E に reduce する。規則上、'*' の前には E しかないため。 ここまでで、スタック上には E + E があり、現在の入力は '*' である。従って、Rule1 を適用する reduce を行うという選択肢と、Rule2 に基づいて shift を行うという選択肢がある。Rule4 によれば '*' の方が優先順位が高いので、Rule2 を予測して '*' を shift する。 shift - 入力 '3' を Rule3 が適用されることを予測しつつスタック退避するreduce - 先読みすると入力終了しているので、スタック上の '3' を Rule3 に基づいて E に reduce する。 reduce - スタック上の E * E を Rule2 に基づき E に reduce reduce - スタック上の E + E を Rule1 に基づき E に reduce これによって生成される構文木正しく先読みしない場合よりも効率的に得られる。以上の方式LALR法基づいている。

※この「構文解析における先読み」の解説は、「先読み」の解説の一部です。
「構文解析における先読み」を含む「先読み」の記事については、「先読み」の概要を参照ください。

ウィキペディア小見出し辞書の「構文解析における先読み」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「構文解析における先読み」の関連用語

1
16% |||||

構文解析における先読みのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



構文解析における先読みのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaの先読み (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS