第六回: 字句解析と構文解析
2008 年 5月16日
http://www.sw.it.aoyama.ac.jp/2008/Compiler/lecture6.html
duerst@it.aoyama.ac.jp, O 棟 529号室
© 2005-8 Martin J. Dürst 青山学院大学
flex
の宿題についてflex
でよく出る問題gcc
の後でしか現れないことが多いflex
の指示ではなくC
の部分は少なくともスペース一つ字下げが必要%%
後は不必要)int yywrap () { return 1; }
を忘れずyytext
で使えるprintf("int(%s), ", yytext);
\
でエスケープするか、""
で囲む必要がある*
だけがでる場合、文字列中に \"
がでる場合への対応0777
は八進数 (十進数では 511);
0xABC
は十六進数 (2748)u
/U
(符号無し) と
l
/L
(long
)
が着くことがある.01
, 20.
,
13e-25
, 7E13
などf
/F
(float
) と l
/L
(long
double
) が着くことがある字句解析 (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 | 正規言語 | 有限オートマトン |
次のような言語が正規表現などで表せるのか:
a
, b
, c
からなる左右対象の語の言語(
と )
からなる、式等のように入れ子になっている語の言語0
と 1
からなる、n
個の 0
の後 n 個の 1
の語の言語これらは全て有限オートマトンの有限のメモリの制約によって受理不可能である。
字句解析 | 構文解析 | |
解析対象 | 定数、識別子、予約語、演算子など | 式、文、関数など |
要点 | 速さ | 能力 |
記述方法 | 正規表現 | 文脈自由文法 |
(自動) 解析手段 | 有限オートマトン | プッシュダウンオートマトン |
正規文法 (regular grammar):
文脈自由文法 (context free grammar):
S → aSa | bSb | c
生成する言語: 真ん中に c が一個、周りに a と b が 0 以上対照的に自由な順番で並ぶ
生成する語の例: c, aca, bcb, abaabcbaaba 等
こういう風な言語を受理するのはメモリがないため有限オートマトンでは不可能
オートマトンの機能拡張が必要
オートマトンにプッシュダウンスタックをつけよう
=
とか ::=
[]
で囲む (応用正規表現の
?
に相当){}
で囲む
(正規表現の *
に相当)|
で区切るこういう風な記述は EBNF (Extended Backus Naur Form) という
様々な種類 (方言) が存在
文法:
正規表現:
正規表現の (簡単な) 規則は文法の (複雑な) 規則一つに相当する
(pushdown stack)
効率よく構文解析できるには可能な限り決定性のある文法が必要