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
の演習のためノートパソコンを持参