SlideShare une entreprise Scribd logo
1  sur  24
言語処理系入門
第2回:文脈自由文法と構文解析
2009 年 10 月 30 日(金)
服部 健太
2009 年 10 月 30 日 言語処理系入門 2 3
構文の定義
 例: C 言語の if-else 文
if ( 式 ) 文 [ else 文 ]
 [] はオプショナルを示す
 もう少し,形式的に定義すると...
stmt → if ( expr ) stmt else-clause-opt
else-stmt-opt → else stmt | ε
 A → B は生成規則生成規則と呼ばれ,「 A は B の形式を持つ」と
読める.
 A → B, A → C といちいち書くかわりに A → B | C と書いて
もよい
 if や else,(,) のような青字はトークン(終端記号)を表
す.
 expr や stmt を非終端記号非終端記号と呼ぶ.
 非終端記号はトークンの列を表す
 ε は空のトークン列を表す
2009 年 10 月 30 日 言語処理系入門 2 4
文脈自由文法
 次の4つの要素からなる
 終端記号(トークン)の集合
 非終端記号の集合
 生成規則の集合
 生成規則の左辺は非終端記号,右辺は終端記号と非終端記号
の列
 開始記号とよぶ 1 つの非終端記号
 演習問題:以下の文法が生成するトークン列は?
 S → ε | S P
 P → ( S )
2009 年 10 月 30 日 言語処理系入門 2 5
正規表現と文脈自由文法
 文脈自由文法の構文規則を A → a A , A → ε ,  A
→ B の形式に制限すると,正規表現と等価になる.
 逆にいえば,どんな正規表現でも,上のような形を
持った等価な文脈自由文法として定義することがで
きる.
 正規表現と等価な NFA( 非決定性有限オートマトン ) の各
状態 Si を非終端記号 Si に対応
 開始状態 S0 は開始記号 S0 に対応
 <Si,a>→Sj という遷移があれば, Si → a Sj
 <Si,ε>→Sj なら, Si→Sj
 Sn が終了状態なら Sn →ε
 正規表現⊂文脈自由文法
2009 年 10 月 30 日 言語処理系入門 2 6
文脈自由文法の限界
 以下の言語は文脈自由文法では定義できない
 L1 = { wcw | w は a と b の任意の列 }
 aabcaab, abcab, abababcababab, …
 ちなみに L1’ = { wcwR
| wR
は w の逆順を表す } は文脈自由
 L2 = { an
bm
cn
dm
| n 1,≧ m 1 }≧
 abcd, abbcdd, aaaabcccd, …
 ちなみに L2’ = { an
bn
cm
dm
| n 1,≧ m 1 }≧ は文脈自由
 L3 = { an
bn
cn
| n 0 }≧
 abc, aabbcc, aaabbbccc, …
 ちなみに L3’ = { an
bn
| n 0 }≧ は文脈自由
 識別子の使用が宣言よりも前になければならない言語
 関数定義の仮引数と呼び出しにおける実引数の個数は一致
してなければならない言語
⇒ コンパイラの意味解析フェーズでチェックする
2009 年 10 月 30 日 言語処理系入門 2 7
BNF による文脈自由文法の記述
 色々とバリエーションはあるが...
 A→B を A ::= B と書く
 非終端記号を <symbol> で表す
 ’終端記号を symbol’ で表す
 例:
 <stmt> ::= ‘if’ ‘(‘ <expr> ‘)’ <stmt> <else-clause-opt>
 <else-clause-opt> ::= ‘else’ <stmt> | /* empty */
 拡張 BNF だと,以下の記号も使える
 ? -オプション
 + - 1 個以上の繰返し
 * - 0 個以上の繰返し
2009 年 10 月 30 日 言語処理系入門 2 8
例:式言語の文法定義
expr → NUM
| expr + expr
| expr – expr
| expr * expr
| expr / expr
| ( expr )
 開始記号は expr
 NUM は 23 や 5 など,整数を表すトークン
2009 年 10 月 30 日 言語処理系入門 2 9
導出
 開始記号から出発して,構文規則を右向きに適用してながら非
終端記号を書き換えていくと,最終的にトークン列が得られる
.
 いわゆる文法エラーとなるプログラムは,文法規則から導出で
きないトークン列のことである
 導出の例(最左導出):
expr  ⇒  expr + expr
⇒   NUM + expr
⇒   NUM + expr - expr
⇒   NUM + expr * expr - expr
⇒   NUM + NUM * expr - expr
⇒   NUM + NUM * NUM - expr
⇒   NUM + NUM * NUM - ( expr )
⇒   NUM + NUM * NUM - ( expr + expr )
⇒   NUM + NUM * NUM - ( NUM + expr )
⇒   NUM + NUM * NUM - ( NUM + NUM )
最左導出は,最も左側
に位置する非終端記号
を置き換えていく
2009 年 10 月 30 日 言語処理系入門 2 10
解析木( Parse Tree )
 置換えの順序を取り除
いた導出をグラフ
(木)で表現したもの
 木の内部節点(ノード)
 非終端記号
 木の葉
 終端記号(トークン)
 葉を左から右にたどると
トークン列が得られる
 異なる導出戦略でも同
じ解析木が得られる
E
E + E
NUM E - E
*E E
NUM NUM
E( )
E + E
NUMNUM
2009 年 10 月 30 日 言語処理系入門 2 11
あいまいな文法
 ある文法から導出されるトークン列に対応する解析
