2012 年 6 月 8日
http://www.sw.it.aoyama.ac.jp/2012/Compiler/lecture8.html
© 2005-12 Martin J. Dürst 青山学院大学
flex の宿題:
コメントや実数のための正規表現バックトラックの遅さへの対策:
次のトークンしか見なくてよい文法に限定した方が望ましい
A → variable '=' A |
integerプログラム: scanner.h, scanner.c, parser.c
コンパイルと実行: gcc scanner.c parser.c &&
./a
(scanner.c 参照)
nextChar に保持
(one-character lookahead)nextChar
に読み込むinitScanner で初期化getNextToken で次々とトーケンを読むnextChar
がグローバル変数だが、グローバル変数なしの実装も可能getNextToken の実装:
(parser.c 参照)
nextToken に保持
(one-token lookahead)nextToken に読み込むinitScanner と getNextToken で準備Expression()) を呼び出すnextToken
がグローバル変数だが、グローバル変数なしの実装も可能nextToken
と比較左再帰の例:
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 の演習のためノートパソコンを持参