言語プロセッサ2015 第10回目 〜資料番号 H28NoA〜

Slides:



Advertisements
Similar presentations
プログラミング言語論 プログラミング言語の構 文 水野嘉明. 目次 1. プログラミング言語の構文 2. BNF 3. 文脈自由文法 4. 構文図式 2.
Advertisements

プログラミング言語論 第3回 BNF 記法について(演習付き) 篠埜 功. 構文の記述 プログラミング言語の構文はどのように定式化できるか? 例1 : for ループの中に for ループが書ける。 for (i=0; i
自然言語処理 平成 24 年 11 月 5 日 (No5)- 東京工科大学 コンピュータサイエンス学部 亀田弘之.
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
文法と言語 ー字句解析とオートマトンlexー
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
情報とコンピュータ 静岡大学工学部 安藤和敏
東京工科大学 コンピュータサイエンス学部 亀田弘之
文法と言語 ー文脈自由文法とLR構文解析2ー
プログラミング言語論 第4回 式の構文、式の評価
計算機科学実験及演習3 (ソフトウェア) 大本 義正 馬谷 誠二.
言語処理系(5) 金子敬一.
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ2016 Language Processors 2016
言語プロセッサ2007 平成19年9月26日(水) (Ver.2 平成19年10月3日変更)
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
言語プロセッサ 第7回目 平成27年11月16日.
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング言語論 第3回 BNF記法について(演習付き)
文法と言語 ー字句解析とオートマトンlexー
文法と言語 ー字句解析とオートマトンlexー
FlexとBison+アルファ -実習編-
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
東京工科大学 コンピュータサイエンス学部 亀田弘之
文法と言語 ー文脈自由文法とLR構文解析2ー
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
平成20年10月5日(月) 東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング言語論 第9回 情報工学科 木村昌臣 篠埜 功.
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
プログラミング序論演習.
情報とコンピュータ 静岡大学工学部 安藤和敏
プログラミング演習I 2003年4月30日(第3回) 木村巌.
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
文法と言語 ー字句解析とオートマトンlexー
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
情報とコンピュータ 静岡大学工学部 安藤和敏
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
文法と言語 ー文脈自由文法とLR構文解析2ー
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
4.2 再帰下降解析 (1)再帰下降解析とは ■再帰下降解析(Recursive Descent Parsing)
Presentation transcript:

言語プロセッサ2015 第10回目 〜資料番号 H28NoA〜 ネットワークの準備お願いします! 言語プロセッサ2015 第10回目 〜資料番号 H28NoA〜 東京工科大学 コンピュータサイエンス学部 亀田弘之 言語プロセッサ2016(東京工科大学CS学部)

今日も演習 言語プロセッサ2016(東京工科大学CS学部)

今日も皆でわいわいがやがや、 楽しく演習をやっていきましょう。 まずはグループ(相談相手)を作ってください。 何も見てもいいです。 仲間と相談しながらやってください。 ただし、やったことを人に説明できるようにしてください。 各自メモを残してください。 言語プロセッサ2016(東京工科大学CS学部)

参加する(Participation) 議論する(Discussion) 奉仕する(Altruism) 行動指針 言語プロセッサ2016(東京工科大学CS学部)

構文解析の実装 〜BisonとFlaxの応用〜 最終目標: PL/0 言語の構文解析器を自作する。 (注) PL/0言語とは、Niklaus Wirth がコンパイラ教育のために考案した    プログラミング言語。 後日資料を配布します。A4両面1枚です。 言語プロセッサ2016(東京工科大学CS学部)

準備をしましょう! まずは、BNFとEBNFの説明 次に、構文図の説明 言語プロセッサ2016(東京工科大学CS学部)

BNFとEBNF(文法の記述法) How to describe a grammar of a programming language, especially syntactic rules. (注)前回までは、文脈自由文法の記法を 使っていた。もちろん、それでもいい のだが、… 言語プロセッサ2016(東京工科大学CS学部)

BNFの例 文脈自由文法 BNF(Backus Naur Form) 文 → 主語 述語 主語 → 名詞 助詞 述語 → 副詞 動詞 名詞 → 子犬 | アヒル | 子供 助詞 → が | も | は 副詞 → ゆっくりと | よたよたと |素早く 動詞 → 歩いている | 移動する <文> ::= <主語> <述語> <主語> ::= <名詞> <助詞> <述語> ::= <副詞> <動詞> <名詞> ::= 犬 | アヒル | 自動車 <助詞> ::= が | も | は <副詞> ::= ゆっくりと | のんびりと |素早く <動詞> ::= 歩いている | 移動する 言語プロセッサ2016(東京工科大学CS学部)

BNFの例(続き) 文脈自由文法の場合: 文 => 主語 述語 => 名詞 助詞 副詞 動詞 => 子犬 が ゆっくりと 移動する <文> => <主語> <述語> => <名詞> <助詞> <副詞> <動詞> => 子犬 が ゆっくりと 移動する BNFの場合: 言語プロセッサ2016(東京工科大学CS学部)

BNFの例(2) <数字> ::= 0|1|2|3|4|5|6|7|8|9 <英字> ::= a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t |u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K |L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z <名前> ::= <英字>|<名前> <英字>|<名前> <数字> 言語プロセッサ2016(東京工科大学CS学部)

BNFの例(2)(続き) 名前の例 hensuu, KoukaDai, university, smart, OK など <名前> => <名前> <英字> => <英字> K => OK 言語プロセッサ2016(東京工科大学CS学部)

Bisonでの記述 Bisonのコード 元のBNF <名前> : <英字> |<名前> <英字> |<名前> <数字> ; <数字> ::= 0|1|2|3|4|5|6|7|8|9 <英字> ::= a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t |u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K |L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z <名前> ::= <英字> |<名前> <英字> |<名前> <数字> 言語プロセッサ2016(東京工科大学CS学部)

実際のコード Bisonのコード Flexのコード id : character | id character | id number ; [a-zA-Z]+ return(CHARACTER); [0-9]+ return(NUMBER) 言語プロセッサ2016(東京工科大学CS学部)

参考 BNF のシンタックス定義 <syntax> ::= <rule> | <rule> <syntax> <rule> ::= <opt-whitespace> “<” <rule-name> “>” <opt-whitespace> "::=" <opt-whitespace> <expression> <line-end> <opt-whitespace> ::= " " <opt-whitespace> | "” <expression> ::= <list> | <list> "|" <expression> <line-end> ::= <opt-whitespace> <eol> | <line-end> <line-end> <list> ::= <term> | <term> <opt-whitespace> <list> <term> ::= <literal> | "<" <rule-name> ">" <literal> ::= '"' <text> '"' | "'" <text> "'" 言語プロセッサ2016(東京工科大学CS学部)

EBNF 実際にプログラミング言語やXMLなどの形式言語を記述する場合、BNFでは書きにくい場合もあるため、BNFを拡張したものが使われる。それがEBNF(extended BNF)である。 言語プロセッサ2016(東京工科大学CS学部)

数式の文法(BNF) <expression> ::= <term> | <expression> "+" <term> <term> ::= <factor> | <term> "*" <factor> <factor> ::= <constant> | <variable> | "(" <expression> ")" <variable> ::= "x" | "y" | "z" <constant> ::= <digit> | <digit> <constant> <digit> ::= “0” | “1” | “2” | “3” | “4” | “5” | "6" | "7" | "8" | "9" 言語プロセッサ2016(東京工科大学CS学部)

EBNFの例(3) 数式 expression = term | expression, "+" , term ; term = factor | term, "*" , factor ; factor = constant | variable | "(" , expression , ")” ; variable = "x" | "y" | "z” ; constant = digit , {digit} ; digit = “0” | “1” | “2” | “3” | “4” | “5” | “6” | “7” | “8” | “9” ; 言語プロセッサ2016(東京工科大学CS学部)

参考 EBNF のシンタックス定義 letter = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" | "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" ; digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ; symbol = "[" | "]" | "{" | "}" | "(" | ")" | "<" | ">" | "'" | '"' | "=" | "|" | "." | "," | ";" ; character = letter | digit | symbol | "_" ; identifier = letter , { letter | digit | "_" } ; terminal = "'" , character , { character } , "'" | '"' , character , { character } , '"' ; lhs = identifier ; rhs = identifier | terminal | "[" , rhs , "]" | "{" , rhs , "}" | "(" , rhs , ")" | rhs , "|" , rhs | rhs , "," , rhs ; rule = lhs , "=" , rhs , ";" ; grammar = { rule } ; 言語プロセッサ2016(東京工科大学CS学部)

Syntax Diagram(構文図) こちらで書いた方がわかりやすい! 積極的に利用しましょう。 (図は別途紹介します) こちらで書いた方がわかりやすい! 積極的に利用しましょう。 (図は別途紹介します) 言語プロセッサ2016(東京工科大学CS学部)

(今後の予定) 数式を中間言語へ変換するプログラムの作成 今日の資料として第1版を配布します。 言語プロセッサ2016(東京工科大学CS学部)

出題および提出日は、後日お知らせします。 (予告)レポート課題 数式を中間言語へ変換するプログラムに対して、5種類の計算式を入力し実行せよ。 レポートには、入力した式とその出力を記せ。下記に書き方の例を示しておく。 入力 出力 ① a + b*c T1: ( *, b, c ) T2: ( +, a, T1 ) ② abc + xy T1: ( +, abc, xyz) 出題および提出日は、後日お知らせします。 言語プロセッサ2016(東京工科大学CS学部)

プログラミング言語の構文規則(EBNF形式)例 Program ::= module Id ; Block Id . Block ::= DeclList begin StmtList end DeclList ::= { Decl ; } Decl ::= ConstDecl | ProcDecl | VarDecl ConstDecl ::= const ConstDeclItem { , ConstDeclItem } ConstDeclItem ::= Id : Type = ConstExpr ConstExpr ::= Id | Integer VarDecl ::= var VarDeclItem { , VarDeclItem } VarDeclItem ::= Id : Type ProcDecl ::= procedure Id ([ FormalDecl {, FormalDecl} ] ) ; Block Id FormalDecl::= Id : Type Type ::= int StmtList ::= { Stmt ; } Stmt ::= CallStmt | AssignStmt | OutStmt | IfStmt | WhileStmt CallStmt ::= Id ( [ Exprs ] ) AssignStmt::= Lvalue := Expr Lvalue ::= Id OutStmt ::= output := Expr IfStmt ::= if Test then StmtList end WhileStmt ::= while Test do StmtList end Test ::= odd Sum | Sum Relop Sum Relop ::= <= | <> | < | >= | > | = Exprs ::= Expr {, Expr } Expr ::= Sum Sum ::= Term { (+ | -) Term } Term ::= Factor { (* | /) Factor } Factor ::= - Factor | LValue | Integer | input | ( Expr ) 言語プロセッサ2016(東京工科大学CS学部)

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学部)

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学部)

