Yacc構文定義ファイルの内容とは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > ウィキペディア小見出し辞書 > Yacc構文定義ファイルの内容の意味・解説 

Yacc構文定義ファイルの内容(前半)

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

Yacc」の記事における「Yacc構文定義ファイルの内容(前半)」の解説

課題プログラムYacc構文定義は以下のように作ることができる。これをたとえば、ファイル "wiki_sample.y" に入れLex出力ソース代えて後述の「後半内容つないで作成し上記#コマンド例のように実行すればよい。 %{ /*----- 【1】ここからC宣言部(C declarations) -----*/ #include #include #include #define YYDEBUG 1 %} /*----- 【2】ここからYacc宣言部Yacc declarations) -----*/ %start dialogue; /* 文法規則部記述する最大構造の名前 */ %union { /* 意味値に可能な値型集合 */ int ival; /* 4バイト.*/ long double ldval; /* 12バイト.*/ } %token EOL /* トークン終端記号)の定義.*/ %token NUM /* トークン終端記号)とその意味値yylvalの型の定義.*/ %type expr /* グループ非終端記号)とその意味値yylvalの型の定義.*/ %left '+' '-' /* 優先順序等の定義. 優先の低から高に配列する.*/ /* leftは左結合性.例:1-2-3 は 1-(2-3) ではなく (1-2)-3 */ %left '*' '/' '%' %left UPLUS UMINUS /* 単項演算子のほうの記号 */ %right EXPONENT; /* べき乗を表す「**」*/ %% /*----- 【3】ここから文法規則部Grammar rules) -----*/ dialogue: /* 空 */ /* 規則1 0行もOK.*/ | dialogue EOL { prompt(); } /* 規則2 空行.*/ | dialogue qa EOL /* 規則3 Q&A行. */ | dialogue error EOL { yyerrok; prompt(); } /* 規則4 エラー回復処理.*/ /* 末尾に「;」を書いてもよい.*/ qa: expr { printf(" Ans = %Lg", $1); prompt(); }/* 規則5 改行計算表示.*/ expr: NUM /* 規則6 「$$=$1;」は省略可 */ | '+' expr %prec UPLUS { $$ = $2; } /* 規則7 優先順位変更.*/ | '-' expr %prec UMINUS { $$ = - $2; } /* 規則8 優先順位変更.*/ | expr '+' expr { $$ = $1 + $3; } /* 規則9 加算.*/ | expr '-' expr { $$ = $1 - $3; } /* 規則10 減算.*/ | expr '*' expr { $$ = $1 * $3; } /* 規則11 乗算.*/ | expr '/' expr { $$ = $1 / $3; } /* 規則12 除算.*/ | expr '%' expr { $$ = ((int)$1) % ((int)$3); } /* 規則13 剰余.*/ | expr EXPONENT expr { $$ = powf($1, $3); } /* 規則14 指数.powfはC99規格.*/ | '(' expr ')' { $$ = $2; } /* 規則15 カッコ.*/ %% /*----- 【4】ここから追加Cプログラム部Additional C code) -----*/ 《ここに後述の「[[#Yacc構文定義ファイルの内容(後半)|後半]]」を記述する

※この「Yacc構文定義ファイルの内容(前半)」の解説は、「Yacc」の解説の一部です。
「Yacc構文定義ファイルの内容(前半)」を含む「Yacc」の記事については、「Yacc」の概要を参照ください。


Yacc構文定義ファイルの内容(後半)

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

Yacc」の記事における「Yacc構文定義ファイルの内容(後半)」の解説

上記 wiki_sample.y 前半引き続き後半として記述すべき追加プログラム例は、以下のとおりである(ここではユーザがyylex()関数を手で書いているが、同じ機能プログラムは、FLex字句規則与えて自動生成させた方がスマートであろう)。 int pass = 0; /* 通過回数.*/ int lineno = 1; /* 行番号.*/ int tokenno = 1; /* 行内トークン番号.*/ /* 字句解析器 yylex.トークン要求するときyyparseから呼び出される. ここでは手で書いているが,Lex, Flexなどの字句解析器生成器使えば自動生成が可能. */ int yylex(void) { if (pass++ == 0) { printf(" Calculator start."); prompt(); } int c; /* 空白Cr読みとばす.*/ while ( (c = getchar() ) == ' ' || c == 0x0d || c == '\t'){ } if (c == EOF) { /* ファイル終端コマンドプロンプトではCtrl-Dで入力可能. */ printf(" Bye.\n"); return 0; } if (c == '\n') { /* 改行NL検出. */ lineno++; tokenno = 0; return EOL; } tokenno++; if( isdigit(c) ) { long long int val = (c - '0'); while ( isdigit(c = getchar() ) ) { val = val * 10 + c - '0'; } yylval.ldval = (long double)val; ungetc(c, stdin); //printf(" 入力整数val=%lld, 意味値 yylval=%Lf, トークンコード NUM=%d\n", // val, yylval.ldval, NUM); return(NUM); } /* printf("c=%d\n", c); */ if (c == '*') { if ( (c = getchar() ) == '*') { return EXPONENT; /* 指数演算子の「**」だった.*/ } ungetc(c, stdin); /* 「**」ではなく乗算演算子の「*」だった.*/ c = '*'; } /* その他のコードそのまま伝え,'%' など直接文字コード判定させている.*/ return(c); } /* 入力促進文字表示する.*/ int prompt(void) { printf( "\n ?> "); } /* エラー発生時にyyparseから呼び出される. * 引数: yyparseから渡ってくるエラーメッセージ文字列. */ yyerror (char* str) { printf (" Error! {%s}\n lineno{%d} near tokenno{%d} yychar{%d} \n", str, lineno, tokenno, yychar); } /** 生成され構文解析器メインプログラムになる.*/ int main(void) { yydebug = 0; /* Yacc動作トレースしたいとき1にする.*/ yyparse(); /* 生成され構文解析関数を呼ぶ.*/ }

※この「Yacc構文定義ファイルの内容(後半)」の解説は、「Yacc」の解説の一部です。
「Yacc構文定義ファイルの内容(後半)」を含む「Yacc」の記事については、「Yacc」の概要を参照ください。

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



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

辞書ショートカット

すべての辞書の索引

「Yacc構文定義ファイルの内容」の関連用語

1
12% |||||

Yacc構文定義ファイルの内容のお隣キーワード
検索ランキング

   

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



Yacc構文定義ファイルの内容のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

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

©2025 GRAS Group, Inc.RSS