Yacc構文定義ファイルの内容(前半)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/02/16 05:20 UTC 版)
「Yacc」の記事における「Yacc構文定義ファイルの内容(前半)」の解説
課題プログラムのYacc構文定義は以下のように作ることができる。これをたとえば、ファイル "wiki_sample.y" に入れ、Lex出力ソースに代えて後述の「後半」内容をつないで作成し、上記#コマンド例のように実行すればよい。 %{ /*----- 【1】ここからC宣言部(C declarations) -----*/ #include
※この「Yacc構文定義ファイルの内容(前半)」の解説は、「Yacc」の解説の一部です。
「Yacc構文定義ファイルの内容(前半)」を含む「Yacc」の記事については、「Yacc」の概要を参照ください。
Yacc構文定義ファイルの内容(後半)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/02/16 05:20 UTC 版)
「Yacc」の記事における「Yacc構文定義ファイルの内容(後半)」の解説
上記 wiki_sample.y 前半に引き続き後半として記述すべき追加Cプログラム例は、以下のとおりである(ここではユーザが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構文定義ファイルの内容のページへのリンク