第八回: yacc 系ツールの使い方
2009 年 6 月 5 日
http://www.sw.it.aoyama.ac.jp/2009/Compiler/lecture8.html
duerst@it.aoyama.ac.jp, O 棟 529 号室
© 2005-9 Martin J. Dürst 青山学院大学
(提出不要)
次の文法の曖昧性を除去し、曖昧性のない文法を作りなさい。曖昧性がないことを複数の例で確認してください。
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...) などという
M → a N* b
⇒
M → a b | a L b
L → L N
簡単な例:
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 作成命令
flex の演習の正解例
読みやすさのため、コメントを
/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,...