第九回: yacc 系ツールの使い方
2010 年 6 月 4 日
http://www.sw.it.aoyama.ac.jp/2010/Compiler/lecture9.html
duerst@it.aoyama.ac.jp, O 棟 529 号室
© 2005-10 Martin J. Dürst 青山学院大学
(提出不要)
次の文法の曖昧性を除去し、曖昧性のない文法を作りなさい。曖昧性がないことを複数の例で確認してください。
E → E '+' E
(Expression, 式)
E → E '*' E
E → '(' E ')'
E → integer
ヒント: 非終端記号の追加が必要
高校とかで覚えた「項」と「因子」を使う。
左再帰の例:
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
スタートのためのファイル: makefile, calc.y, calc.lex
%token NUM PLUS ASTERISK
...#define YYSTYPE int
flex
, bison
, gcc
などを忘れず使うのが難しいmake
コマンドは makefile
の指定に従い、必要最小限の処理を実行target: input1 input2
input3 ...
→target 作成命令
bison -v
で作った機械の明細のファイルを作成
(例: calc.output)#define YYDEBUG 1
でデバッグを ON
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,...