1.1 オートマトンと状態遷移図

4.5 構文解析の自動化
(1)YACCとは
YACC(yet another compiler compiler)
■ UNIX上の構文解析自動生成システム
■ 構文規則を入力して、構文規則に合致した記号列を解析するCプ
ログラムを生成する。
■ 手法はLALR(1)
(2)YACCの入力ファイル
入力ファイルは以下の3部分から構成される。
① トークンと演算子の宣言(優先順位は記述された順序)
② 構文規則の記述
ⅰ) 構文がプログラム中に出現したときの処理を構文要素間に
中括弧で囲んでCプログラムで記述することができる。
ⅱ) 構文要素に何らかの値を対応させることで、その規則の
構文要素の値($$, $1, $2)を記号で参照することができる
ⅲ) 構文エラーが起きたときどこまで解析をスキャンするかを
指定できる。
③ 構文規則内のCの関数を記述(yylex と yyerror は名前固定)
(3)YACC入力ファイル例
%start program
%token IDENT, LITERAL;
………
%right EQUAL;
%left OROR;
………
%%
program
:
{initCode();}
ext_def_list
{checkFunc();};
ext_def_list : ext_def_list
external_def | ;
external_def : val_decl |
function |
error SEMICOLON ;
………
Statement :
………
|
IF {clearTree();}
LPAR expression RPAR
{if1(compile(T)$4,FJUMP));}
statement {if2();}
if_tail {if3();} |
………;
if_tail : ELSE statement |
/*empty/;
………
%%
………
static int yylex(){
………
}
yyerror(s)
char *s;
{ print(“%4d: %s\n”,tokenline,s);
errcnt++;
}
………