木が複数あり得る場合,その文法はあいまいな文あいまいな文
法法であるE
E + E
NUM E - E
*E E
NUM NUM
E( )
E + E
NUMNUM
E
E E
NUM
E - E
*
E E
NUM NUM E( )
E + E
NUMNUM
+
(具象)構文を定義す
る場合,同じ入力
(トークン列)に対し
て得られる解析木の形
が異なるので困る
2009 年 10 月 30 日 言語処理系入門 2 12
あいまいさの除去
 文法を書き換えることで,曖昧さを除去できる場合がある
 同じ言語を異なる文法で書きなおす
 例:あいまいでない式言語の文法
E → T | E + T | E – T
T → F | T * F | T / F
F → NUM | ( E )
 演算子に優先順位を付けるという手もある.
 本質的にあいまいな言語の場合,除去できない
 そんなときには言語設計を見直す必要あり
 C 言語の例:
 t * y;
 t が typedef された型名の場合はポインタ変数 y の宣言となるが, t
が変数名の場合,乗算の式となる.
例:ぶら下がり else
 次の if-then 文, if-then-else 文の文法を考える
stmt → if expr then stmt
| if expr then stmt else stmt
| other
 以下の文に対応する解析木は 2 通りある(左側の方が自然)
if E1 then if E2 then S1 else S2
 演習問題:上の文法を変形して曖昧さを取り除く
2009 年 10 月 30 日 言語処理系入門 2 13
stmt
if expr then stmt
if expr then stmt else stmt
E1
E2 S1
S2
stmt
if expr then stmt
if expr then stmt
else stmt
E1
E2 S1
S2
2009 年 10 月 30 日 言語処理系入門 2 14
構文解析ルーチンの作成
 文脈自由文法から機械的に構文解析ルーチンを作成
することができる
 予測型構文解析( LL(1) )
 簡単な文法向き
 手作業で構文解析ルーチンを作れる
 文法から左再帰を除去,左端の括り出しをしておく
 非終端記号ごとに対応する関数を作っていく
 LR 構文解析
 より複雑な文法向き
 一般には, Yacc などの構文解析器生成系を使って自動生
成する
 最右導出に相当する
 パーサーの動きがなじみにくいので,「慣れ」が必要
予測型構文解析ルーチンの例
 文法
