コンパイラについてのメモ #3

文法ファイル(bisonが処理するもの、拡張子.y)は実験では指定されている。
ともかく簡単な例で確認しよう。
例示は理解の試金石なのだから。
足し算と掛け算だけを解析する文法とは
掛け算は足し算よりも優先順位が高いことに注意します。

%{
#include <stdio.h>
%}
%token Integer
%%
program:
expr                       { printf("%d\n", $1); }
;
expr:
mult_expr                  { $$ = $1; }
| mult_expr '+' expr       { $$ = $1 + $3; }
;
mult_expr:
Integer                    { $$ = $1; }
| Integer '*' mult_expr    { $$ = $1 * $3; }
;
%%
int yyerror(char *s){
fprintf(stderr, "%s\n", s);
return 0;
}
main(){
yyparse();
}

この文法ではIntegerとう存在を定義します(defineみたいに)
これは終端記号→これ以上細分化できないもので、数値です。
こんなのはtokenと書いてファイルの先頭に定義できます。
結局文法が言っていることは
 プログラム → 式
 式 → 乗算後の式
     又は 乗算後の式+式
 乗算後の式 → 数値
         又は 数値×数値
と言っています。
ようするに掛け算は足し算よりも先に計算することをいっています。
結局これをbisonに通します

bison -d calc.y

-dを使うことでcalc.tab.hというヘッダを作ってくれます。
これの中にtokenなどがどのようにdefineされるのかとかを書いてくれるらしいです。
あとはyyerrorなどもおそらく書いてくれます。これを使ってflexと連携します。
流れ

1.bison -d calc.y
->making calc.tab.c and calc.tab.h
2.flex calc.l
->making lex.yy.c using calc.tab.h

こうして一連に必要なファイルが全部できる。(らしい)

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です