東京工科大学 コンピュータサイエンス学部 亀田弘之

Slides:



Advertisements
Similar presentations
プログラミング言語論 第3回 BNF 記法について(演習付き) 篠埜 功. 構文の記述 プログラミング言語の構文はどのように定式化できるか? 例1 : for ループの中に for ループが書ける。 for (i=0; i
Advertisements

和田俊和 資料保存場所 /2/26 文法と言語 ー正規表現とオートマトンー 和田俊和 資料保存場所
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
Problem J: いにしえの数式 問題作成・解説: 北村 解答作成協力: 八森.
文法と言語 ー字句解析とオートマトンlexー
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2011年10月17日
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語処理系(4) 金子敬一.
文法と言語 ー文脈自由文法とLR構文解析2ー
言語処理系(5) 金子敬一.
言語プロセッサ ー第8回目ー.
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2012年10月15日
コンパイラ 2012年10月22日
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ2015 第10回目 〜資料番号 H28NoA〜
言語プロセッサ2013 ー 第7回目 ー Tokyo University of Technology
コンパイラ 2011年10月24日
コンパイラ 第14回 上昇型構文解析(2) 38号館4階N-411 内線5459
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
言語プロセッサ 第7回目 平成27年11月16日.
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング言語論 第3回 BNF記法について(演習付き)
文法と言語 ー字句解析とオートマトンlexー
文法と言語 ー字句解析とオートマトンlexー
FlexとBison+アルファ -実習編-
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
形式言語とオートマトン Formal Languages and Automata 第4日目
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 第13回 上昇型構文解析(1) 38号館4階N-411 内線5459
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ2012 ー 第6回目 ー Tokyo University of technology
文法と言語 ー文脈自由文法とLR構文解析2ー
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ ー第9回目ー 構文解析(続き).
平成20年10月5日(月) 東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ2016 ー 第5回目(10月31日) ー Tokyo University of Technology
文法と言語 ー文脈自由文法とLR構文解析3ー
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2011年10月20日
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
文法と言語 ー文脈自由文法とLR構文解析ー
言語プロセッサ2015 ー 第5回目(11月2日) ー Tokyo University of Technology
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
文法と言語 ー字句解析とオートマトンlexー
東京工科大学 コンピュータサイエンス学部 亀田 弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2012年10月11日
言語プロセッサ ー第9回目ー 構文解析(続き).
言語プロセッサ ー第7回目ー 構文解析(続き).
東京工科大学 コンピュータサイエンス学部 亀田 弘之
東京工科大学 コンピュータサイエンス学部 亀田 弘之
形式言語とオートマトン Formal Languages and Automata 第5日目
文法と言語 ー文脈自由文法とLR構文解析2ー
:: の扱い 長谷川啓.
情報処理Ⅱ 第3回 2004年10月19日(火).
4.2 再帰下降解析 (1)再帰下降解析とは ■再帰下降解析(Recursive Descent Parsing)
Presentation transcript:

東京工科大学 コンピュータサイエンス学部 亀田弘之 言語プロセッサ2012 -No.4- 東京工科大学 コンピュータサイエンス学部 亀田弘之

これからの内容 字句解析プログラムの作成方法 構文解析 手書きの方法 Flexを利用する方法 解析手法の種類 左再帰とその除去 括りだし FirstとFollow

正規表現の練習 PCを立ち上げてください。 HTMLのソースコードから情報を抽出してみよう!

字句解析の実際 「符号なし数」の字句解析 num → digit+ ( . digit+)? (E(+|-)?digit+)? => n → d+( . d+)? (E(+|-)?d+)? => num → d+(.d+|ε)( (E((+|-)|ε)) d+|ε) |ε)

Flexのソースコード例 D [0-9] %% [\t ] { printf("Tab or Space\n"); } 参 考 D [0-9] %% [\t ] { printf("Tab or Space\n"); } {D}+(\.{D}+)?(E(\+|\-)?{D}+)? {printf("%s\n", yytext); } . { printf("NG %s\t", yytext); }

