Top Banner
ププププププププププ BNF ププププププ プププププ () ププ
30

プログラミング言語論 第3回 BNF 記法について(演習付き)

Jan 22, 2016

Download

Documents

shayna

プログラミング言語論 第3回 BNF 記法について(演習付き). 篠埜 功. 構文の記述. プログラミング言語の構文はどのように定式化できるか?. プログラミング言語の特徴 : 入れ子構造 (nesting). 例1 : for ループの中に for ループが書ける。 for (i=0; i
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: プログラミング言語論 第3回 BNF 記法について(演習付き)

プログラミング言語論第3回

BNF 記法について(演習付き)

篠埜 功

Page 2: プログラミング言語論 第3回 BNF 記法について(演習付き)

構文の記述プログラミング言語の構文はどのように定式化できるか?

例1 : for ループの中に for ループが書ける。 for (i=0; i<= 10; i++) { for (j=0; j<=20; j++) { … 例 2: 算術式の中で、 (…) の中で、 (…) を書ける。 1 + (2 * (3+ 4) )

プログラミング言語の特徴 : 入れ子構造 (nesting)

このような構造は、文脈自由文法で表す。(正規表現では表すことができない。)

文脈自由文法を表記するためのメタ言語である BNF 記法を紹介する。

Page 3: プログラミング言語論 第3回 BNF 記法について(演習付き)

BNF 記法• Backus Normal Form (Backus Naur Form)• 集合を定義する際の記述法(言語)。集

合を帰納的に定義する。(帰納的定義 inductive definition )(再帰的定義 recursive definition ともいう)

• 規則を「非終端記号( non-terminal symbol )」と「終端記号( terminal symbol )」で表す。

• 文脈自由文法( context free grammar )の構文規則を記述する際に用いられる。– 構文規則=文を構成するための規則

Page 4: プログラミング言語論 第3回 BNF 記法について(演習付き)

非終端記号と終端記号

• 非終端記号( non-terminal symbol )– 非終端記号または終端記号からなる列に展開

される。 <> で囲む。• 終端記号( terminal symbol )– 文字列、数値、 = など それ以上他の要素の組

み合わせで置き換えることができないもの– ’ ’ 等で囲んで表すこともある。

Page 5: プログラミング言語論 第3回 BNF 記法について(演習付き)

BNF 記法による規則の書き方( BNF 記法の定義)

< 不等式 > ::= < 式 >< 不等号記号 ><式 >< 不等号記号 > ::= ’>’ | ’<’

( BNF 記法の例および意味)

can be or

が一つの規則であり、それを並べて書く。

非終端記号 (1つ)のあとに ::= を書き、その後に非終端記号または終端記号からなる列を縦棒 | で区切って並べたもの(縦棒はなくてもよいし、2つ以上あってもよい)

Page 6: プログラミング言語論 第3回 BNF 記法について(演習付き)

BNF 記法の意味• 非終端記号は集合に対応– 非終端記号は、それに対応する集合の任意の要素を

表していると見てもよい。– この見方では、複数回表れる同じ名前の非終端記号

は一般に別の要素を表す。• 同じ名前の終端記号は同じものを表す

< 不等式 > ::= < 式 >< 不等号記号 ><式 >< 不等号記号 > ::= ’>’ | ’<’

< 式 > は、式の集合に対応する。(式の集合中の任意の要素を表すと見てもよい)

Page 7: プログラミング言語論 第3回 BNF 記法について(演習付き)

BNF 記法の意味

• 複数の選択候補がある場合は「|」を使って表現

• 再帰的定義 recursive definition (帰納的定義 inductive definition )

< 不等号記号 > ::= ’>’ | ’<’

< 文章 > ::= < 文 > | < 文 > < 文章 > 「文章は文あるいは、文と文章が並んだものある」

「不等号記号は’ >’ または ’ <’ である」

can be or

Page 8: プログラミング言語論 第3回 BNF 記法について(演習付き)

構文木< 式 > ::= < 数字 >< 論理記号 >< 数字 >< 等号 >< 数字 >< 数字 > ::= ‘0’ | ‘1’< 論理記号 > ::= ‘and’ | ‘or’ < 等号 > ::= ‘=’

< 式>

‘1’

< 数字>

‘or’

< 論理記号 >

‘0’

< 数字>

‘1’

< 数字>

< 等号 >

‘=’終端記号

非終端記号

(例) 1or0=1 の構文木

Page 9: プログラミング言語論 第3回 BNF 記法について(演習付き)

拡張 BNF 記法( extended BNF )(1)

• BNF 記法を読みやすいように拡張– 次の式は「文章は一つ以上の文で構成され

る」ということを再帰的に表現

– これをもっと簡潔に書きたい< 文章 > ::= < 文 > | < 文 > < 文章 >

< 文章 > ::= < 文 >+

+ は1つ以上の繰り返しを表す

Page 10: プログラミング言語論 第3回 BNF 記法について(演習付き)

拡張 BNF 記法 (2)• A | B は、 A または B 。• {A} は、 A の 0 回以上の繰り返しを表す。

– (例) {ab} は、 ε, ab, abab, ababab, abababab, … を表す。• ( A )は、 A をひとまとめにする。

– (例) ( a|b ) c は、 ac または bc を表す。• [A] は、 A または空を表す。(例) [a] は、 ε または a

を表す。• (A)+  は、 A の1回以上の繰り返しを表す。• (A)* は、 A の 0 回以上の繰り返しを表す。( {A} と

同じ)– (例) a+ は、 a, aa, aaa, aaaa, …. を表す。 aa* と同じ。

Page 11: プログラミング言語論 第3回 BNF 記法について(演習付き)

【参考】 Chomsky の言語階層

Noam Chomsky の言語階層 Type 0 制限なし Type 1 文脈依存文法 (context sensitive grammar) Type 2 文脈自由文法 (context free grammar) Type 3 正規文法 (regular grammar)

( 1年後期 形式言語とオートマトン )

Page 12: プログラミング言語論 第3回 BNF 記法について(演習付き)

第 1 問• ビット列を BNF 記法を利用して定義せよ .

また拡張 BNF 記法で書くとどうなるか .– 以下の非終端記号を利用せよ

ビット列用の非終端記号 --- <ビット列> ビット用の非終端記号 --- <ビット>

(ビット列の例) 10010111001011100010100 など。

Page 13: プログラミング言語論 第3回 BNF 記法について(演習付き)

解答 1• BNF 記法< ビット列 > ::= < ビット > | < ビット >< ビット列 >< ビット > ::= 0 | 1• 拡張 BNF 記法 ( 例 )< ビット列 > ::= (0 | 1)+

ちなみに、空文字列( ε )を含む場合は、

• BNF 記法< ビット列 > ::= ε | < ビット >< ビット列 >< ビット > ::= 0 | 1• 拡張 BNF 記法 ( 例 )< ビット列 > ::= (0 | 1)*

Page 14: プログラミング言語論 第3回 BNF 記法について(演習付き)

第2問

• a が偶数個 ( 0個は除く ) 並んだ文字列を BNF 記法、拡張 BNF 記法で定義せよ。

(例) aa や aaaaaaaa など。

Page 15: プログラミング言語論 第3回 BNF 記法について(演習付き)

解答 2• BNF 記法<evena> ::= aa | <evena> aa• 拡張 BNF 記法<evena> ::= (aa)+

ちなみに、空文字列を含む場合は、

• BNF 記法<evena> ::= ε | <evena> aa• 拡張 BNF 記法<evena> ::= (aa)*

Page 16: プログラミング言語論 第3回 BNF 記法について(演習付き)

第3問

• 自然数リストは、 (   ) であるか、あるいは自然数リストと自然数を ( 自然数 . 自然数リスト ) のようにしてペアにしたものであるとする。これを BNF 記法で表せ。ただし自然数は <nat> で既に定義されているものとする。

(例) (2 . (30 . (5 . ( ) ) ) ) など。

Page 17: プログラミング言語論 第3回 BNF 記法について(演習付き)

解答 3• BNF 記法<natList> ::= ( ) | ( <nat> . <natList> )

Page 18: プログラミング言語論 第3回 BNF 記法について(演習付き)

第4問

• 対応のとれた括弧からなる文字列をBNF 記法で定義せよ。

(例) () や ()(()) など。

Page 19: プログラミング言語論 第3回 BNF 記法について(演習付き)

解答4• BNF 記法<paren> ::= ( ) | ( <paren> ) | <paren><paren>

空文字列 ε を含む場合は、<paren> ::= ε | ( <paren> ) | <paren><paren>

Page 20: プログラミング言語論 第3回 BNF 記法について(演習付き)

第5問

• 対応のとれた括弧で、3段階以上のネストは許さないような文字列を BNF 記法で記述せよ。

(), (()), ()(), ()(()), ……

()((())) など、ネストが3段階以上のものは除く。

Page 21: プログラミング言語論 第3回 BNF 記法について(演習付き)

解答5• BNF 記法<paren> ::= <paren1> | ( <paren1> ) | <paren> <paren><paren1> ::= ( ) | <paren1> <paren1>

空文字列 ε を許す場合は、<paren> ::= ε | <paren1> | ( <paren1> ) | <paren> <paren>

Page 22: プログラミング言語論 第3回 BNF 記法について(演習付き)

第6問

• 問5の文字列は正規表現で記述できるか。

Page 23: プログラミング言語論 第3回 BNF 記法について(演習付き)

解答6できる。 { ( {( )}* ) } +

空文字列を含む場合 { ( {( )}* ) } *

(注) ここでは、 { } を、正規表現における括弧として

用いた。

Page 24: プログラミング言語論 第3回 BNF 記法について(演習付き)

構文図式( syntax graph あるいは syntax diagram )

(さきほどの例) < 数字 > ::= ’0’ | ’1’ < 式 > ::= < 数字 > (’ and’ | ’or’ ) < 数字 > ’=’ < 数字 >数字

1

0

式数字 and

or

数字 = 数字

文脈自由文法の構文規則を表す際に用いられる graphical な言語

Page 25: プログラミング言語論 第3回 BNF 記法について(演習付き)

構文図式終端記号 x

x

非終端記号 <A>

A

繰り返し {α}

α の図式

Page 26: プログラミング言語論 第3回 BNF 記法について(演習付き)

構文図式 並び α1 α2 … αn

α1 の図式 α2 の図式 … αn の図式

選択 α1 | α2 | … | αn

α2 の図式

α1 の図式

αn の図式…

Page 27: プログラミング言語論 第3回 BNF 記法について(演習付き)

第7問• 次の構成図が与えられたとき,この構成図で表現で

きる文字列として正しいものを①~⑤から全て選べ.ただし,英字は a, b, ・・・, z, A, B, ・・・, Z のいずれか,数字は 0 , 1 ,・・・, 9 のいずれかであるとする.

英字英字 数字数字

‘#’‘#’

①   A3 ②   BB ③ A# ④ #9 ⑤ 99

Page 28: プログラミング言語論 第3回 BNF 記法について(演習付き)

第8問• あるプログラミング言語で使える変数名は,次の構

文図で規定されているものとする。このとき,変数名として使えないものを選べ。ただし,英字は a, b , ・・・ , z , A, B, ・・・ , Z のどれか,数字は 0, 1, ・・・ , 9のどれかである。

① A    ② name    ③ B740    ④ C6H6    ⑤ 11PM

英字英字

数字数字

英字英字

Page 29: プログラミング言語論 第3回 BNF 記法について(演習付き)

補足 : 文法とは(1)

• 文法とは、 (N, T, P, S) N は記号の有限集合。非終端記号 (nonterminal

symbol) と呼ぶ。 T は N とは重なりのない記号の有限集合。終端

記号 (terminal symbol) と呼ぶ。 P は、 (N T)* N (N T)* (N T)* の有限部分集合。

生成規則 (production) あるいは書き換え規則(rewriting rule) と呼ぶ。

S は N の要素で、開始記号 (start symbol) と呼ぶ。

Page 30: プログラミング言語論 第3回 BNF 記法について(演習付き)

補足 : 文法とは(2)

u v が生成規則で、 u が文字列の部分文字列であるとき( = u となる , (N T)* が存在)、 文字列の中の u を v に書き換えてよい( ’ = v が得られる)。

これを  ’ と書く。{ x T* | S * x } が、 (N, T, P, S) によって生成され

る言語。