曖昧な文法への対処とは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > ウィキペディア小見出し辞書 > 曖昧な文法への対処の意味・解説 

曖昧な文法への対処

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/02/16 05:20 UTC 版)

Yacc」の記事における「曖昧な文法への対処」の解説

この方式では、次の有名な例のように、同じ入力を同じ構文規則複数解釈ができてしまう曖昧性避けられない。 /* stmt2って一体どっちのIFが不成立のときに実行したいの? */ IF expr1 IF expr2 stmt1; ELSE stmt2; Yaccではyaccコマンド実行時解釈複数生じ曖昧なケース発見した場合に「還元還元衝突警告」または「シフト還元衝突警告」を出す。これによって、文法作成中なら文法を、そうでなければ構文規則改良するきっかけ得られる。 まず「還元還元衝突警告」が出た場合であるが、パーサ正しい処理をできない構文要素生じてしまうので、文法、または構文規則Yacc定義を直した方がよい。 ある非終端記号から別の非終端記号に至る呼び出しパス複数あれば、それは間違いなので直す。 しかし元の言語が複雜すぎてうまく直せない場合は、片方実体は同じでも別の名前を付けトークン由来構成するようにし、Lex側がどちらのトークンYaccパーサに出すかは状態に応じて変えるようにコーディングしておく方法がある: 状態がトークン列だけから一意決められるならLex単独処理できる。しかし、Yacc実行時にあるルールマッチ検出したときにはじめて状態を変えたいという複雜なケースでは、次のようにする。LexYaccで共通の状態変数設けておき、Yaccの{ }内に記述するアクションで、区別したい何かのフェーズなどの状態に応じて状態変数値を変えてやる。そうすればLex生成したレキシカルアナライザは、実行時にまさに読んでいる入力トークン列による状態変数に応じて、ある入側トークンを別々のトークン動的に変換し分けてYacc生成したパーサに渡す、という方法である。非常にダイナミックな技である。 次にシフト還元衝突」であるが、このときYacc標準で、(特に演算子優先規則指定されていないかぎり)シフトを選ぶようにできている。たとえば上記の例ではexpr2不成立のときにstmt2を実行するようにパーサテーブル作られるこのように距離の近い記号の関係を優先するよう動作するのは、多くプログラミング言語コンパイラ向いているといわれているが、後述のように注意が必要である。 構文上期待外のトークンがくるとアクションが見つからないので、パーサは、状態を戻してerrorという特定トークンアクションがその状態に定義されているかどうか調べ、あれば実行する最大3回まで戻しても見つからないときには入力テキスト途中でもそこでパース打ち切ってしまう。これを利用してたとえば命令リストerrorトークンのみの右辺をOR(|)結合しておけば、ある命令属すオペランド期待トークンがあっても、そこで警告出して次の命令以降パース続行してくれる、使いやすいコンパイラ作ることができる。ただ最大3回固定なので、深さの差3以内の上位にerror処理する構文書いておかなければ利用できない。またはy.tab.cファイル変数yyerrstatusの初期値10などと増やしてやる必要があるYacc実行時報告されるシフト還元衝突は、シフト選ばれるだけで十分と確信できるケース以外は、実は本来0件にしておくべきである。なぜならパーサ実行時シフト選ばれ動作することにより、入力されトークン列によっては行き止まりになる。すなわち期待外のトークンとされ、上記エラー処理飛んでしまうからである。Yacc衝突対応する枝分かれをすべてバックトラックたどって解空間を全探索するようにはできていないのであるこのため衝突残しておくとパーサを当然通ると思った入力通らず苦労することになる。

※この「曖昧な文法への対処」の解説は、「Yacc」の解説の一部です。
「曖昧な文法への対処」を含む「Yacc」の記事については、「Yacc」の概要を参照ください。

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



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

辞書ショートカット

すべての辞書の索引

「曖昧な文法への対処」の関連用語

1
4% |||||

曖昧な文法への対処のお隣キーワード
検索ランキング

   

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



曖昧な文法への対処のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

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

©2025 GRAS Group, Inc.RSS