識別子のシンタックス letter → a|b|c|…|z|A|B|C|…|Z digit → 0|1|2|…|9 id → letter (letter|digit)*

Flexのコード例 LETTER [a-zA-Z] DIGIT [0-9] %% [\t ] { printf("Tab or Space\n"); } {LETTER}({LETTER}|{DIGIT})* {printf("id=%s\n", yytext); } . { printf("NG %s\t", yytext); }

符号なし数のシンタックス digit → 0|1|2|3|4|5|6|7|8|9 digits → digit digit* optional_fraction → . digits |ε optional_exponent → (E(+|-|ε)digits)|ε num → digits optional_fraction optional_exponent

トークン認識プログラム作成 (教科書を参考に作成してみよう!)

プログラムの文法(例)

stmt → if expr then stmt | if expr then stmt else stmt |ε expr → term relop term | term term → id | num

if → if then → then else → else relop → <|<=|=|<>|>|>= id → letter(letter|digit)* num → digit+(.digit+)?(E(+|-)?

delim → blank|tab|newline ws → delim+

トークン-正規表現パタン 正規表現 トークン 属性値 ws if then else id num < <= = <> > >= (なし) relop   (なし) 記号表のエントリへの   ポインタ   LT   LE   EQ   NE   GT   GE

オートマトンの作成

= > 0 6 7 other 8

図. 関係演算子の遷移図 0 1 2 = < Return(relop,LE) > 3 Return(relop,NE) other 4 Return(relop,LT) > = 5 Return(relop,EQ) = 6 7 Return(relop,GE) other 8 Return(relop,GT) 図. 関係演算子の遷移図

Return(get_token( ), install_id( )) letter letter other 9 10 11 Return(get_token( ), install_id( )) digit 図. 識別子とキーワードに対する遷移図

. digit digit - E + digit other digit E digit digit digit 図. 数の遷移図(1) 17 digit 12 digit - 13 E 19 + digit . other digit 16 18 E 14 digit 15 digit digit 図. 数の遷移図(1)

. digit digit digit digit digit digit other 図. 数の遷移図(2) 20 21 22 23 24 25 26 27 図. 数の遷移図(2)

単純な遷移図 b 1 a a 2 b

state = 0; while(TRUE) { switch(state) { case 0: c = nextChar( ); /* 先読み */ switch(c){ case ‘a’: state = 1; break; case ‘b’: state = 2; break; } case 1: c = nextChar( ); case ‘a’: state = 2; break; case ‘b’: state = 1; break; } }

state = 0; while(TRUE) { switch(state) { case 0: c = nextChar( ); /* 先読み */ switch(c){ case ‘a’: state = 1; break; case ‘b’: state = 2; break; } case 1: c = nextChar( ); case ‘a’: state = 2; break; case ‘b’: state = 1; break; } }

簡単な遷移図 b 26 a a 25 a 27 b b 28

練習問題 直前のページのオートマトンをシミュレートするプログラムを作成せよ。 符号なし数を処理する字句解析プログラムを作成せよ。 次ページに示した(C言語の)浮動小数点定数を処理する字句解析プログラムを作成せよ。

参考: (C言語の)浮動小数点定数 . Numbers Numbers f Numbers . e + l Numbers Numbers - F L

今度はflexを使ってみよう!

手順 ライブラリ(fl) Flex Lex.yy.c gcc Flex Program a.exe 文字列入力 出力

Flexプログラムの記述(1) delim [ \t\n] ws {delim}+ letter [a-zA-Z] digit [0-9] id {letter}({letter}|{digit})* number {digit}+(\.{digit}+)?(E[+\-]?{digit}+)? %%

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);}

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);} %%

Flexプログラムの記述(4) install_id( ){ static int id_ptr=0; return(id_ptr); } install_num( ){ static int num_ptr=0; return(num_ptr); }

