プログラミング言語論 第10回(演習) 情報工学科 木村昌臣 篠埜 功 今日のトピックス • 今日はいつもと趣向をかえて演習を中心 に行います。 [参考] Chomskyの言語階層 • Noam Chomskyの言語階層について Type 0 Type 1 Type 2 Type 3 (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)と呼ぶ。 先週の補足: 文法とは u v が生成規則で、uが文字列の部分文字列で あるとき( = u となる , (N T)* が存 在)、 文字列の中のuをvに書き換えてよい( ’ = v が得られる)。 これを ’ と書く。 { x T* | S * x } が、 (N, T, P, S) によって生成さ れる言語。 Type 3 • 右線形文法 (Right-linear grammar) すべての生成規則が X xY または X x の形をしている。ただし、 X, Y N xT* Type3は正規表現と同等。 Type 2 • 文脈自由文法 (Context free grammar) すべての生成規則が X の形をしている。ただし、 XN (T N)* Type 2はBNF記法と同等 Type 1 • 文脈依存文法 (Context sensitive grammar) すべての生成規則が X の形をしている。ただし、 XN , (T N)* (T N)+ Type 0 • 制限なし 生成規則は の形であれば何でもよい。 , は、 , ( T N )* 先週の補足: BNF記法 • Backus Normal Form (Backus Naur Form) • 文脈自由文法を簡潔に表現する記法 – 左辺が同じ非終端記号の規則を、縦棒 | を使って、まと めて表す。 (例) 文脈自由文法 G = (T, N, S, P) N={S} T={(,)} P = { S ( ), S (S), S SS } は、BNF記法では、 <paren> ::= ( ) | (<paren>) | <paren> <paren> と表せる。 先週の復習: 拡張BNF記法 • * + () { } [ ] などを使えるようにしたのが拡 張BNF記法。 第1問 • ビット列をBNF記法を利用して定義せよ. また拡張BNF記法で書くとどうなるか. – 以下の非終端記号を利用せよ <ビット列> <ビット> 10010111001011100010100011011110…… 解答1 • BNF記法 <ビット列> ::= <ビット> | <ビット><ビット列> <ビット> ::= 0 | 1 • 拡張BNF記法 (例) <ビット列> ::= (0 | 1)+ ちなみに、空文字列(ε)を含む場合は、 • BNF記法 <ビット列> ::= ε | <ビット><ビット列> <ビット> ::= 0 | 1 • 拡張BNF記法 (例) <ビット列> ::= (0 | 1)* 第2問 • aが偶数個(0個は除く)並んだ文字列を BNF記法、拡張BNF記法で定義せよ。 aa, aaaa, aaaaaa, aaaaaaaa, aaaaaaaaaa, …… 解答2 • BNF記法 <evena> ::= aa | <evena> aa • 拡張BNF記法 <evena> ::= (aa)+ ちなみに、空文字列を含む場合は、 • BNF記法 <evena> ::= ε | <evena> aa • 拡張BNF記法 <evena> ::= (aa)* 第3問 • リストは、( )であるか、あるいはリストと自 然数を(自然数 . リスト) のようにしてペア にしたものであるとする。これをBNF記法 で表せ。ただし自然数は<nat>で既に定義 されているものとする。 解答3 • BNF記法 <list> ::= ( ) | ( <nat> . <list> ) 第4問 • 対応のとれた括弧からなる文字列をBNF 記法で定義せよ。 (), (()), ()(), ()(()), ()((())) …… 解答4 • BNF記法 <paren> ::= ( ) | ( <paren> ) | <paren><paren> 空文字列εを含む場合は、 <paren> ::= ε | ( <paren> ) | <paren><paren> 第5問 • 対応のとれた括弧で、3段階以上のネスト は許さないような文字列をBNF記法で記 述せよ。 (), (()), ()(), ()(()), …… ()((())) など、ネストが3段階以上のものは 除く。 解答5 • BNF記法 <paren> ::= <paren1> | ( <paren1> ) | <paren> <paren> <paren1> ::= ( ) | <paren1> <paren1> 空文字列εを許す場合は、 <paren> ::= ε | <paren1> | ( <paren1> ) | <paren> <paren> 第6問 • 問5の文字列は正規表現で記述できるか。 解答6 できる。 { ( {( )}* ) } + 空文字列を含む場合 { ( {( )}* ) } * (注) ここでは、{ }を、正規表現における括弧として 用いた。 構文図式 文脈自由文法の構文規則を表す際に用いられる (graphicalな)言語 <数字> ::= ’0’ | ’1’ <式> ::= <数字> (’and’ | ’or’) <数字> ’=’ <数字> 数字 1 0 式 数字 and or 数字 = 数字 第7問 • 次の構成図が与えられたとき,この構成図で表現で きる文字列として正しいものを①~⑤から全て選べ. ただし,英字はa, b, ・・・,z, A, B, ・・・,Zのいずれか, 数字は0,1,・・・,9のいずれかであるとする. ① A3 ② BB ③ A# ④ #9 ⑤ 99 英字 ‘#’ 数字 第8問 • あるプログラミング言語で使える変数名は,次の構 文図で規定されているものとする。このとき,変数名 として使えないものを選べ。ただし,英字はa, b , ・・・, z,A, B, ・・・, Zのどれか,数字は0, 1, ・・・, 9のどれ かである。 ①A ② name ③ B740 ④ C6H6 数字 英字 英字 ⑤ 11PM 先週までの内容の復習、補足 デジタルコンピュータ --- 機械語で書かれたプログ ラムを実行する機械。 コンピュータによる問題解決は、必要な情報をビット 列で表現(コード化)し、それを機械語プログラムで 処理することにより行われる。 大規模なプログラムでも原理的には機械語プログラ ムを書けるが、事実上不可能。 先週までの内容の復習、補足 プログラミング言語が持つべき性質 高水準の記述能力 • プログラムの論理構造を簡潔に記述 厳密な意味の定義 • その言語で記述可能なすべてのプログラ ムの意味(動作)を完全に規定 効率的実装 • その言語で記述可能なすべてのプログラ ムを、効率のよい機械語に変換 先週までの内容の復習、補足 プログラミング言語の定義 構文の定義 • Chomskyの文法の理論を基礎とする • 曖昧さを許さない • 文法構造がコンピュータで解析可能 意味の定義 • その言語で記述可能なすべてのプログラムの意 味(動作)を完全に規定 表示的意味論(denotational semantics) 公理的意味論(axiomatic semantics) 操作的意味論(operational semantics) 先週までの内容の復習、補足 構文の定義 文脈自由文法(の部分クラス)で定義。BNF記法で簡 潔に記述できる。 ただ、プログラミング言語の構文を文脈自由文法のみ で完全に規定するのは困難。 • 名前の定義と参照の関係の整合性 • データ型の整合性 は文脈自由文法では記述できないか、あるいは、記述 すると非常に複雑になる。 --- コンパイラでは、構文解析フェーズとは別のフェー ズにおいて、これらの整合性の検査(意味解析(静的 意味の解析))を行う。 先週までの内容の復習、補足 構文の定義 通常、構文の定義は、字句の定義(正規表現で定義) と構文の定義(文脈自由文法(のサブクラス)で定義) に分ける。コンパイラにおける構文解析も、これに対応 して、字句解析と構文解析に分ける。 分けない場合 文法定義における終端記号はアルファベット 分ける場合 文法定義における終端記号は字句
© Copyright 2024 ExpyDoc