東京工科大学 コンピュータサイエンス学部 亀田弘之

Slides:



Advertisements
Similar presentations
2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
Advertisements

文法と言語 ー字句解析とオートマトンlexー
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
第2章 数値の入力と変数 scanfと変数をやります.
第13回構造体.
データ構造とアルゴリズム 第10回 mallocとfree
第12回構造体.
プログラミング論 I 行列の演算
第2回ネットワークプログラミング 中村 修.
文法と言語 ー文脈自由文法とLR構文解析2ー
構造体.
計算機科学実験及演習3 (ソフトウェア) 大本 義正 馬谷 誠二.
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
演習問題の答え #include #include #define NUM 5 typedef struct { // 構造体の定義 float shincho; // 身長 float taiju; // 体重 } shintai; void hyouji(shintai.
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ2015 第10回目 〜資料番号 H28NoA〜
第10回 プログラミングⅡ 第10回
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング2 関数
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング論 ファイル入出力
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
言語プロセッサ 第7回目 平成27年11月16日.
文法と言語 ー字句解析とオートマトンlexー
文法と言語 ー字句解析とオートマトンlexー
FlexとBison+アルファ -実習編-
関数の定義.
第10回関数 Ⅱ (ローカル変数とスコープ).
東京工科大学 コンピュータサイエンス学部 亀田弘之
木の走査.
プログラミング演習I 2003年6月25日(第10回) 木村巌.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
プログラミング入門2 第11回 情報工学科 篠埜 功.
プログラミング論 ファイル入出力
東京工科大学 コンピュータサイエンス学部 亀田弘之
第11回 プログラミングⅡ 第11回
文法と言語 ー文脈自由文法とLR構文解析2ー
東京工科大学 コンピュータサイエンス学部 亀田弘之
平成20年10月5日(月) 東京工科大学 コンピュータサイエンス学部 亀田弘之
型の compatibility とポインタ演算
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
B演習(言語処理系演習)第2回 田浦.
構造体と共用体.
C++ 構文解析 構文解析器の状態保存と復元
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
文法と言語 ー字句解析とオートマトンlexー
第5回 プログラミングⅡ 第5回
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
extern の意味 (C プログラミング演習,Visual Studio 2019 対応)
モジュール分割.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
文法と言語 ー文脈自由文法とLR構文解析2ー
第12章 乱数という業の深い存在 ~ランダムな値・他~
プログラミング演習I 2003年6月11日(第9回) 木村巌.
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
printf・scanf・変数・四則演算
第2章 数値の入力と変数 scanfと変数をやります.
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

東京工科大学 コンピュータサイエンス学部 亀田弘之 言語プロセッサ2016 第11日目 東京工科大学 コンピュータサイエンス学部 亀田弘之

(E)BNFを構文図に書き直してみよう! 「PL/0 の処理系を作ろう!」の続き Bisonの復習を中心に (E)BNFを構文図に書き直してみよう! ツールの紹介もします。 (でも自力で描き直せるようにしましょう。) 言語プロセッサ2016(東京工科大学CS学部)

「PL/0 の処理系を作ろう!」の続き (復習でもあるので、大分わかるようになったのではないでしょうか?) 言語プロセッサ2016(東京工科大学CS学部)

