40
2017/5/12 1 プログラミング言語論 (Concepts on Programming Languages) 趙 建軍 情報知能工学部門 1 http://cse.sjtu.edu.cn/~zhao/course/2017/ Concepts of Programming Languages.html 2

2017-L03-Syntax and Semantics-20170427-studentsstap.ait.kyushu-u.ac.jp/~zhao/course/2017/2017-L03-Syntax...2017/04/27  · 2017/5/12 2 第4回:構文と意味 (SyntaxandSemantics)

  • 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

語 言語 意味

67

9 8

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

9

17

18

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

35

構文図式

69

[プログラム]

関数定義

変数宣言;

構文図式

70

[ブロック]文{ }

2017/5/12

36

71

[文]

return

条件式

ブロック

識別子

変数宣言

;

(

=

if

while

)

関数呼出し

;

条件式 文( )

式 ;

72

2017/5/12

37

73

[式]

[項]

[関数呼出し]

因数

因数 乗除演算子

識別子 式( )

,

項 加減演算子

74

[条件式]式

== != > <>= <=

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

2017/5/12

40

int�n1=17,�n2=9,�n3=0とする

このとき、位以下の各式を評価した値を示せ。

n2 & n3 = 0n2 | n3 = 9n2 ^ n3 = 9n2 << 3 = 78n1 & (n2 || n3) = 1

79

80

[乗除演算子][加減演算子]

[返戻型]

[識別子]

int[要素型][整数]

数字

数字

英字

英字

+

/

要素型

void

[数字]と[英字]は非終端記号なので、本来はそれらも終端記号に至るまでの定義が必要。しかし、省略されている。前回のBNFの例でも省略されている。