必死に演習するステージ 課題:次のようなプログラムを作れ。 入力: 数式 例: a+b*c 出力: 三つ組形式の中間表現 例: T1: (*, b, c) T2: (+, a, T1) 言語プロセッサ2016(東京工科大学CS学部)

Bisonプログラムの例 #include <stdio.h> #include <stdlib.h> int make_tuple(char*, int, int); int yyerror(char*); int yylex(); char var[100]; %} %token PLUS TIMES LP RP ID %% E: E PLUS T { $$=make_tuple("+", $1, $3); } | T { $$=$1; } T: T TIMES F { $$=make_tuple("*", $1, $3); } | F { $$=$1; } F: LP E RP { $$=$2; } | ID { $$=$1; } 言語プロセッサ2016(東京工科大学CS学部)

Bisonプログラムの例(続き) %% int prev_tuple = 0; //var[0]='\0'; int make_tuple(char *op, int arg1, int arg2){ printf("T%d: (%s, ", ++prev_tuple, op); if(arg1 > 0){ //itoa(arg1, var,2); printf("%s", var); printf("%d, ", arg1); } else { printf("T%d, ", -arg1); if(arg2 > 0){ printf("%d",arg2); //iota(arg2,var,2); printf("%s", var); printf("T%d", -arg2); printf(")\n"); return -prev_tuple; int main(){ yyparse(); } int yyerror(char *msg){ printf("error=(%s)\n", msg); return 0; 言語プロセッサ2016(東京工科大学CS学部)

