第六回: 字句解析と構文解析
2009 年 5 月 14 日
http://www.sw.it.aoyama.ac.jp/2010/Compiler/lecture6.html
© 2005-10 Martin J. Dürst 青山学院大学
flex
の宿題についてflex
でよく出る問題flex
時にエラーは出にくい。 gcc
の後でしかエラー表示されない場合が多いflex
の指示ではなく C
の部分は少なくともスペース一つ字下げが必要%%
後は不必要)int yywrap () { return 1; }
を忘れず%%
の前)
で正規表現の「部品」を定義できるDAYS30 0[1-9]|[12][0-9]|30
{DAYS30}
yytext
で使えるputchar(yytext[0]);
\
でエスケープするか、""
で囲む必要がある字句解析 (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)
効率よく構文解析できるには可能な限り決定性のある文法が必要