第八回: yacc 系ツールの使い方
2007 年 6月 8日
http://www.sw.it.aoyama.ac.jp/2007/Compiler/lecture8.html
duerst@it.aoyama.ac.jp, O 棟 529号室
© 2005-7 Martin J. Dürst 青山学院大学
読みやすさのため、コメントを /x x/
にし、スペースを使用
第一案: /x .* x/
問題: /xx/ /xx/
をまとめて認識
第二案: /x [^x]* x/
問題: /xxx/
を認識しない
第三案: /x ([^x]|x[^/])* x/
問題: /x xx/ /x
x/
をもとめて認識
第四案: /x ([^x]|x+[^/])* x/
問題: 以前と同様
第五案: /x ([^x]|x+[^/x])* x/
問題: /x xx/
を認識しない
第六案: /x ([^x]|x+[^/x])* x+/
完成!
参考: Mastering Regular Expressions, Jeffrey E.F. Friedl, pp. 168,...
(提出不要)
次の文法の曖昧性を除去し、曖昧性のない文法を作りなさい。曖昧性がないことを複数の例で確認してください。
E → E '+' E
(Expression, 式)
E → E '*' E
E → '(' E ')'
E → integer
ヒント: 非終端記号の追加が必要
高校とかで覚えた「項」と「因子」を使う。
E → E '+' T
(Expression, 式)
T → T '*' F
(Term, 項)
F → '(' E ')'
(Factor, 因子)
F → integer
プログラム: scanner.h, scanner.c, parser.c
左再帰の例:
E → E '-' integer | integer
間違った解消 (結合規則が違う):
E → integer '-' E | integer
解消の結果:
E → integer EE
EE → '-' integer EE | ε
これに相当する EBNF:
E → integer ('-' integer)*
文法規則には色々な書き方がある:
|
で選択を表す?
の様なもの (あり/無し)
の追加 (よく [
...]
で書く)*
の様なもの (よく
{
...}
で書く)上記の拡張を含む文法規則の書き方は BNF (Backus-Naur Form), EBNF (Extended...), ABNF (Augmented...) などという
D → a E* b
⇒
D → a F b
F → F E | ε
簡単な例:
E → F '+' F
F → integer
最左導出の場合に、いつもできるだけ左の終端記号を置き換える
スタックを使って読んだトーケンや途中の非終端記号を蓄積
オートマトンを使って出来るだけ簡単な操作で次のステップを決める
(LA)LR 構文解析の二つのオペレーション
(attribute(d) grammar(s))
E1 → E2 '-' E3
E1
) = S(E2
) -
S(E3
)%token NUM PLUS ASTERISK
...#define YYSTYPE int
target: input1 input2
input3 ...
→target 作成命令