View
77
Download
0
Category
Preview:
DESCRIPTION
言語プロセッサ 2013 - No.6-. 東京工科大学 コンピュータサイエンス学部 亀田弘之. これからの内容. 字句解析プログラムの作成方法 手書きの方法 Flex を利用する方法 構文解析 解析手法の種類 左再帰とその除去 括りだし First と Follow. 参考資料 ( 発展 ). Intermediate Representations in Imperative Compilers: A Survey, James Stanier and Des Watson, - PowerPoint PPT Presentation
Citation preview
言語プロセッサ 2013-No.6-
言語プロセッサ 2013-No.6-
東京工科大学コンピュータサイエンス学部
亀田弘之
これからの内容1. 字句解析プログラムの作成方法
• 手書きの方法• Flex を利用する方法
2. 構文解析• 解析手法の種類• 左再帰とその除去• 括りだし• First と Follow
2言語プロセッサ 2013 (東京工科大学CS学部)
参考資料 ( 発展 )Intermediate Representations in
Imperative Compilers: A Survey, James Stanier and Des Watson, ACM Computing Surveys, Vol.45,
No.3, Article 26(27 pages), 2013.
3言語プロセッサ 2013 (東京工科大学CS学部)
復習課題: F lex を使ってみよう!• 自分で過去問に取り組む。• 自分で新しい課題を見つける。• その他(自由に)
4言語プロセッサ 2013 (東京工科大学CS学部)
手順
FlexFlex gccgccFlexProgram
Lex.yy.c
a.exea.exe文字列入力 出力
ライブラリ(fl)
5言語プロセッサ 2013 (東京工科大学CS学部)
Flex プログラムの記述(1)
delim [ \t\n]ws {delim}+letter [a-zA-Z]digit [0-9]id {letter}({letter}|{digit})*number {digit}+(\.{digit}+)?(E[+\-]?
{digit}+)?%%
6言語プロセッサ 2013 (東京工科大学CS学部)
Flex プログラムの記述(2)
{ws} { /* do nothing */ }If {return(IF);}Then {return(THEN);}else {return(ELSE);}{id} {yylval = install_id( );
return(ID);}{number} {yylval = install_num();
return(NUMBER);}
7言語プロセッサ 2013 (東京工科大学CS学部)
Flex プログラムの記述(3)
“<” {yylval = LT; return(RELOP);}“<=“ {yylval = LE; return(RELOP);}“=“ {yylval = EQ; return(RELOP);}“<>” {yylval = NE; return(RELOP);}“>“ {yylval = GT; return(RELOP);}“>=“ {yylval = GE; return(RELOP);}%%
8言語プロセッサ 2013 (東京工科大学CS学部)
Flex プログラムの記述(4)
install_id( ){static int id_ptr=0;return(id_ptr); }
install_num( ){static int num_ptr=0;return(num_ptr); }
9言語プロセッサ 2013 (東京工科大学CS学部)
Flex の復習
10言語プロセッサ 2013 (東京工科大学CS学部)
手順1. Flex のプログラムを書く。2. Flex のプログラムを flex にかける。3. 出力ファイル lex.yy.c を gcc でコン
パイルする。この際,ライブラリーを忘れずに!
4. 出力 a.exe を実行する。5. さまざまな文字列を入力する。
11言語プロセッサ 2013 (東京工科大学CS学部)
手順
Flex gccFlexProgram
Lex.yy.c
a.exe文字列入力 出力
ライブラリ(fl)
12言語プロセッサ 2013 (東京工科大学CS学部)
実際の手順
C:\> flex sample01.lC:\> gcc lex.yy.c –lflC:\> a.exe
それでは、実際にやってみよう。
13言語プロセッサ 2013 (東京工科大学CS学部)
字句解析から構文解析へ
以上で、字句解析(入門)は終わり。字句解析の次の処理は、構文解析でした
ね。
14言語プロセッサ 2013 (東京工科大学CS学部)
構文解析編
15言語プロセッサ 2013 (東京工科大学CS学部)
キーワード(構文解析)• 上向き解析 / 下向き解析
( bottom up & top down )• Backtracking• 括りだし (factoring)• 左再帰性• First 集合 /Follow 集合 など
16言語プロセッサ 2013 (東京工科大学CS学部)
いろいろな構文解析法• 構文解析手法はとてもよく研究されて
おり、様々な手法が知られている。• 例えば、
– Early 法– Chart 法
などなど (余裕のある人はいずれ 勉強してください)
自然言語処理( CS 学部3年後期開講科目,担当教員:亀田)自然言語処理( CS 学部3年後期開講科目,担当教員:亀田)
プチお知らせプチお知らせ
17言語プロセッサ 2013 (東京工科大学CS学部)
• 処理対象の文法の性質を利用して、より効率的な手法がいろいろと提案されている。
18言語プロセッサ 2013 (東京工科大学CS学部)
• 文脈自由文法– Early 法・ Chart 法 など
• 通常のプログラミング言語は、文脈自由文法ではないが、その構成要素の多くは文脈自由文法で記述可能!
• 文法の制限の仕方にもいろいろある。
19言語プロセッサ 2013 (東京工科大学CS学部)
LR 文法と LL 文法 (1)• LR 文法に対する構文解析法( LR 構文解
析法) → bottom up 型• LL 文法に対する構文解析法( LL 構文解析
法) → top down 型
(教科書 76-77 ページ参照)
20言語プロセッサ 2013 (東京工科大学CS学部)
LR 文法と LL 文法 (2)• LR 文法に対する構文解析法( LR 構文解析
法)→ bottom up 型 <= 自動生成向き
(Bison)• LL 文法に対する構文解析法( LL 構文解析
法)→ top down 型 <= 手作業可能
(教科書 76-77 ページ参照)21言語プロセッサ 2013 (東京工科
大学CS学部)
LL(k) 文法• 構文解析は、文法規則(書き換え規
則)を適用しつつ進行。• 適用すべき規則は、一般には複数個存
在。 → backtrack 発生→ 効率低下(回避すべき!)
• k 文字先読で適用すべき規則が決定される文法がある!( LL(k) 文法と呼ぶ)
Backtrack なし!
これはすごい!
22言語プロセッサ 2013 (東京工科大学CS学部)
以下、 LL(1) を取り扱います
23言語プロセッサ 2013 (東京工科大学CS学部)
実例で考えよう!1. 括りだし2. 左再帰の回避
24言語プロセッサ 2013 (東京工科大学CS学部)
1.括りだし• 文法
S → aBdB → b | bc
• 入力: abcd
25言語プロセッサ 2013 (東京工科大学CS学部)
a b c d26言語プロセッサ 2013 (東京工科
大学CS学部)
a b c d
S
B
27言語プロセッサ 2013 (東京工科大学CS学部)
a b c d
S
B
? 28言語プロセッサ 2013 (東京工科大学CS学部)
a b c d
S
B
Backtrac 発生!
29言語プロセッサ 2013 (東京工科大学CS学部)
a b c d
S
B
解析成功!
30言語プロセッサ 2013 (東京工科大学CS学部)
• backtrack 回避の方法→ 括りだし
31言語プロセッサ 2013 (東京工科大学CS学部)
1.括りだし• 文法
S → aBd S → aBdB → b | bc B → b (c |ε)
32言語プロセッサ 2013 (東京工科大学CS学部)
左再帰の回避
A→AβA
A β
A β
無限降下だ!無限降下だ!
Fermat33言語プロセッサ 2013 (東京工科
大学CS学部)
左再帰の回避方法• A→Aα|β
A → βA’ A’ → αA’ | ε
(教科書 81 ページ参照)
34言語プロセッサ 2013 (東京工科大学CS学部)
左再帰の例E → E + T | TT → T * F | FF → ( E ) | id
35言語プロセッサ 2013 (東京工科大学CS学部)
左再帰の回避E → E + T | TT → T * F | FF → ( E ) | id
E → T E’ E’ → + T E’ | ε
36言語プロセッサ 2013 (東京工科大学CS学部)
左再帰の回避E → E + T | TT → T * F | FF → ( E ) | id
E → T E’ E’ → + T E’ | ε
T → F T’ T’ → * F T’ | ε
F → ( E ) | id
37言語プロセッサ 2013 (東京工科大学CS学部)
LL(1) 文法• LL(1) 文法は、1文字先読みすること
で、適用すべき規則が一意に決まる、という性質を備え持っている。
• つまり、「 A→α | β 」に対して、1文字先読みすれば、 「 A→α 」 と「 A→β 」のどちらを適用すればいいのかが決まる。(効率のよい処理が望める)
38言語プロセッサ 2013 (東京工科大学CS学部)
でも、与えられた文法が LL(1) 文法であることをどうやって知ることができるのだろうか?
39言語プロセッサ 2013 (東京工科大学CS学部)
LL(1) 文法の判定法• First• Follow
これは次回やりましょう。少し煩雑で
すが、難しくはありません。でも重要ですよ!
40言語プロセッサ 2013 (東京工科大学CS学部)
Recommended