第10回
形式言語理論
1. 形式言語とは
2. 字句解析
1
Introduction to Automata Theory, Languages, and Computation
John E. Hopcroft, Rajeev Motwani, Jeffrey D. Ullman (著)
ISBN: 9780321455369
画像は https://www.amazon.co.jp/dp/0321455363 より引用
10-1形式言語とは
2
形式言語とは
あるアルファベット Σ の上で、ある定められた文法によって規定される記号列の集合の
こと。文法には次のような種類がある
● 正則表現 (Regular Expression)
● 文脈自由文法 (Context-Free Grammar)
● 文脈依存文法 (Context-Dependent Grammar)
ここでいうアルファベットとは、文法で利用できる記号 (トークン) のこと
アルファベットの例:
● 0-9, “-” … 電話番号
● 0-9, a-z, A-Z, その他の記号 … プログラミング言語で用いるアルファベット
3
形式言語を学ぶ意義
コンパイラの手順には
● 字句解析 (Lexical Analysis)
● 構文解析 (Syntactic Analysis)
● 中間言語生成 (Intermediate Language Generation)
● 最適化 (Optimization)
● コード出力 (Code Emit)
などの複数のプロセスが存在する
形式言語がかかわる分野
4
計算機が言語を解釈するには
● 字句解析 (Lexical Analysis)
文字列を先頭から解釈しトークン (意味のある単語) として判断していく処理
● 構文解析 (Syntactic Analysis)
字句解析が終わった後、トークン列になった文字列に対し、文法を解釈し
n e w KEYWORD(New)
n e w IDENT(news)s
KEYWORD(IF) LPR IDENT RPR LBR
IfStatement
...
( LPR
5
IDENT
逆ポーランド記法 (RPN)
二項演算子からなる式について、演算子の優先順位を考慮しなくてもよい文法。後置記
法とも
DFS で構文木を訪問したとき、帰りがけ順で見ていくと、RPN になる
ポーランド記法 + * 5 4 / - 3 2 1
中置記法 5 * 4 + (3 - 2) / 1
逆ポーランド記法 5 4 * 3 2 - 1 / + 3 2
- 15 4
/*
+
6
RPN における計算
逆ポーランド記法における計算は、スタック マシンを利用する
被演算子を読んだらスタックに push する。演算子を読んだらスタックから pop し、演算
結果を push する。スタックのトップ (一番上) に残った値が計算結果
5 4 * 3 2 - 1 / +
5 5
4
20 20
3
20
3
2
20
1
20
1
1
20
1
21
7
[課題] 中置記法を RPN に変換する
中置記法で記述されたプログラムを、逆ポーランド記法に変換するプログラムを作成せ
よ。次の演算子を用いること: +, -, *, /, ^ (加減乗除および累乗)
また、逆ポーランド記法で変換された数式について、その値を計算せよ
8
バッカス・ナウア記法 (BNF)
バッカス・ナウア記法 (Backus-Naur form, BNF) は、プログラミング言語などの構文を
表すのに頻繁に用いる表現方法の一種。導出規則を用いて、トークンの定義を再帰的
に行う
<func-decl> ::= <type-name> <identifier> "(" <parameters> ")" <block>
<parameters> ::= <parameter> |
<parameters> "," <parameter>
<parameter> ::= <type-name> <identifier>
<block> ::= "{" <block> "}"
…
RFC や ASN.1 などでも、BNF やそれに類似された記法を用いて文法を定義する
9
導出木 (Derivation Tree)
BNF のように、導出規則を用いて定義する言語の場合、その導出関係を木構造にて描
画することができる
func-decl
type-name identifier parameters
parameters parameter
parameters parameter
block
block statement
identifier operator
statement
identif
10
あいまいな文法
あいまいな文法も存在する。
異なる解釈が存在した場合に、
どちらを優先させるかのルール
を作成することが重要である
例:
S → T | x
T → S + S
S
T
T x
x x
S
T
x T
x x
11
あいまいな文法
1. 演算子の優先順位による解決
S → T | x
T → S + S | S * S
に対して x + x * x を入力した場合 
* の優先順位を高くするなどの対応が必要
2. 最長マッチによる解決
Cond → if X then X | if X then X else X
に対して次の入力をした場合
if A then if B then C else D
12
10-2字句解析
13
有限オートマトン (Finite Automaton, FA, DFA)
有限状態機械 (FSM) とも呼ぶ
● 状態の有限集合 Q
● アルファベット ∑
● 開始状態 q0
● 終了状態の集合 F
● 状態遷移関数 δ(q,x) = q’
によって定義される
慣習的に、初期状態は入り矢印で、終状態は二重円で示す
例 (3 の倍数を受理するオートマトン )
Q = { q0
,q1
,q2
}
∑ = { 0,1 }
F = { q0
}
δ(q0
,0) = q0
δ(q0
,1) = q1
δ(q1
,0) = q2
δ(q1
,1) = q0
δ(q2
,0) = q1
δ(q2
,1) = q2
q2
q0
q1
1
01
01
0
14
ある言語 L が有限オートマトン A によって受理されるとは、集合 L に属する任意の文
字列 x を A から遷移させた結果、A の終状態に遷移することを言う
言語の受理
q0
F
携帯電話番号を受理するオートマトン (例):
0 0-9 0-9
0-9
0-9 0-9
1-9,-
-
-
- - - -
15
E
0-9,-
0-9,-
非決定性有限オートマトン (NFA)
ある状態から別の状態への遷移規則が複数存在するような有限オートマトンのことを非
決定性有限オートマトン (NFA)と呼ぶ。NFA は容易に DFA に変換可能
q1
1
q0
0
0,1
0 0
0
1
0
16
1
{q0
} {q1
}
{q0
,
q1
}
変換
1
1
ε 動作付き非決定性有限オートマトン (ε-NFA)
長さ 0 の文字列のことを空言と呼び、便宜上 ε という記号にて定義する。NFA のうち、ε
による遷移 (ε 遷移) を持つものを ε 動作付き非決定性有限オートマトン (ε-NFA) と呼
ぶ。ε-NFA は容易に DFA に変換可能
q1
ε
q0
0
0,1
0 0
17
{q1
}
変換
{q0
,
q1
}
1
0
正則表現 (Regular Expression)
あるアルファベット ∑ 上に、次の 5 つの記号を加えた文法。正規表現とも
● Φ : 空文字列
● + : 正則表現の選択
● * : 正則表現の繰り返し
● ( ) : それぞれ正則表現を括るための記号
プログラミングで用いる正規表現と呼ぶものと文法が異なるので注意
18
正則表現の ε-NFA への変換
1. Φ
2. a
3. ab
4. a+b
5. a*
a
a
b
ε
ε
ε
a
b
ε
εε
ε
a
ε
ε
ε
19
第10回 まとめ
1. 形式言語とは
● 計算機による言語の解釈について
● コンパイラにおけるプロセス: 字句解析, 構文解析
● 導出木, あいまいな文法
2. 字句解析
● 有限オートマトン (DFA)
● 言語の受理
● 非決定性有限オートマトン (NFA), ε 動作付き NFA (ε-NFA)
● 正則表現
20

[Basic 10] 形式言語 / 字句解析