Bisonの構造 %{ // C言語の諸定義 %} // トークンなどの定義 %% // 構文規則群 // C言語の関数など 言語プロセッサ2016(東京工科大学CS学部)

Bisonはトークンの情報が必要になると int yylex() を呼び出す。 トークンは、数値として内部的には取り扱われる。 トークンの値は、変数yylvalを介して受け渡される。 変数yylvalはデフォールトではint型のため、異なるデータ型を取り扱うためには、union型を使う。 言語プロセッサ2016(東京工科大学CS学部)

定義部 %{と%}の間に、include文、define文、prototype文、変数宣言を記述する。 Bison宣言部 トークンの定義 %token number PLUS トークンの値は、bison –d dummy.y と実行することで自動生成され、dummy.tab.h という名前のインクルードファイルに書き込まれる。 演算の優先順位の定義 言語プロセッサ2016(東京工科大学CS学部)

構文規則部 BNF風に規則を記述する。 選択記号は|を使う。 規則記述に続けて動作を記述する。 規則右辺の各記号の値は、左から順に$1, $2, $3, … で参照できる。 規則の戻り値は変数$$に代入される。 各規則の末尾は;。 言語プロセッサ2016(東京工科大学CS学部)

例 %{ #include <stdio.h> int yylex(void); void yyerror(char *); %} %token INTEGER %% program: program expr '\n’ { printf( "%d\n”, $2 ); } | ; expr: INTEGER | expr '+’ expr { $$ = $1 + $3; } | expr '-’ expr { $$ = $1 - $3; } void yyerror( char *s ) { fprintf( stderr, "%s\n”, s ); } int main( void ) { yyparse( ); return 0; 言語プロセッサ2016(東京工科大学CS学部)

cal1.tab.h ( bison –d cal1.y で生成) #ifndef YYTOKENTYPE #define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INTEGER = 258 }; #endif /* Tokens. */ #define INTEGER 258 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef int YYSTYPE; #define yystype YYSTYPE /* obsolescent; will be withdrawn */ #define YYSTYPE_IS_DECLARED 1 #define YYSTYPE_IS_TRIVIAL 1 extern YYSTYPE yylval; 言語プロセッサ2016(東京工科大学CS学部)

lexer.l %{ #include "y.tab.h" #include <stdlib.h> void yyerror(char *); %} %% [0-9]+ { yylval = atoi(yytext); return INTEGER; } [-+\n] { return( *yytext); } [ \t] { /* skip whitespace */ } . { yyerror( "Unknown character” ); } int yywrap( void ) { return 1; } 言語プロセッサ2016(東京工科大学CS学部)

次の例 言語プロセッサ2016(東京工科大学CS学部)

%{ #include <stdio. h> /. Printf. / #include <stdlib. h> / %{ #include <stdio.h> /* Printf */ #include <stdlib.h> /* exit */ #define YYSTYPE int int yyparse( void ); int yylex( void ); void yyerror( char *mes ); %} %token number %token QUIT 254 %% . . . → next page int main() { printf("Enter expression with + - * / ( ) \n"); yyparse(); return 0; } void yyerror( char *mes ) { fprintf( stderr, “%s\n”, mes); } 言語プロセッサ2016(東京工科大学CS学部)

program : program expr ‘\n’ { printf( “= %d\n”, $2 ); } | ; expr : expr '+' term { puts( "expr 1” ); $$ = $1 + $3; } | expr '-' term { puts( "expr 2” ); $$ = $1 - $3; } | term { puts( "expr 3” ); $$ = $1; } | QUIT { exit( 0 ); } term : term '*’ fact { puts( "term 1” ); $$ = $1 * $3; } | term '/’ fact { puts( "term 2” ); $$ = $1 / $3; } | fact { puts( "term 3” ); $$ = $1; } fact : number { puts( "fact 1” ); $$ = $1; } | '-’ number { puts( "fact 1” ); $$ = -$2; } | '(’ expr ')' { puts( "fact 2” );$$ = $2;} 言語プロセッサ2016(東京工科大学CS学部)

cal2.tab.h ( bison –d cal2.y ) /* Tokens. */ #ifndef YYTOKENTYPE #define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { number = 258, QUIT = 254 }; #endif #define number 258 #define QUIT 254 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef int YYSTYPE; #define yystype YYSTYPE /* obsolescent; will be withdrawn */ #define YYSTYPE_IS_DECLARED 1 #define YYSTYPE_IS_TRIVIAL 1 extern YYSTYPE yylval; 言語プロセッサ2016(東京工科大学CS学部)

(E)BNFを構文図に書き直してみよう! (黒板を使います。) 言語プロセッサ2016(東京工科大学CS学部)

P ::= A. P ::= A B. A A B P ::= [A]. P ::= {A}. A A 構文図で描くともっとわかりやすい 言語プロセッサ2016(東京工科大学CS学部)

構文図の例(1) ident number expression factor ) ( factor = ident | number | "(" expression ")" . factor ident number expression ( ) 言語プロセッサ2016(東京工科大学CS学部)

構文図の例(2) + + expression term term ー term ー 言語プロセッサ2016(東京工科大学CS学部)

PL/0言語の構文規則 練習 構文図で書いてみよう! 練習 構文図で書いてみよう! PL/0言語の構文規則 program = block "." . block = [ "CONST" ident "=" number { "," ident "=" number } ";" ] [ "VAR" ident { "," ident } ";" ] { "PROCEDURE" ident ";" block ";" } statement . statement = [ ident ":=" expression | "CALL" ident | "?" ident | "!" expression | "BEGIN" statement { ";" statement } "END" | "IF" condition "THEN" statement | "WHILE" condition "DO" statement ] . condition = "ODD" expression | expression ( "=" | "#" | "<" | "<=" | ">" | ">=" ) expression . expression = [ "+" | "-" ] term { ( "+" | "-" ) term } . term = factor { ( "*" | "/" ) factor } . factor = ident | number | "(" expression ")" . 言語プロセッサ2016(東京工科大学CS学部)