Flexプログラムの例 %{ #include "parser.tab.h" extern int yylval; int copy_lexeme(); %} %% [\t ]+ { } "+" { return PLUS; } "*" { return TIMES; } "(" { return LP; } ")" { return RP; } [a-z][a-z0-9]* { yylval = copy_lexeme(); return ID; } \n { return 0; } . { printf("lexical error: '%c'\n", yytext[0]); return 0; } %% char StringTable[1000]; char *ST = StringTable; int copy_lexeme(){ int p = (int)ST; strcpy(ST, yytext); ST += strlen(yytext)+1; return p; } 言語プロセッサ2016(東京工科大学CS学部)

実行手順 $ ls parser.y scanner.l $ bison -d parser.y parser.tab.c parser.tab.h parser.y scanner.l $ flex scanner.l lex.yy.c parser.tab.c parser.tab.h parser.y scanner.l $ gcc *.c -ll a.out lex.yy.c parser.tab.c parser.tab.h parser.y scanner.l $ ./a.out a+b*c T1: (*, 16818434, 16818436) T2: (+, 16818432, T1) 言語プロセッサ2016(東京工科大学CS学部)

次週も演習をします 練習課題1 今日のプログラムを実際に実行して みてください。 練習課題2 PL/0の構文規則を構文図で書いて みてください。 以上 言語プロセッサ2016(東京工科大学CS学部)