Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
2017/5/12
1
プログラミング言語論(ConceptsonProgrammingLanguages)
趙 建軍情報知能工学部門
1
http://cse.sjtu.edu.cn/~zhao/course/2017/Concepts of Programming Languages.html
2
2017/5/12
2
第4回: 構文と意味(Syntax and Semantics)
2017.05.11
3
講義内容
構文と意味 構文の記述 正規表現 文脈自由文法
BNF 構文図式 抽象構文
意味の記述
4
2017/5/12
3
言語の形式的な定義の必要性
プログラミング言語の定義 構文:文字列によるプログラムの構成法 意味:その文字列の表わす計算
形式的な定義の必要性 プログラミング言語でプログラムを書く プログラミング言語の処理系の作成 言語の機能・プログラムの性質の考察
5
講義内容
構文と意味構文の記述 正規表現 文脈自由文法 BNF 構文図式 抽象構文
意味の記述
6
2017/5/12
4
How�to�Describe�a�Language?
Layeredstructureoflanguagedefinition
Thealphabetbasic symbols Lexicalstructurewords Syntacticstructurestatements Semanticsmeaning
7
8
語 言語 意味
1
3
0
4
67
9 8
5
2
291 291並べる
文 表わす
(数字) 数の位取り表記 (自然数)
例
十進数字の数の位取り表記法
数の位取り表記法と自然数との関係
2017/5/12
5
形式言語論の文法の考え方
語 (アルファベット,alphabet)有限個の記号の集合
〈Digit〉::=0|1|2|3|4|5|6|7|8|9
言語 (language)語から選んだ記号を並べた記号列で、特定の性質をもつものの集合
〈Numeral〉::=〈Digit〉|〈Numeral〉〈Digit〉
9
文法:代数型による表現
語〈Digit〉::= 0|1|2|3|4|5|6|7|8|9
data Digit = Digit_0 | Digit_1 | Digit_2 | Digit_3 | Digit_4 | Digit_5 | Digit_6 | Digit_7 | Digit_8 | Digit_9
言語 (language)〈Numeral〉::=〈Digit〉| 〈Numeral〉〈Digit〉
data Numeral = Single Digit| Composite Numeral Digit
10
2017/5/12
6
意味の記述
構成法に基づく場合分けによる関数定義 〈Numeral〉の場合:
数字列 x(n-1) ... x1 x0に数x(n-1)×10^(n-1)+ ... x1×10+x0 を対応づける
numval :: Numeral -> Int numval (Single d) = digval d numval (Composite n d) = numval n * 10 + digval d
digval :: Digit -> Intdigval Digit_0 = 0 digval Digit_1 = 1 …
11
講義内容
構文と意味構文の記述 正規表現 文脈自由文法 BNF 構文図式 抽象構文
意味の記述
12
2017/5/12
7
アルファベット、語、言語 アルファベット (∑) もっとも基本的かつ原子的な記号の有限集合 自然言語:ひらがな、漢字 プログラミング言語: JIS, ISOなどで定義されたキャラクタセット(マイクロ) キーワット、識別子、演算子記号、区切り記号(マクロ)
アルファベット上の語または文 ∑に属する記号の有限長の系列 特に、長さが0の語は空語
13
アルファベット、語、言語 形式言語とは∑上の語の集合 言語は有限集合の場合もあるが、一般には無限
集合 二進数の例: ∑= {0, 1}, {0, 1}+
無限集合となりうる形式言語を有限の長さの記述で表現する三つの方法 正規表現 形式文法 オートマトン
14
2017/5/12
8
正規表現 (regularexperession)
言語を表す一つの表現法
正規表現の考え方はいろいろな場所で用いられている データベースの検索 パーソナルコンピュータやワークステーショ
ンのシェル
a* ではaで始まる名前を持つファイル(の集合)を指定したことになる
15
16
2017/5/12
10
正規表現
正規表現は、次の規則によって、再帰的に定義される。
(1) ε, φは、正規表現である。ただし、(2) aは、正規表現である。ただし、
F,Gを正規表現とするとき、
(3)(FG)は正規表現である。(4)(F|G)は正規表現である。(5)(F*)は正規表現である。(6)(F)は正規表現である。
a
19
正規表現正規表現とは、ある種の制約条件に従う文字列として定義されている,例えば、
∑={a,b}
規則(1),(2)からε,φ,a,bは正規表現
規則(3),(4),(5),(6)から(ab),(aa),(a|b),(a*),(b*),(a)(ab)a,b(aa),((a*)|b) は正規表現
20
2017/5/12
11
正規言語 (regularlanguage)
正規表現の表す言語正規表現Rが表す言語L(R)を次のように再帰的に定義する。
(1) L(ε)={ε},L(φ)={} ただし,(2) L(a)={a} ただし,F,Gを正規表現とするとき、(3) L(FG)={σ1σ2|σ1=L(F), σ2=L(G)}[連接](4) L(F|G)=L(F)UL(G) [集合和](5) L(F*)=(L(F))* [閉包](6) L((F))=L(F)
a
21
例
正規表現a((ab)*)が表す言語L(a((ab)*))は、次のような集合である
{a,aab,aabab,aababab,...}
aで始まり、その後にabの繰り返しが続くような語の集合
22
2017/5/12
12
例
Let ={0,1}
1 {1}01 {01}0|1 {0,1}0(0|1) {00,01}0(0|1)(1|) {001,011,00,01}0(01)* {0,001,00101,0010101,…}
23
QUIZ TIME!
24
2017/5/12
13
MatchStringsandRegularExpressions
1. 0(0|1)*0
2. ((ε|0)1*)*
3. ((0|1)0(0|1))*
a. 000000b. 01010c. 010101d. 101010e. 001100
25
MatchandCreateRegularExpressions
1. 0(0|1)*0
2. ((ε|0)1*)*
3. ((0|1)0(0|1))
*
a. 000000b. 01010c. 010101d. 101010e. 001100
26
2017/5/12
14
MatchandCreateRegularExpressions
1. 0(0|1)*0
2. ((ε|0)1*)*
3. ((0|1)0(0|1))
*
a. 000000b. 01010c. 010101d. 101010e. 001100
27
MatchandCreateRegularExpressions
1. 0(0|1)*0
2. ((ε|0)1*)*
3. ((0|1)0(0|1))*
a. 000000b. 01010c. 010101d. 101010e. 001100
28
2017/5/12
15
MatchandCreateRegularExpressions
1. 0(0|1)*0
2. ((ε|0)1*)*
3. ((0|1)0(0|1))*
a. 000000b. 01010c. 010101d. 101010e. 001100
29
講義内容
構文と意味構文の記述 正規表現 文脈自由文法 BNF 構文図式 抽象構文
意味の記述
30
2017/5/12
16
アルファベット、語、言語 アルファベット ( ∑ ) もっとも基本的かつ原子的な記号の有限集合 自然言語:ひらがな、漢字 プログラミング言語: JIS, ISOなどで定義されたキャラクタセット(マイクロ) キーワット、識別子、演算子記号、区切り記号(マクロ)
アルファベット上の語または文 ∑に属する記号の有限長の系列 特に、長さが0の語は空語
31
アルファベット、語、言語 形式言語とは∑上の語の集合 言語は有限集合の場合もあるが、一般には無限
集合 二進数の例: ∑= {0, 1}, {0, 1}+
無限集合となりうる形式言語を有限の長さの記述で表現する三つの方法 正規表現 形式文法 オートマトン
32
2017/5/12
17
文脈自由文法 (Context‐freegrammar)
言語に属する文は構造を持っている if 文:
if a > b then m:= a else m:=b
キーワード: if, then, else条件式: a>b代入文: m:=a, m:=b
このような条件式、代入文などの構造を句(phase)と呼ぶ
33
文脈自由文法 (Context‐freegrammar)
文脈自由文法Gは、以下のような字句の構造を規定する形式文法の一つで、4字組 (T, N, S, P) で表れる:
T:終端記号からなる有限集合 N: 非終端記号からなる有限集合 S:開始記号(非終端記号の一つ、 ) P:生成規則からなる有限集合N x (N T)*
X NとするX e 或はX Y1 Y2 ...Yn whereYi NT
NS
34
2017/5/12
18
文脈自由言語
文脈自由文法Gが生成する言語L(G)は、以下のように定義する。
文脈自由文法Gが生成する言語L(G)は、開始記号Sから導出を繰り返して得られる文の集合である。
このような言語L(G)を文脈自由言語(context free language)と呼ぶ。
*},|{)( TwwSwGL
35
))(( *NTwwS
*
*
The principle of Compiler
文脈自由文法の例
AfragmentofMiniJava
STATE if ( EXPR ) STATE
STATE LVAL = EXPR
EXPR id
2017/5/12
19
The principle of Compiler
文脈自由文法の例
AfragmentofMiniJava
STATE if ( EXPR ) STATE
| LVAL = EXPR
EXPR id
Shorthand notation with “|”
The principle of Compiler
文脈自由文法の例
AfragmentofMiniJava
STATE if ( EXPR ) STATE | LVAL = EXPR
EXPR id
Shorthand notation with “|”
2017/5/12
20
例題1
次の文法G1は、0,1からなる長さ1以上の任意の系列からなる言語を生成する。
G1=(N,T,S,P), N={S},T={0,1}
P={S 0, S 1, S S0, S S1}
文10010は次のように生成される。
S⇒S0(S S0)39
例題1
次の文法G1は、0,1からなる長さ1以上の任意の系列からなる言語を生成する。
G1=(N,T,S,P), N={S},T={0,1}
P={S 0, S 1, S S0, S S1}
文10010は次のように生成される。
S⇒S0⇒S10(S S1)40
2017/5/12
21
例題1
次の文法G1は、0,1からなる長さ1以上の任意の系列からなる言語を生成する。
G1=(N,T,S,P), N={S},T={0,1}
P={S 0, S 1, S S0, S S1}
文10010は次のように生成される。
S⇒S0⇒S10⇒S010(S S0)41
例題1
次の文法G1は、0,1からなる長さ1以上の任意の系列からなる言語を生成する。
G1=(N,T,S,P), N={S},T={0,1}
P={S 0, S 1, S S0, S S1}
文10010は次のように生成される。
S⇒S0⇒S10⇒S010⇒S0010(S S0)42
2017/5/12
22
例題1
次の文法G1は、0,1からなる長さ1以上の任意の系列からなる言語を生成する。
G1=(N,T,S,P), N={S},T={0,1}
P={S 0, S 1, S S0, S S1}
文10010は次のように生成される。
S⇒S0⇒S10⇒S010⇒S0010⇒10010(S1)43
例題1
次の文法G1は、0,1からなる長さ1以上の任意の系列からなる言語を生成する。
G1=(N,T,S,P), N={S},T={0,1}
P={S 0, S 1, S S0, S S1}
文10010は次のように生成される。
S⇒S0⇒S10⇒S010⇒S0010⇒10010
44
2017/5/12
23
例題2
次の文法G2は、先頭に無駄な0のない二進表現からなる言語を生成する。
G2=(N,T,S,P), N={S,A},T={0,1}
P={S 0|A, A 1|A0|A1}
文10010は次のように生成される。
S⇒A⇒A0⇒A10⇒A010⇒A0010⇒10010
45
例題3
次の文法G3は、対応のとれた括弧の列からなる言語である。
G3=(N,T,S,P), N={S},T={(,)}
P={S ( )|(S)|SS}
文(()())()は次のように生成される。
???46
2017/5/12
24
例題3
次の文法G3は、対応のとれた括弧の列からなる言語である。
G3=(N,T,S,P), N={S},T={(,)}
P={S ( )|(S)|SS}
文(()())()は次のように生成される。
S⇒SS⇒(S)S⇒(SS)S⇒(SS)()⇒(()S)()⇒(()())()
47
解析木 各非終端記号からどのような記号列が導出さ
れたかを木の形で表現できる。
このような木を解析木(parsetree) 内部頂点:非終端記号 葉:終端記号、ラベルとして付けられる 葉のラベルを左から順に並べた記号列は、導出さ
れた文となっている。
文法GとGによって生成される文sが与えられたとき、sの解析木もしくは同等の情報を求めることを構文解析(syntaxanalysis,parsing)するという
48
2017/5/12
25
QUIZ TIME!
49
vonNeumann(1903‐1957)
HomeCountry:(1) Russia(2) Hungary(3) Germany
vonNeumannis(1)Mathematician(2) ComputerScientist(3)Economist
50
2017/5/12
26
vonNeumann(1903‐1957)
HomeCountry:(1) Russia(2) Hungary(3) Germany
vonNeumannis(1)Mathematician(2) ComputerScientist(3)Economist
51
講義内容
構文と意味構文の記述 正規表現 文脈自由文法 BNF 構文図式 抽象構文
意味の記述
52
2017/5/12
27
BNF記法 (1)
Backus�Normal�Form(Backus�Naur Form)
53
BNF記法 (1)
Backus�Normal�Form(Backus Naur Form)
54
2017/5/12
28
John�Backus�(1924-2007)
FortranProgramminglanguage
FortranCompiler(1957)
Took18staffyearstoimplement
TuringAward55
BNF記法 (1)
Backus�Normal�Form(Backus�Naur Form)
56
2017/5/12
29
57
Peter�Naur(1928-)
2005 Turing Award
For fundamental contributions to programming language design and the definition of Algol 60, to compiler design, and to the art and practice of computer programming.
BNF記法 (2)
文脈自由文法を簡潔に表現する記法 左辺が同じ非終端記号の規則を、縦棒 | を使って、ま
とめて表す。
(例)文脈自由文法 G = (T, N, S, P)N = { S }T = { ( , ) }P = { S ( ), S (S), S SS }
は、BNF記法では、<paren> ::= ( ) | (<paren>) | <paren><paren>
と表せる。58
2017/5/12
30
BNF記法 (3)
基本記号 基本記号(トークン, token): 表記に用いる基本
的要素 語彙 (アルファベット, alphabet): 基本記号の有
限集合
構文単位 構文単位(syntactic unit): 構文上のひとまとま
りの構成 〈構文単位名〉のように書く
59
BNF記法 (4)
構文規則〈構文単位名〉::= 構成1 | 構成2 | ... | 構成n 構成i 基本記号や〈構文単位名〉をいくつか並べたもの 空の列: ε
〈Numeral〉::=〈Digit〉 | 〈Numeral〉〈Digit〉
60
2017/5/12
31
BNF記法 (5)
加減演算式を定める構文規則 基本記号 {0,1, 2, 3, 4, 5, 6, 7, 8, 9, +, -} 構文規則
〈Expr〉::=〈Numeral〉| 〈Expr〉+〈Expr〉|〈Expr〉-〈Expr>
〈Numeral〉::=〈Digit〉|〈Numeral〉〈Digit〉〈Digit〉::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
曖昧の文法に注意61
代数型による構文の表現
〈構文単位名〉::= 構成1 | 構成2 | ... | 構成n
data 代数型名 = 構成子1 構成要素列1| 構成子2 構成要素列2| ...
| 構成子n 構成要素列n
62
2017/5/12
32
代数型による構文の表現(続)
〈Expr> ::= …
data Expr = Num Numeral | Pexpr Expr Expr| Mexpr Expr Expr
data Numeral = Single Digit| Composite Numeral Digit
data Digit = Digit_0 | Digit_1 | …
63
構文解析
記号列が構文規則で定まる言語の文であることを解析する 自動解析ツール: yacc, lex (Unix) 例: “291+31”の構文
Pexpr (Num(Composite (Composite (Simple Digit_2)
Digit_9 ) Digit_1 ) )
(Num(Composite (Simple Digit_3)
Digit_1 ) )64
2017/5/12
33
(抽象)構文木
文の構成を構成子を用いて表現したもの 構成子:節 構成要素:枝
65
講義内容
構文と意味構文の記述 正規表現 文脈自由文法 BNF 構文図式 抽象構文
意味の記述
66
2017/5/12
34
構文図式 BNFと記述力は変わらない 直感的でわかりやすい
67
要素型 識別子
[プログラム]
[関数定義]
[変数宣言]
関数定義
変数宣言;
返戻型 ブロック識別子 ( )
,
変数宣言
構文図式 BNFと記述力は変わらない 直感的でわかりやすい
68
2017/5/12
38
QUIZ TIME!
75
int�n1=17,�n2=9,�n3=0とする
このとき、位以下の各式を評価した値を示せ。
n1 & n2 =n1 | n2 =n1 ^ n2 =n1 >> 2 =n1 & (n2 && n3) =
76
2017/5/12
39
int�n1=17,�n2=9,�n3=0とする
このとき、位以下の各式を評価した値を示せ。
n1 & n2 = 1n1 | n2 = 25n1 ^ n2 = 24n1 >> 2 = 4n1 & (n2 && n3) = 0
77
int�n1=17,�n2=9,�n3=0とする
このとき、位以下の各式を評価した値を示せ。
n2 & n3 =n2 | n3 =n2 ^ n3 =n2 << 3 =n1 & (n2 || n3) =
78