Flexのデモ

手順 Flexのプログラムを書く。 Flexのプログラムをflexにかける。 出力ファイルlex.yy.cをgccでコンパイルする。 出力a.exeを実行する。 さまざまな文字列を入力する。

手順 ライブラリ(fl) Flex Lex.yy.c gcc Flex Program a.exe 文字列入力 出力

実際の手順 C:\> flex sample01.l C:\> gcc lex.yy.c –lfl C:\> a.exe それでは、実際にやってみよう。

字句解析から構文解析へ 以上で、字句解析は終わり。 字句解析の次の処理は、構文解析でしたね。

構文解析編

キーワード(構文解析) 上向き解析/下向き解析 (bottom up & top down) Backtracking 括りだし(factoring) 左再帰性 First集合/Follow集合  など

自然言語処理(CS学部3年後期開講科目,担当教員:亀田) いろいろな構文解析法 構文解析手法はとてもよく研究されており、様々な手法が知られている。 例えば、 Early法 Chart法 などなど (余裕のある人はいずれ                  勉強してください) プチお知らせ 自然言語処理(CS学部3年後期開講科目,担当教員:亀田)

処理対象の文法の性質を利用して、 より効率的な手法がいろいろと提案 されている。

通常のプログラミング言語は、文脈自由文法ではないが、その構成要素の多くは文脈自由文法で記述可能! Early法・Chart法 など 通常のプログラミング言語は、文脈自由文法ではないが、その構成要素の多くは文脈自由文法で記述可能! 文法の制限の仕方にもいろいろある。

LR文法とLL文法(1) LR文法に対する構文解析法(LR構文解析法) → bottom up 型 LL文法に対する構文解析法(LL構文解析法) → top down 型 (教科書76-77ページ参照)

LR文法とLL文法(2) LR文法に対する構文解析法(LR構文解析法) → bottom up 型 <= 自動生成向き(Bison) LL文法に対する構文解析法(LL構文解析法) → top down 型 <= 手作業可能 (教科書76-77ページ参照)

LL(k)文法 構文解析は、文法規則(書き換え規則)を適用しつつ進行。 適用すべき規則は、一般には複数個存在。 → backtrack発生 → 効率低下(回避すべき!) k文字先読で適用すべき規則が決定される文法がある!(LL(k)文法と呼ぶ) これは すごい! Backtrackなし!

以下、LL(1)を取り扱います

実例で考えよう! 括りだし 左再帰の回避

1.括りだし 文法 S → aBd B → b | bc 入力: abcd

a d b c

S B a d b c

S B a d b c ?

Backtrac発生! S B a d b c

S 解析成功! B a d b c

backtrack回避の方法 → 括りだし

1.括りだし 文法 S → aBd         S → aBd B → b | bc       B → b (c |ε)

左再帰の回避 A→Aβ A 無限降下だ! β A A β Fermat

左再帰の回避方法 A→Aα|β A → βA’ A’ → αA’ | ε (教科書81ページ参照)

左再帰の例 E → E + T | T T → T * F | F F → ( E ) | id

左再帰の回避 E → E + T | T T → T * F | F F → ( E ) | id E → T E’

左再帰の回避 E → E + T | T T → T * F | F F → ( E ) | id E → T E’ T → F T’ T’ → * F T’ | ε F → ( E ) | id

LL(1)文法 LL(1)文法は、1文字先読みすることで、適用すべき規則が一意に決まる、という性質を備え持っている。 つまり、「A→α|β」に対して、1文字先読みすれば、 「A→α」 と「A→β」のどちらを適用すればいいのかが決まる。 (効率のよい処理が望める)

 でも、与えられた文法がLL(1)文法であることをどうやって知ることができるのだろうか?

これは後日やりましょう。少し煩雑ですが、難しくはありません。 LL(1)文法の判定法 First Follow これは後日やりましょう。少し煩雑ですが、難しくはありません。 でも重要ですよ!