E → T E’
E’ → + T E’
| – T E’
| ε
T → F T’
T’ → * F T’
| / F T’
| ε
F → NUM
| ( E )
void E() { T(); E_(); }
void E_() {
switch (next_tok) {
case ‘+’: match(‘+’); T(); E_(); break;
case ‘-’: match(‘-’); T(); E_(); break; }
}
void T() { F(); T_(); }
void T_() {
switch (next_tok) {
case ‘*’: match(‘*’); F(); T_(); break;
case ‘/’: match(‘/’); F(); T_(); break; }
}
void F() {
switch (next_tok) {
case NUM: match(NUM); break;
case ‘(‘: match(‘(‘); E(); match(‘)’); break;
default: error(); }
}
2009 年 10 月 30 日 言語処理系入門 2 15
LR 構文解析器の動作
 LR パーサーはスタッ
クと入力の状態に
よって動作する
 シフト動作:
 先頭の入力トークンをス
タックに積む
 還元動作:
 構文規則 X→A B C を選
択した場合,スタックか
ら C B A を取り出し, X
を積む
 LR パーサーのモデル
2009 年 10 月 30 日 言語処理系入門 2 16
構文解析
エンジン
action goto
構文解析表
Xm-1
…
s0
…a1 … $ai an入力
スタック
sm-1
Xm
sm 出力
動作例
 プリント参照
2009 年 10 月 30 日 言語処理系入門 2 17
2009 年 10 月 30 日 言語処理系入門 2 19
Ocamlyacc の記述例
%token <int> INTV
%token PLUS MINUS TIMES DIV LPAREN RPAREN SEMI
%left PLUS MINUS
%left TIMES DIV
%nonassoc UMINUS
%start toplevel
%type <Syntax.expr option> toplevel
%%
toplevel:
expr SEMI { Some $1 }
| /* empty */ SEMI { None }
;
expr:
INTV { Syntax.ValExpr $1 }
| LPAREN expr RPAREN { $2 }
| expr PLUS expr { Syntax.BopExpr(Syntax.BopAdd, $1, $3) }
| expr MINUS expr { Syntax.BopExpr(Syntax.BopSub, $1, $3) }
| expr TIMES expr { Syntax.BopExpr(Syntax.BopMul, $1, $3) }
| expr DIV expr { Syntax.BopExpr(Syntax.BopDiv, $1, $3) }
| MINUS expr %prec UMINUS { Syntax.UopExpr(Syntax.UopMin, $2) }
;
還元動作時に対応するアク
ションが実行され,左辺の記
号に対応する値を返す.
$1, $2, … で文法規則の右辺
に対応する記号の値を参照で
きる.
2009 年 10 月 30 日 言語処理系入門 2 20
抽象構文木
 言語の構成要素を表現しやすいように,解析
木を圧縮したもの
 解析木と異なり言語の構成要素は木の内部節点に
もあらわれる
 例: 1 + 2 * 3 – (4 + 5)
1
2 3
*
+
-
4 5
+
2009 年 10 月 30 日 言語処理系入門 2 21
具象構文と抽象構文
 具象構文
 プログラムの文面そのものを規定する
 プログラマーと処理系のインタフェースを表す
 あいまいな文法だと,パーサーが作れない
 抽象構文
 言語のセマンティクスや翻訳方法を表現するため
に用いる
 抽象構文木の構造を記述する
 あいまいな文法でもかまわない
 必要な括弧が省略されていると考える
2009 年 10 月 30 日 言語処理系入門 2 22
木構造データを Ocaml で定義する
 ヴァリアント型を使う
type tree = Leaf | Node of tree * tree
 値の例:
 Leaf
 Node(Leaf,Node(Leaf,Leaf))
 ・・・
 木の巡回は再帰関数とパターンマッチで
let rec traverse_tree tree =
match tree with
| Leaf -> ()
| Node(t1,t2) -> traverse_tree t1;
traverse_tree t2
Leaf
Leaf
Leaf Leaf
Node
Node
2009 年 10 月 30 日 言語処理系入門 2 23
抽象構文を Ocaml で定義する
 式言語の抽象構文
E ::= V
| E bop E
| uop E
V ::= n
n Z∈ , bop { +, -, *, / }∈ , uop { - }∈
 Ocaml での実装
type bop = BopAdd | BopSub | BopMul | BopDiv
type uop = UopMin
type expr = ValExpr of value
| BopExpr of bop * expr * expr
| UopExpr of uop * expr
and value = int
評価器の実装
(* 補助関数:演算子に対応する関数を返す *)
let fun_of_bop bop =
match bop with
BopAdd -> ( + )
| BopSub -> ( - )
| BopMul -> ( * )
| BopDiv -> ( / )
(* 評価器本体 : expr -> value *)
let rec eval e =
match e with
| ValExpr v -> v
| BopExpr(bop, e1, e2)
-> (fun_of_bop bop) (eval e1) (eval e2)
| UopExpr(UopMin, e1)
-> -(eval e1)
2009 年 10 月 30 日 言語処理系入門 2 24
2009 年 10 月 30 日 言語処理系入門 2 25
演習課題
 今週のサンプルプログラムをコンパイルして実行せよ
 以下のようなべき乗演算子 ** を追加してみよ
# 2 ** 3;
==> 8
# 2 ** 2 ** 3; // 右結合
==> 256
# 5 ** (-1);
==> invalid value!!!
2009 年 10 月 30 日 言語処理系入門 2 26
次回予定
 日時:
 2009 年 11 月 6 日(金) 17 : 00 - 18 : 30
 場所:
 LB2 3F/A 会議室
 内容:
 セマンティクスの定義
 変数, if 文

Contenu connexe

Tendances

【解説】 一般逆行列
【解説】 一般逆行列【解説】 一般逆行列
【解説】 一般逆行列Kenjiro Sugimoto
 
Transformerを多層にする際の勾配消失問題と解決法について
Transformerを多層にする際の勾配消失問題と解決法についてTransformerを多層にする際の勾配消失問題と解決法について
Transformerを多層にする際の勾配消失問題と解決法についてSho Takase
 
20160417dlibによる顔器官検出
20160417dlibによる顔器官検出20160417dlibによる顔器官検出
20160417dlibによる顔器官検出Takuya Minagawa
 
トップカンファレンスへの論文採択に向けて(AI研究分野版)/ Toward paper acceptance at top conferences (AI...
トップカンファレンスへの論文採択に向けて(AI研究分野版)/ Toward paper acceptance at top conferences (AI...トップカンファレンスへの論文採択に向けて(AI研究分野版)/ Toward paper acceptance at top conferences (AI...
トップカンファレンスへの論文採択に向けて(AI研究分野版)/ Toward paper acceptance at top conferences (AI...JunSuzuki21
 
最適輸送の解き方
最適輸送の解き方最適輸送の解き方
最適輸送の解き方joisino
 
Crfと素性テンプレート
Crfと素性テンプレートCrfと素性テンプレート
Crfと素性テンプレートKei Uchiumi
 
Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化Yusuke Fujimoto
 
数式を綺麗にプログラミングするコツ #spro2013
数式を綺麗にプログラミングするコツ #spro2013数式を綺麗にプログラミングするコツ #spro2013
数式を綺麗にプログラミングするコツ #spro2013Shuyo Nakatani
 
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)RyuichiKanoh
 
[DL輪読会]Factorized Variational Autoencoders for Modeling Audience Reactions to...
[DL輪読会]Factorized Variational Autoencoders for Modeling Audience Reactions to...[DL輪読会]Factorized Variational Autoencoders for Modeling Audience Reactions to...
[DL輪読会]Factorized Variational Autoencoders for Modeling Audience Reactions to...Deep Learning JP
 
yieldとreturnの話
yieldとreturnの話yieldとreturnの話
yieldとreturnの話bleis tift
 
Optimizer入門&最新動向
Optimizer入門&最新動向Optimizer入門&最新動向
Optimizer入門&最新動向Motokawa Tetsuya
 
One Class SVMを用いた異常値検知
One Class SVMを用いた異常値検知One Class SVMを用いた異常値検知
One Class SVMを用いた異常値検知Yuto Mori
 
Priorに基づく画像/テンソルの復元
Priorに基づく画像/テンソルの復元Priorに基づく画像/テンソルの復元
Priorに基づく画像/テンソルの復元Tatsuya Yokota
 
チューリング・マシンとコンピュータ工学
チューリング・マシンとコンピュータ工学チューリング・マシンとコンピュータ工学
チューリング・マシンとコンピュータ工学Junpei Tsuji
 
クラシックな機械学習入門:付録:よく使う線形代数の公式
クラシックな機械学習入門:付録:よく使う線形代数の公式クラシックな機械学習入門:付録:よく使う線形代数の公式
クラシックな機械学習入門:付録:よく使う線形代数の公式Hiroshi Nakagawa
 

Tendances (20)

【解説】 一般逆行列
【解説】 一般逆行列【解説】 一般逆行列
【解説】 一般逆行列
 
Transformerを多層にする際の勾配消失問題と解決法について
Transformerを多層にする際の勾配消失問題と解決法についてTransformerを多層にする際の勾配消失問題と解決法について
Transformerを多層にする際の勾配消失問題と解決法について
 
CVPR 2019 速報
CVPR 2019 速報CVPR 2019 速報
CVPR 2019 速報
 
20160417dlibによる顔器官検出
20160417dlibによる顔器官検出20160417dlibによる顔器官検出
20160417dlibによる顔器官検出
 
トップカンファレンスへの論文採択に向けて(AI研究分野版)/ Toward paper acceptance at top conferences (AI...
トップカンファレンスへの論文採択に向けて(AI研究分野版)/ Toward paper acceptance at top conferences (AI...トップカンファレンスへの論文採択に向けて(AI研究分野版)/ Toward paper acceptance at top conferences (AI...
トップカンファレンスへの論文採択に向けて(AI研究分野版)/ Toward paper acceptance at top conferences (AI...
 
最適輸送の解き方
最適輸送の解き方最適輸送の解き方
最適輸送の解き方
 
Crfと素性テンプレート
Crfと素性テンプレートCrfと素性テンプレート
Crfと素性テンプレート
 
Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化
 
数式を綺麗にプログラミングするコツ #spro2013
数式を綺麗にプログラミングするコツ #spro2013数式を綺麗にプログラミングするコツ #spro2013
数式を綺麗にプログラミングするコツ #spro2013
 
正準相関分析
正準相関分析正準相関分析
正準相関分析
 
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
 
[DL輪読会]Factorized Variational Autoencoders for Modeling Audience Reactions to...
[DL輪読会]Factorized Variational Autoencoders for Modeling Audience Reactions to...[DL輪読会]Factorized Variational Autoencoders for Modeling Audience Reactions to...
[DL輪読会]Factorized Variational Autoencoders for Modeling Audience Reactions to...
 
yieldとreturnの話
yieldとreturnの話yieldとreturnの話
yieldとreturnの話
 
Optimizer入門&最新動向
Optimizer入門&最新動向Optimizer入門&最新動向
Optimizer入門&最新動向
 
BERT+XLNet+RoBERTa
BERT+XLNet+RoBERTaBERT+XLNet+RoBERTa
BERT+XLNet+RoBERTa
 
One Class SVMを用いた異常値検知
One Class SVMを用いた異常値検知One Class SVMを用いた異常値検知
One Class SVMを用いた異常値検知
 
Priorに基づく画像/テンソルの復元
Priorに基づく画像/テンソルの復元Priorに基づく画像/テンソルの復元
Priorに基づく画像/テンソルの復元
 
チューリング・マシンとコンピュータ工学
チューリング・マシンとコンピュータ工学チューリング・マシンとコンピュータ工学
チューリング・マシンとコンピュータ工学
 
クラシックな機械学習入門:付録:よく使う線形代数の公式
クラシックな機械学習入門:付録:よく使う線形代数の公式クラシックな機械学習入門:付録:よく使う線形代数の公式
クラシックな機械学習入門:付録:よく使う線形代数の公式
 
Map
MapMap
Map
 

Similaire à 言語処理系入門€2

言語処理系入門3
言語処理系入門3言語処理系入門3
言語処理系入門3Kenta Hattori
 
[Basic 10] 形式言語 / 字句解析
[Basic 10] 形式言語 / 字句解析[Basic 10] 形式言語 / 字句解析
[Basic 10] 形式言語 / 字句解析Yuto Takei
 
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミングYuto Takei
 
Ruby紹介3(pdf)
Ruby紹介3(pdf)Ruby紹介3(pdf)
Ruby紹介3(pdf)Gohryuh
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10Kenta Hattori
 
2013computer s1
2013computer s12013computer s1
2013computer s1munich1502
 
言語処理系入門1
言語処理系入門1言語処理系入門1
言語処理系入門1Kenta Hattori
 
言語処理系入門€5
言語処理系入門€5言語処理系入門€5
言語処理系入門€5Kenta Hattori
 
Probabilistic Graphical Models 輪読会 Chapter5
Probabilistic Graphical Models 輪読会 Chapter5Probabilistic Graphical Models 輪読会 Chapter5
Probabilistic Graphical Models 輪読会 Chapter5Daiki Shimada
 
Newtsulideprint
NewtsulideprintNewtsulideprint
Newtsulideprinttononro
 
言語処理系入門€7
言語処理系入門€7言語処理系入門€7
言語処理系入門€7Kenta Hattori
 
PRML輪講用資料10章(パターン認識と機械学習,近似推論法)
PRML輪講用資料10章(パターン認識と機械学習,近似推論法)PRML輪講用資料10章(パターン認識と機械学習,近似推論法)
PRML輪講用資料10章(パターン認識と機械学習,近似推論法)Toshiyuki Shimono
 
アルゴリズムとデータ構造2
アルゴリズムとデータ構造2アルゴリズムとデータ構造2
アルゴリズムとデータ構造2Kenta Hattori
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
ZFSのソースコードをチラ見してみる
ZFSのソースコードをチラ見してみるZFSのソースコードをチラ見してみる
ZFSのソースコードをチラ見してみるKoichi Suzuki
 
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)Google Developer Relations Team
 
鬱くしい日本語のための形態素解析入門
鬱くしい日本語のための形態素解析入門鬱くしい日本語のための形態素解析入門
鬱くしい日本語のための形態素解析入門Hiroyoshi Komatsu
 
JSX / Haxe / TypeScript
JSX / Haxe / TypeScriptJSX / Haxe / TypeScript
JSX / Haxe / TypeScriptbleis tift
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 

Similaire à 言語処理系入門€2 (20)

言語処理系入門3
言語処理系入門3言語処理系入門3
言語処理系入門3
 
[Basic 10] 形式言語 / 字句解析
[Basic 10] 形式言語 / 字句解析[Basic 10] 形式言語 / 字句解析
[Basic 10] 形式言語 / 字句解析
 
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
 
Ruby紹介3(pdf)
Ruby紹介3(pdf)Ruby紹介3(pdf)
Ruby紹介3(pdf)
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10
 
2013computer s1
2013computer s12013computer s1
2013computer s1
 
言語処理系入門1
言語処理系入門1言語処理系入門1
言語処理系入門1
 
言語処理系入門€5
言語処理系入門€5言語処理系入門€5
言語処理系入門€5
 
Probabilistic Graphical Models 輪読会 Chapter5
Probabilistic Graphical Models 輪読会 Chapter5Probabilistic Graphical Models 輪読会 Chapter5
Probabilistic Graphical Models 輪読会 Chapter5
 
Newtsulideprint
NewtsulideprintNewtsulideprint
Newtsulideprint
 
言語処理系入門€7
言語処理系入門€7言語処理系入門€7
言語処理系入門€7
 
PRML輪講用資料10章(パターン認識と機械学習,近似推論法)
PRML輪講用資料10章(パターン認識と機械学習,近似推論法)PRML輪講用資料10章(パターン認識と機械学習,近似推論法)
PRML輪講用資料10章(パターン認識と機械学習,近似推論法)
 
アルゴリズムとデータ構造2
アルゴリズムとデータ構造2アルゴリズムとデータ構造2
アルゴリズムとデータ構造2
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
ZFSのソースコードをチラ見してみる
ZFSのソースコードをチラ見してみるZFSのソースコードをチラ見してみる
ZFSのソースコードをチラ見してみる
 
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
 
鬱くしい日本語のための形態素解析入門
鬱くしい日本語のための形態素解析入門鬱くしい日本語のための形態素解析入門
鬱くしい日本語のための形態素解析入門
 
JSX / Haxe / TypeScript
JSX / Haxe / TypeScriptJSX / Haxe / TypeScript
JSX / Haxe / TypeScript
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
Introduction to PEG
Introduction to PEGIntroduction to PEG
Introduction to PEG
 

Plus de Kenta Hattori

オブジェクト指向入門2
オブジェクト指向入門2オブジェクト指向入門2
オブジェクト指向入門2Kenta Hattori
 
オブジェクト指向入門1
オブジェクト指向入門1オブジェクト指向入門1
オブジェクト指向入門1Kenta Hattori
 
オブジェクト指向入門10
オブジェクト指向入門10オブジェクト指向入門10
オブジェクト指向入門10Kenta Hattori
 
オブジェクト指向入門9
オブジェクト指向入門9オブジェクト指向入門9
オブジェクト指向入門9Kenta Hattori
 
オブジェクト指向入門8
オブジェクト指向入門8オブジェクト指向入門8
オブジェクト指向入門8Kenta Hattori
 
オブジェクト指向入門7
オブジェクト指向入門7オブジェクト指向入門7
オブジェクト指向入門7Kenta Hattori
 
オブジェクト指向入門6
オブジェクト指向入門6オブジェクト指向入門6
オブジェクト指向入門6Kenta Hattori
 
オブジェクト指向入門5
オブジェクト指向入門5オブジェクト指向入門5
オブジェクト指向入門5Kenta Hattori
 
オブジェクト指向入門4
オブジェクト指向入門4オブジェクト指向入門4
オブジェクト指向入門4Kenta Hattori
 
オブジェクト指向入門3
オブジェクト指向入門3オブジェクト指向入門3
オブジェクト指向入門3Kenta Hattori
 
ソフトウェア・テスト入門2
ソフトウェア・テスト入門2ソフトウェア・テスト入門2
ソフトウェア・テスト入門2Kenta Hattori
 
ソフトウェア・テスト入門1
ソフトウェア・テスト入門1ソフトウェア・テスト入門1
ソフトウェア・テスト入門1Kenta Hattori
 
ソフトウェア・テスト入門8
ソフトウェア・テスト入門8ソフトウェア・テスト入門8
ソフトウェア・テスト入門8Kenta Hattori
 
ソフトウェア・テスト入門7
ソフトウェア・テスト入門7ソフトウェア・テスト入門7
ソフトウェア・テスト入門7Kenta Hattori
 
ソフトウェア・テスト入門6
ソフトウェア・テスト入門6ソフトウェア・テスト入門6
ソフトウェア・テスト入門6Kenta Hattori
 
ソフトウェア・テスト入門5
ソフトウェア・テスト入門5ソフトウェア・テスト入門5
ソフトウェア・テスト入門5Kenta Hattori
 
ソフトウェア・テスト入門4
ソフトウェア・テスト入門4ソフトウェア・テスト入門4
ソフトウェア・テスト入門4Kenta Hattori
 
ソフトウェア・テスト入門3
ソフトウェア・テスト入門3ソフトウェア・テスト入門3
ソフトウェア・テスト入門3Kenta Hattori
 
アルゴリズムとデータ構造15
アルゴリズムとデータ構造15アルゴリズムとデータ構造15
アルゴリズムとデータ構造15Kenta Hattori
 
アルゴリズムとデータ構造14
アルゴリズムとデータ構造14アルゴリズムとデータ構造14
アルゴリズムとデータ構造14Kenta Hattori
 

Plus de Kenta Hattori (20)

オブジェクト指向入門2
オブジェクト指向入門2オブジェクト指向入門2
オブジェクト指向入門2
 
オブジェクト指向入門1
オブジェクト指向入門1オブジェクト指向入門1
オブジェクト指向入門1
 
オブジェクト指向入門10
オブジェクト指向入門10オブジェクト指向入門10
オブジェクト指向入門10
 
オブジェクト指向入門9
オブジェクト指向入門9オブジェクト指向入門9
オブジェクト指向入門9
 
オブジェクト指向入門8
オブジェクト指向入門8オブジェクト指向入門8
オブジェクト指向入門8
 
オブジェクト指向入門7
オブジェクト指向入門7オブジェクト指向入門7
オブジェクト指向入門7
 
オブジェクト指向入門6
オブジェクト指向入門6オブジェクト指向入門6
オブジェクト指向入門6
 
オブジェクト指向入門5
オブジェクト指向入門5オブジェクト指向入門5
オブジェクト指向入門5
 
オブジェクト指向入門4
オブジェクト指向入門4オブジェクト指向入門4
オブジェクト指向入門4
 
オブジェクト指向入門3
オブジェクト指向入門3オブジェクト指向入門3
オブジェクト指向入門3
 
ソフトウェア・テスト入門2
ソフトウェア・テスト入門2ソフトウェア・テスト入門2
ソフトウェア・テスト入門2
 
ソフトウェア・テスト入門1
ソフトウェア・テスト入門1ソフトウェア・テスト入門1
ソフトウェア・テスト入門1
 
ソフトウェア・テスト入門8
ソフトウェア・テスト入門8ソフトウェア・テスト入門8
ソフトウェア・テスト入門8
 
ソフトウェア・テスト入門7
ソフトウェア・テスト入門7ソフトウェア・テスト入門7
ソフトウェア・テスト入門7
 
ソフトウェア・テスト入門6
ソフトウェア・テスト入門6ソフトウェア・テスト入門6
ソフトウェア・テスト入門6
 
ソフトウェア・テスト入門5
ソフトウェア・テスト入門5ソフトウェア・テスト入門5
ソフトウェア・テスト入門5
 
ソフトウェア・テスト入門4
ソフトウェア・テスト入門4ソフトウェア・テスト入門4
ソフトウェア・テスト入門4
 
ソフトウェア・テスト入門3
ソフトウェア・テスト入門3ソフトウェア・テスト入門3
ソフトウェア・テスト入門3
 
アルゴリズムとデータ構造15
アルゴリズムとデータ構造15アルゴリズムとデータ構造15
アルゴリズムとデータ構造15
 
アルゴリズムとデータ構造14
アルゴリズムとデータ構造14アルゴリズムとデータ構造14
アルゴリズムとデータ構造14
 

言語処理系入門€2

  • 2. 2009 年 10 月 30 日 言語処理系入門 2 3 構文の定義  例: C 言語の if-else 文 if ( 式 ) 文 [ else 文 ]  [] はオプショナルを示す  もう少し,形式的に定義すると... stmt → if ( expr ) stmt else-clause-opt else-stmt-opt → else stmt | ε  A → B は生成規則生成規則と呼ばれ,「 A は B の形式を持つ」と 読める.  A → B, A → C といちいち書くかわりに A → B | C と書いて もよい  if や else,(,) のような青字はトークン(終端記号)を表 す.  expr や stmt を非終端記号非終端記号と呼ぶ.  非終端記号はトークンの列を表す  ε は空のトークン列を表す
  • 3. 2009 年 10 月 30 日 言語処理系入門 2 4 文脈自由文法  次の4つの要素からなる  終端記号(トークン)の集合  非終端記号の集合  生成規則の集合  生成規則の左辺は非終端記号,右辺は終端記号と非終端記号 の列  開始記号とよぶ 1 つの非終端記号  演習問題:以下の文法が生成するトークン列は?  S → ε | S P  P → ( S )
  • 4. 2009 年 10 月 30 日 言語処理系入門 2 5 正規表現と文脈自由文法  文脈自由文法の構文規則を A → a A , A → ε ,  A → B の形式に制限すると,正規表現と等価になる.  逆にいえば,どんな正規表現でも,上のような形を 持った等価な文脈自由文法として定義することがで きる.  正規表現と等価な NFA( 非決定性有限オートマトン ) の各 状態 Si を非終端記号 Si に対応  開始状態 S0 は開始記号 S0 に対応  <Si,a>→Sj という遷移があれば, Si → a Sj  <Si,ε>→Sj なら, Si→Sj  Sn が終了状態なら Sn →ε  正規表現⊂文脈自由文法
  • 5. 2009 年 10 月 30 日 言語処理系入門 2 6 文脈自由文法の限界  以下の言語は文脈自由文法では定義できない  L1 = { wcw | w は a と b の任意の列 }  aabcaab, abcab, abababcababab, …  ちなみに L1’ = { wcwR | wR は w の逆順を表す } は文脈自由  L2 = { an bm cn dm | n 1,≧ m 1 }≧  abcd, abbcdd, aaaabcccd, …  ちなみに L2’ = { an bn cm dm | n 1,≧ m 1 }≧ は文脈自由  L3 = { an bn cn | n 0 }≧  abc, aabbcc, aaabbbccc, …  ちなみに L3’ = { an bn | n 0 }≧ は文脈自由  識別子の使用が宣言よりも前になければならない言語  関数定義の仮引数と呼び出しにおける実引数の個数は一致 してなければならない言語 ⇒ コンパイラの意味解析フェーズでチェックする
  • 6. 2009 年 10 月 30 日 言語処理系入門 2 7 BNF による文脈自由文法の記述  色々とバリエーションはあるが...  A→B を A ::= B と書く  非終端記号を <symbol> で表す  ’終端記号を symbol’ で表す  例:  <stmt> ::= ‘if’ ‘(‘ <expr> ‘)’ <stmt> <else-clause-opt>  <else-clause-opt> ::= ‘else’ <stmt> | /* empty */  拡張 BNF だと,以下の記号も使える  ? -オプション  + - 1 個以上の繰返し  * - 0 個以上の繰返し
  • 7. 2009 年 10 月 30 日 言語処理系入門 2 8 例:式言語の文法定義 expr → NUM | expr + expr | expr – expr | expr * expr | expr / expr | ( expr )  開始記号は expr  NUM は 23 や 5 など,整数を表すトークン
  • 8. 2009 年 10 月 30 日 言語処理系入門 2 9 導出  開始記号から出発して,構文規則を右向きに適用してながら非 終端記号を書き換えていくと,最終的にトークン列が得られる .  いわゆる文法エラーとなるプログラムは,文法規則から導出で きないトークン列のことである  導出の例(最左導出): expr  ⇒  expr + expr ⇒   NUM + expr ⇒   NUM + expr - expr ⇒   NUM + expr * expr - expr ⇒   NUM + NUM * expr - expr ⇒   NUM + NUM * NUM - expr ⇒   NUM + NUM * NUM - ( expr ) ⇒   NUM + NUM * NUM - ( expr + expr ) ⇒   NUM + NUM * NUM - ( NUM + expr ) ⇒   NUM + NUM * NUM - ( NUM + NUM ) 最左導出は,最も左側 に位置する非終端記号 を置き換えていく
  • 9. 2009 年 10 月 30 日 言語処理系入門 2 10 解析木( Parse Tree )  置換えの順序を取り除 いた導出をグラフ (木)で表現したもの  木の内部節点(ノード)  非終端記号  木の葉  終端記号(トークン)  葉を左から右にたどると トークン列が得られる  異なる導出戦略でも同 じ解析木が得られる E E + E NUM E - E *E E NUM NUM E( ) E + E NUMNUM
  • 10. 2009 年 10 月 30 日 言語処理系入門 2 11 あいまいな文法  ある文法から導出されるトークン列に対応する解析 木が複数あり得る場合,その文法はあいまいな文あいまいな文 法法であるE E + E NUM E - E *E E NUM NUM E( ) E + E NUMNUM E E E NUM E - E * E E NUM NUM E( ) E + E NUMNUM + (具象)構文を定義す る場合,同じ入力 (トークン列)に対し て得られる解析木の形 が異なるので困る
  • 11. 2009 年 10 月 30 日 言語処理系入門 2 12 あいまいさの除去  文法を書き換えることで,曖昧さを除去できる場合がある  同じ言語を異なる文法で書きなおす  例:あいまいでない式言語の文法 E → T | E + T | E – T T → F | T * F | T / F F → NUM | ( E )  演算子に優先順位を付けるという手もある.  本質的にあいまいな言語の場合,除去できない  そんなときには言語設計を見直す必要あり  C 言語の例:  t * y;  t が typedef された型名の場合はポインタ変数 y の宣言となるが, t が変数名の場合,乗算の式となる.
  • 12. 例:ぶら下がり else  次の if-then 文, if-then-else 文の文法を考える stmt → if expr then stmt | if expr then stmt else stmt | other  以下の文に対応する解析木は 2 通りある(左側の方が自然) if E1 then if E2 then S1 else S2  演習問題:上の文法を変形して曖昧さを取り除く 2009 年 10 月 30 日 言語処理系入門 2 13 stmt if expr then stmt if expr then stmt else stmt E1 E2 S1 S2 stmt if expr then stmt if expr then stmt else stmt E1 E2 S1 S2
  • 13. 2009 年 10 月 30 日 言語処理系入門 2 14 構文解析ルーチンの作成  文脈自由文法から機械的に構文解析ルーチンを作成 することができる  予測型構文解析( LL(1) )  簡単な文法向き  手作業で構文解析ルーチンを作れる  文法から左再帰を除去,左端の括り出しをしておく  非終端記号ごとに対応する関数を作っていく  LR 構文解析  より複雑な文法向き  一般には, Yacc などの構文解析器生成系を使って自動生 成する  最右導出に相当する  パーサーの動きがなじみにくいので,「慣れ」が必要
  • 14. 予測型構文解析ルーチンの例  文法 E → T E’ E’ → + T E’ | – T E’ | ε T → F T’ T’ → * F T’ | / F T’ | ε F → NUM | ( E ) void E() { T(); E_(); } void E_() { switch (next_tok) { case ‘+’: match(‘+’); T(); E_(); break; case ‘-’: match(‘-’); T(); E_(); break; } } void T() { F(); T_(); } void T_() { switch (next_tok) { case ‘*’: match(‘*’); F(); T_(); break; case ‘/’: match(‘/’); F(); T_(); break; } } void F() { switch (next_tok) { case NUM: match(NUM); break; case ‘(‘: match(‘(‘); E(); match(‘)’); break; default: error(); } } 2009 年 10 月 30 日 言語処理系入門 2 15
  • 15. LR 構文解析器の動作  LR パーサーはスタッ クと入力の状態に よって動作する  シフト動作:  先頭の入力トークンをス タックに積む  還元動作:  構文規則 X→A B C を選 択した場合,スタックか ら C B A を取り出し, X を積む  LR パーサーのモデル 2009 年 10 月 30 日 言語処理系入門 2 16 構文解析 エンジン action goto 構文解析表 Xm-1 … s0 …a1 … $ai an入力 スタック sm-1 Xm sm 出力
  • 16. 動作例  プリント参照 2009 年 10 月 30 日 言語処理系入門 2 17
  • 17. 2009 年 10 月 30 日 言語処理系入門 2 19 Ocamlyacc の記述例 %token <int> INTV %token PLUS MINUS TIMES DIV LPAREN RPAREN SEMI %left PLUS MINUS %left TIMES DIV %nonassoc UMINUS %start toplevel %type <Syntax.expr option> toplevel %% toplevel: expr SEMI { Some $1 } | /* empty */ SEMI { None } ; expr: INTV { Syntax.ValExpr $1 } | LPAREN expr RPAREN { $2 } | expr PLUS expr { Syntax.BopExpr(Syntax.BopAdd, $1, $3) } | expr MINUS expr { Syntax.BopExpr(Syntax.BopSub, $1, $3) } | expr TIMES expr { Syntax.BopExpr(Syntax.BopMul, $1, $3) } | expr DIV expr { Syntax.BopExpr(Syntax.BopDiv, $1, $3) } | MINUS expr %prec UMINUS { Syntax.UopExpr(Syntax.UopMin, $2) } ; 還元動作時に対応するアク ションが実行され,左辺の記 号に対応する値を返す. $1, $2, … で文法規則の右辺 に対応する記号の値を参照で きる.
  • 18. 2009 年 10 月 30 日 言語処理系入門 2 20 抽象構文木  言語の構成要素を表現しやすいように,解析 木を圧縮したもの  解析木と異なり言語の構成要素は木の内部節点に もあらわれる  例: 1 + 2 * 3 – (4 + 5) 1 2 3 * + - 4 5 +
  • 19. 2009 年 10 月 30 日 言語処理系入門 2 21 具象構文と抽象構文  具象構文  プログラムの文面そのものを規定する  プログラマーと処理系のインタフェースを表す  あいまいな文法だと,パーサーが作れない  抽象構文  言語のセマンティクスや翻訳方法を表現するため に用いる  抽象構文木の構造を記述する  あいまいな文法でもかまわない  必要な括弧が省略されていると考える
  • 20. 2009 年 10 月 30 日 言語処理系入門 2 22 木構造データを Ocaml で定義する  ヴァリアント型を使う type tree = Leaf | Node of tree * tree  値の例:  Leaf  Node(Leaf,Node(Leaf,Leaf))  ・・・  木の巡回は再帰関数とパターンマッチで let rec traverse_tree tree = match tree with | Leaf -> () | Node(t1,t2) -> traverse_tree t1; traverse_tree t2 Leaf Leaf Leaf Leaf Node Node
  • 21. 2009 年 10 月 30 日 言語処理系入門 2 23 抽象構文を Ocaml で定義する  式言語の抽象構文 E ::= V | E bop E | uop E V ::= n n Z∈ , bop { +, -, *, / }∈ , uop { - }∈  Ocaml での実装 type bop = BopAdd | BopSub | BopMul | BopDiv type uop = UopMin type expr = ValExpr of value | BopExpr of bop * expr * expr | UopExpr of uop * expr and value = int
  • 22. 評価器の実装 (* 補助関数:演算子に対応する関数を返す *) let fun_of_bop bop = match bop with BopAdd -> ( + ) | BopSub -> ( - ) | BopMul -> ( * ) | BopDiv -> ( / ) (* 評価器本体 : expr -> value *) let rec eval e = match e with | ValExpr v -> v | BopExpr(bop, e1, e2) -> (fun_of_bop bop) (eval e1) (eval e2) | UopExpr(UopMin, e1) -> -(eval e1) 2009 年 10 月 30 日 言語処理系入門 2 24
  • 23. 2009 年 10 月 30 日 言語処理系入門 2 25 演習課題  今週のサンプルプログラムをコンパイルして実行せよ  以下のようなべき乗演算子 ** を追加してみよ # 2 ** 3; ==> 8 # 2 ** 2 ** 3; // 右結合 ==> 256 # 5 ** (-1); ==> invalid value!!!
  • 24. 2009 年 10 月 30 日 言語処理系入門 2 26 次回予定  日時:  2009 年 11 月 6 日(金) 17 : 00 - 18 : 30  場所:  LB2 3F/A 会議室  内容:  セマンティクスの定義  変数, if 文