動作の解説とは? わかりやすく解説

動作の解説

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

Yacc」の記事における「動作の解説」の解説

たとえば、この構文規則から生成した構文解析器が、数値トークンNUM、End Of LineトークンEOLおよび演算子からなるトークン列 NUM '+' NUM '*' NUM '-' NUM EOL を読むとしよう。 ただこの前半では、トークンNUMが何の文字列をもってそう認識するかは定義されていないYaccユーザ与えたYacc文法ファイルには、通常字句解析をするための文法存在していないからである(もっとも、無理に字句解析までやらせることは、複雜になる不可能ではない)。その代わりトークン入力は、yylex()という決まった名前の関数を呼ぶように展開される目的構文解析器実行時に、Yaccによって生成されている構文解析器関数yyparse()は、ひとつひとつトークンをyylex()呼んで要求する。yylex()はどこからか文字列を呼んでひとつトークン返し,あれば変数lval経由その意味値も同時に返しファイル終端達したとき(1行ごとにyyparser()から帰ってはまた呼び出す構文解析器作るにおいては行末達したなどそのプログラム解析まとまり認識している区切り達したとき)はバイナリ0か負数返して知らせる。 利用者はyylex()自分プログラミングするか、LexFlexなどの字句解析ツール使って作成する必要がある。つまりLexFLex、JFLexなどの字句解析器ジェネレータは、Yacc作ってくれない関数yylex()自動作ってくれるツールといえる実際にはこの課題プログラム10+20*30-40 を与えたとして値も追跡したい。この場合後半」のyylex()プログラム構文解析器実行時に、次のトークン群、およびあれば以下でカッコ《》内に付記している意味値を、要求するたびに1個ずつ構文解析器関数yyparser()返してくるはずである。 NUM《10》'+'NUM《20》'*'NUM《30》'-'NUM《40》EOL0(ファイル終端を表す) 最初にスタックが空 の状態で内部にもつ状態番号を0にして%start示されているdialogue調べられる適用できる規則右辺が空の規則1なのでこれが適用される。状態スタックにはその0がはいる。このスタック状態を次のように図示できる。 0:dialogue そして状態番号は1に行く。yylex()の中で初回だけ、 Calculator start. と出しprompt()というユーザ定義関数によって、 ?> と表示する電卓ユーザまたはファイルから、 10+20*30-40 が入力されると、yylex()関数トークン1個ずつyyparser()返していく。 まずNUM《10》が読まれ,状態1での適用規則探される還元できる規則とはスタック右端マッチしないので、ありえる記号としてそのテーブル登録されている「NUM」に対す操作が行われる。すなわち、スタックにはじめてそれが1個シフト入れられ状態5になる. 0:dialogue 1:NUM《10規則6 expr: NUM /* 規則6 「$$=$1;」は省略可 */ (単独のNUMはexpr)だけがマッチするからこれ適用され、 0:dialogue 1:expr10》 に還元されスタック内容入れ替わる。 (この規則6にアクション書いてなかったが、戻り値がないのではなくYaccの空でない規則対するデフォルトアクション { $$ = $1; } が実行され10がこのexprの値に代入されのである。) そしてテーブル書かれていた状態番号10になる。 ここで'+'を読んでシフトし、状態16になってNUM《20》までシフトしたとき、 0:dialogue 1:expr1010:'+' 16:NUM《20》 となるから、先と同様に規則6でNUMがexpr還元され 0:dialogue 1:expr1010:'+' 16:expr20》 (←次に'*'が来る予定) となる(以下、内部状態番号変化省略する次々と遷移していく)。 ここで現在スタック右端にある3トークンexpr '+' expr」が規則9(加算式)にマッチし還元起こりそうに思えるかもしれないが、起こらない先読みしている次のトークン現在の「+」よりも優先順位が高い「*」なので還元はせず、シフトを行う(もし演算子優先順位同列にしていたら還元起こって先に加算をするであろう)。 dialogue expr10》 '+' expr20》 '*' NUM《30》を読んでシフトし dialogue expr10》 '+' expr20》 '*' NUM《30規則6で還元しdialogue expr10》 '+' expr20》 '*' expr30》 ここで、右端の3トークンが | expr '*' expr { $$ = $1 * $3; } /* 規則11 乗算.*/ にマッチしていて、次のトークンは'-'であり、今度遠慮なく還元実行されスタックから3個消えて、意味値が600計算され左辺グループexpr押し込まれるので、 dialogue expr10》 '+' expr600》 のように2個分縮むことになる。 次に先読みしていた「-」読み直す。ここの状態で右端の3トークンが | expr '+' expr { $$ = $1 + $3; } /* 規則9 加算.*/ にマッチしていて、次のトークンは'-'であり、これも還元実行されスタックから3個消えて、意味値が10+600=610計算されグループexpr押し込まれるので、 dialogue expr610》 のようにまた2個分縮む。 (このように還元が起こるたびに、まるでゲームテトリスで同じ色のブロック並んだときのように、スタック伸びてストンストン短くなる還元長く起こらないスタック長くなって、既定サイズ超えるとスタックオーバフロー例外異常終了してしまうのも、ゲームオーバー似ている。なお、スタックオーバフローを起こさないためには、 explist: exp | explist ',' exp のような再帰の形を避けて explist: exp | exp ',' explist のような左再帰の形で定義することである。規模大きくなる場合はスタックサイズの定義マクロYYMAXDEPTHの値を大きく指定する.) またまた先読みしていた「-」読み直す今度さすがに適用できる規則がなくシフトされる。 dialogue expr610》 '-' 次にNUM《40》が読まれてもシフトするしかないdialogue expr610》 '-' NUM《40》 この状態で先読みトークンに、電卓ユーザ押した改行EOLがくる。 dialogue expr610》 '-' NUM《40》 (←次にEOLが来る予定) この状態において、演算子優先度関係ない先読みEOL遠慮する必要がないので、 | expr '-' expr { $$ = $1 - $3; } /* 規則10 減算.*/ がマッチとして還元実行されて、スタックから3個消える。その代わり、意味値が610-40=570と計算されグループexpr押し込まれるので、 dialogue expr《570》 のようにまた2個分縮む。 先読みしていたEOL読み直す。すると、この状態でexprには、 qa: expr { printf(" Ans = %Lg", $1); prompt(); }/* 規則5 改行計算表示.*/ しかマッチせず、アクションprintf関数実行されて, ?> Ans = 570 ?> という計算結果次のプロンプト標準出力見事に出てくる。スタックは、 dialogue qa になったまたまたEOL読んで今度シフトするdialogue qa EOL これはdialogue再帰的規則のひとつ | dialogue qa EOL /* 規則3 Q&A行. */ の3個のトークンマッチするので、還元実行されスタックから3個消えて左辺グループdialogue押し込まれdialogueけになるこのあと入力ファイルにまだ演算させたい式を書いた行が書かれていれば、上と同様に計算され結果表示されるであろう。が、いまの場合ファイル終端になってyylex()が Bye. と表示して0を返す。すると内部的には$endという特殊トークンシフトされ dialogue $end となるが、これが暗黙定義されている規則0 $accept: dialogue $endマッチするので、パーサは$accept受理)を得て目的成功裏果たしたということスタックをすべてクリーンアップして,yyparse()呼出元に制御返すこのようにYacc作るパーサは、解析した文字列最後に%start記号デフォルト最初に書いた規則左辺)に見事にマッチし文法合格した判断されたとき正常に戻り値0でyyparser呼出元に帰るまた、YYACCEPTマクロ実行すれば即正常で帰る構文解析エラー起これば異常(戻り値1)でyyparser呼出元に帰るまた、YYABORTマクロ実行すれば即異常(戻り値1)で帰る途中、意味値をユーザ定義のアクション関数出力すれば、計算目的果たせたことになる。

※この「動作の解説」の解説は、「Yacc」の解説の一部です。
「動作の解説」を含む「Yacc」の記事については、「Yacc」の概要を参照ください。

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



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

辞書ショートカット

すべての辞書の索引

「動作の解説」の関連用語

動作の解説のお隣キーワード
検索ランキング

   

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



動作の解説のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

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

©2025 GRAS Group, Inc.RSS