2014 年 5 月 16 日
http://www.sw.it.aoyama.ac.jp/2014/Compiler/lecture6.html
© 2005-14 Martin J. Dürst 青山学院大学
(資料は前回のもの)
flex
の宿題についてflex
の宿題: 日付の字句解析m4
を cygwin の setup.exe
で追加インストールm4 --version
で確認)%%
の前)
によく使う「部品」を定義YEAR [0-9][0-9][0-9][0-9]
(YEAR
は左揃え){YEAR}-{MONTH}-{DAY} /* 処理 */
yytext
を活用:printf("Month: %c%c", yytext[5], yytext[6]);
flex dates.l && gcc lex.yy.c && ./a
<dates_input.txt | diff - dates_check.txt
字句解析 (lexical analysis)
構文解析 (parsing; syntax analysis)
意味解析 (semantic analysis)
最適化 (optimization)
コード生成 (code generation)
文法 | grammar | Type | 言語 | オートマトン |
句構造文法 | phrase structure grammar (psg) | 0 | 句構造言語 | チューリング機械 |
文脈依存文法 | context-sensitive grammar (csg) | 1 | 文脈依存言語 | 線形拘束オートマトン |
文脈自由文法 | context-free grammar (cfg) | 2 | 文脈自由言語 | プッシュダウンオートマトン |
正規文法 | regular grammar (rg) | 3 | 正規言語 | 有限オートマトン |
次のような言語が正規表現などで表せるのか:
(
と )
からなる、式のように入れ子になっている語の言語0
と 1
からなる、n
個の 0
の後 n 個の 1
の語の言語a
, b
, c
からなる左右対象の語の言語これらは全て有限オートマトンの有限のメモリの制約によって受理不可能
字句解析 | 構文解析 | |
解析対象 | 定数、識別子、予約語、演算子など | 式、文、関数など |
要点 | 速さ | 能力 |
記述方法 | 正規表現 | 文脈自由文法 |
(自動) 解析手段 | 有限オートマトン | プッシュダウンオートマトン |
正規文法 (regular grammar):
文脈自由文法 (context free grammar):
S → aSa | bSb | c
生成する語の例: c, aca, bcb, abaabcbaaba 等
生成する言語: 真ん中に c が一個、周りに a と b が 0 以上対照的に自由な順番で並ぶ
上記の言語を受理するのは、メモリがないため有限オートマトンでは不可能
オートマトンの機能拡張が必要
オートマトンにプッシュダウンスタックをつけよう
(pushdown stack)
効率よく構文解析できるには可能な限り決定性のある文法が必要
他にも解析の効率に影響を与える文脈自由言語・文脈自由文法の種類が存在
C プログラム言語、Java、Ruby、XML
など知っている言語やデータ形式の文法を調べなさい。