Download - コンパイラとプログラミング言語...• バッカス記法(Backus Normal Form)の名称 –提案者の名前より –バッカス-ナウア記法(Backus-Naur Form)とも
コンパイラとプログラミング言語第3・4週 プログラミング言語の形式的な記述
2014年4月23日
金岡 晃
授業計画
1
第1週
(4/9)
コンパイラの概要
第2週
(4/16)
コンパイラの構成
第3週
(4/23)
プログラミング言語の形式的な記述
第4週
(4/30)
プログラミング言語の形式的な記述
第5週
(5/7)
字句解析の概要と非決定性有限オートマトン、決定性有限オートマトン・字句解析プログラム
第6週
(5/14)
中間試験
第7週
(5/21)
構文解析の概要/上向き構文解析
第8週
(5/28)
下向き構文解析/構文解析プログラム
第9週
(6/4)
中間表現と意味解析
第10週
(6/11)
Java仮想マシンとその機械語
第11週
(6/18)
条件分岐文と繰り返し文のコード生成
第12週
(6/25)
関数呼び出しのコード生成
第13週
(7/2)
休講
第14週
(7/9)
休講
(7/23-8/5)
期末試験
2014/4/23 コンパイラとプログラミング言語
【復習】第2週 コンパイラの構成
コンパイラとプログラミング言語
2 2014/4/23 コンパイラとプログラミング言語
コンパイラの論理的な構成
2014/4/23 コンパイラとプログラミング言語3
ソースプログラム
目的プログラム
コンパイラ
字句解析
構文解析
意味解析
最適化コード生成
中間情報(中間語、名前表)
フェーズ
コンパイラの物理的な構成
2014/4/23 コンパイラとプログラミング言語4
ソースプログラム
目的プログラム
コンパイラ
字句解析
構文解析
意味解析
最適化コード生成
中間情報(中間語、名前表)
論理的な構成とは一致しない
省略されたりする
順序が異なる
ケースもある
複数行うケースもある
後置記法の表記例
• 中置記法
A+B*C-D• 後置記法
ABC*+D-
• 中置記法
E*F+G/H• 後置記法
EF*GH/+
2014/4/23 コンパイラとプログラミング言語5
第3週プログラミング言語の形式的な記述
コンパイラとプログラミング言語
6 2014/4/23 コンパイラとプログラミング言語
本日の到達目標と概要
• 到達目標
– バッカス記法(BNF)の理解
– 構文図式の理解
• 概要
– バッカス記法の基本
– バッカス記法の拡張
– バッカス記法の例
– 構文図式の概要
– 構文図式の事例
7 2014/4/23 コンパイラとプログラミング言語
コンパイラの開発における重要なポイント
2014/4/23 コンパイラとプログラミング言語8
ソースプログラム
目的プログラム
コンパイラ
字句解析
構文解析
意味解析
最適化コード生成
中間情報(中間語、名前表)
プログラム言語の文法の出来の良し悪しが最重要事項
→ 言語の仕様範囲と文法を厳密に定める必要
文法の形式的な記述方式
• バッカス記法• 構文図式
バッカス記法
• ALGOL60の文法記述のために開発された記法
– 構文(プログラム言語の文法や書式)を定義するための言語
• 「言語を決める言語」であることからメタ言語ともいわれる
• バッカス記法(Backus Normal Form)の名称
– 提案者の名前より
– バッカス-ナウア記法(Backus-Naur Form)とも
– 省略してBNF、あるいはBNF記法と呼ばれることが多い
2014/4/23 コンパイラとプログラミング言語9
「次の規則から生成することができる式はどれか。」というパターンで基本情報技術者試験に出題されることが多い
BNF
• 終端記号と非終端記号
– 終端記号:これ以上は変換されない記号
• 例)0-9の数字、アルファベット(小文字、大文字)など
– 非終端記号:終端記号でないもの。後述する”<“と”>”で囲まれた要素(構文要素)。
• 基本的な記法
– さまざまな応用があるが、基本的な記法は以下の3つ
2014/4/23 コンパイラとプログラミング言語10
::= この記号の左に来る非終端記号を右に来た表現で定義する
<構成要素>
| 「または(or)」を意味する
“<“と”>”で囲まれたものにより構成要素であることを示す
BNFの基本的記法の例(1)
2014/4/23 コンパイラとプログラミング言語11
::= この記号の左に来る非終端記号を右に来た表現で定義する
<構成要素>
| 「または(or)」を意味する
“<“と”>”で囲まれたものにより構成要素であることを示す
上記3つの表現と終端記号(数値、アルファベット、記号など)を用いて、構文を定義する
例
<数字>::=0|1|2|3|4|5|6|7|8|9「『数字』という構成要素は0から9までの数字のいずれか1文字である」
BNFの基本的記法の例(2)
2014/4/23 コンパイラとプログラミング言語12
例
<アルファベット>::=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からzまでの文字のいずれか1文字である」
この例では大文字A,Bなどは「アルファベットではない」と定義されている
<数字列>::=<数字>|<数字><数字列>
「『数字列』という構成要素は数字または数字と数字列を並べたものである
定義の中に定義されるものが含まれている
「『数字列』という構成要素は数字が1文字以上ならんだものである
BNFの基本的記法の例(3)
2014/4/23 コンパイラとプログラミング言語13
問題例 次のBNFで定義されるビット列Sであるものはどれか。<S>::=01|0<S>1
ア、000111イ、010010ウ、010101エ、011111
Sは01またはSを0と1で挟んだもの → 01と0011→ 0011もSであるので、それを0と1で挟んだもの000111もS→ 00001111もS → 0000011111もS →…
答え:ア
BNFの基本的記法の例(4)
2014/4/23 コンパイラとプログラミング言語14
次のBNFで定義される<DNA>に合致するものはどれか。
<DNA> ::= <コドン> | <DNA><コドン><コドン> ::= <塩基><塩基><塩基><塩基> ::= A | T | G | C
ア.ACイ.ACGCGウ.AGCエ.ATGC
問題例
BNFの拡張
• 基本的な記法
– 終端記号と非終端記号
– <>
– ::=
– |
• より柔軟に拡張→EBNF
– さまざまな拡張があるが、典型的なものとしては以下の2つがある
2014/4/23 コンパイラとプログラミング言語15
{} {}の中の要素を0個以上並べたもの
[] []の中の要素を0個または1個書いたもの
BNFの記法例
2014/4/23 コンパイラとプログラミング言語16
<a列>::={a} 「『a列』という構成要素はaを0個以上並べたもの
a, aa, aaa, aaaa はいずれもa列である
<数字列>::=<数字>|<数字><数字列>
<数字列>::=<数字>{<数字>}
これら2つは同じものを定義している
BNFの記法例:教科書p.21, p.22(1)
2014/4/23 コンパイラとプログラミング言語17
<ソースプログラム上の文字集合>::=<空白>|<英字>|<数字>|<記号><空白>::=Δ<数字>::=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<記号>::=+|-|*|/|=|!|”<“|”>”|;|,|(|)|”{“|”}”<語>::=<予約語>|<識別子>|<整数><識別子>::=<英字>{<英字>|<数字>}<整数>::=<数字>{<数字>}<予約語>::=if|while|return|void|int
BNFの記法例:教科書p.21, p.22(2)
2014/4/23 コンパイラとプログラミング言語18
<プログラム>::=[<変数宣言>;|<関数定義>]<関数定義>::=<返戻型><識別子>([<変数宣言>{,<変数宣言>}])<ブロック><変数宣言>::=<要素型><識別子><ブロック>::=“{“{<文>}”}”<文>::=<変数宣言>;|<代入文>|<手続き呼び出し文>|<if文>|<while文>|<ブロック>|<返戻文><代入文>::=<識別子>=<式>;<手続き呼び出し文>::=<関数呼び出し>;<if文>::=if(<条件式>)<文><while文>::=while(<条件式>)<文><返戻文>::=return[<式>];
BNFの記法例:教科書p.21, p.22(3)
2014/4/23 コンパイラとプログラミング言語19
<式>::=<項>{<加減演算子><項>}<項>::=<因数>{<乗除演算子><因数>}<因数>::=<加減演算子><因数>|(<式>)|<関数呼び出し>|<識別子>|<整数><関数呼び出し>::=<識別子>([<式>{,<式>}])<条件式>::=<式><比較演算子><式><比較演算子>::===|!=|”>”|”>”=|”<“|”<“=<加減演算子>::=+|-<乗除演算子>::=*|/<返戻型>::=<要素型>|void<要素型>::=int
教科書p.21, p.22の例を利用する(1)
int a1001;
int substitutionA(){
int a1002;
a1002 = 100;
return a1002;
}
int substitutionB(int inputA){
int a1002;
a1002 = inputA;
return a1002;
}
2014/4/23 コンパイラとプログラミング言語20
教科書p.21, p.22の例を利用する(1)void callSubstitutionB(){
int a1003;
int a1004;
a1003 = 100;
a1004 = substitutionB(a1003);
return a1004;
}
int useIf(int inputA){
if(inputA > 100){
return 100;
}
return 0;
}
2014/4/23 コンパイラとプログラミング言語21
構文図式
• BNFと記述能力は変わらないが、直感的な記載方法
2014/4/23 コンパイラとプログラミング言語22
:終端記号
:構成要素
:「または」
:ループ
BNFと構文図式(1)
2014/4/23 コンパイラとプログラミング言語23
<数字>::=0|1|2|3|4|5|6|7|8|9
<数字>
0
1
2
3
4
5
6
7
8
9
BNFと構文図式(2)
2014/4/23 コンパイラとプログラミング言語24
<文>::=<変数宣言>;|<代入文>|<手続き呼び出し文>|<if文>|<while文>|<ブロック>|<返戻文>
<文> 変数宣言
識別子 = 式 ;
;
関数呼び出し ;
if ( )条件式 式
ブロック
return 式 ;
条件式 文)while (
本日の到達目標と概要
• 到達目標
– バッカス記法(BNF)の理解
– 構文図式の理解
• 概要
– バッカス記法の基本
– バッカス記法の拡張
– バッカス記法の例
– 構文図式の概要
– 構文図式の事例
25 2014/4/23 コンパイラとプログラミング言語
2014/4/23 コンパイラとプログラミング言語26
int substitutionA ( ) {
int a1002;
a1002 = 100;
return a1002;
}
関数定義返戻型
識別子
ブロック
変数宣言
代入文
返戻文
いずれも文
2014/4/23 コンパイラとプログラミング言語27
<整数>::=<数字>{<数字>}
数字
数字
数字
どっちでもいい
<識別子>::=<英字>{<英字>|<数字>}
英字
英字
数字
2014/4/23 コンパイラとプログラミング言語28
<関数定義>::=<返戻型><識別子>([<変数宣言>{,<変数宣言>}])<ブロック>
返戻型 識別子 ( ) ブロック
変数宣言
,変数宣言