2014 年 5 月 30日
http://www.sw.it.aoyama.ac.jp/201/Compiler/lecture8.html
© 2005-14 Martin J. Dürst 青山学院大学
flex
の宿題: 日付のための正規表現バックトラックの遅さへの対策:
次のトークンしか見なくてよい文法に限定した方が望ましい
(recursive decent parsing)
|
) がある場合、枝分かれ
(if
など) で対応while
など) で対応A → variable '=' A | integer
(代入式/assignment
expression)プログラム: scanner.h, scanner.c, parser1.c
コンパイルと実行: gcc scanner.c parser.c &&
./a
(scanner.c 参照)
nextChar
に保持
(one-character lookahead)nextChar
に読み込むnextChar
がグローバル変数だが、グローバル変数なしの実装も可能initScanner
で初期化getNextToken
で次々とトーケンを読むgetNextToken
の実装:
(parser1.c 参照)
nextToken
に保持
(one-token lookahead)nextToken
に読み込むnextToken
がグローバル変数だが、グローバル変数なしの実装も可能initScanner
と getNextToken
で準備Expression()
) を呼び出すnextToken
と比較(left recursion)
左再帰の例:
E → E '-' integer | integer
間違った解消 (結合規則が違う):
E → integer '-' E | integer
解消の結果:
E → integer EE
EE → '-' integer EE | ε
これに相当する EBNF:
E → integer {'-' integer}
文法:
正規表現:
正規表現の (簡単な) 規則は文法の (複雑な) 規則一つに相当する
Factor → FunctionCall | Variable | ArrayElement(
FunctionCall → Identifier '(' Parameters ')'
Variable → Identifier
ArrayElement → Identifier '[' Expression ']'
Factor
でどこの規則を選べば良いのか不明) 解析方法によって、文法への条件が増える:
⇒ 文法は言語を定義するだけでは不十分
→上向き構文解析 (bottom-up parsing)
bison
の演習のためノートパソコンを持参