この講義では、具体的なコードを解説しながら、講義を進めていく。 コードの例として使うのがC言語風の極簡単なプログラミング言語tiny Cであ る。講義の中では、tiny Cに対して
以下に、tiny Cの言語仕様を示す。
配列と関数を使う場合には、以下のようにして使う。
main() { var i,s; s = 0; i = 0; while(i < 10){ s = s + i; i = i + 1; } println("s = %d",s); }
なお、for文については、作っていないので注意。この他にも、演算子など必要な機能に ついては各自演習で作ること。
var A[10]; main() { var i; for(i = 0; i < 10; i = i + 1) A[i] = i; println("s = %d",arraySum(A,10)); } arraySum(a,n) { var i,s; s = 0; for(i = 0; i < 10; i = i + 1) s = s + a[i]; return s; }
以下に、簡単なBNF書式での文法を示す。
tiny Cの文法 program := {external_definition}* external_definition:= function_name '(' [ parameter {',' parameter}* ] ')' compound_statement | VAR variable_name ['=' expr] ';' | VAR array_name '[' expr ']' ';' compound_statement:= '{' [local_variable_declaration] {statement}* '}' local_variable_declaration: = VAR variable_name [ {',' variable_name}* ] ';' statement := expr ';' | compound_statement | IF '(' expr ')' statement [ ELSE statement ] | RETURN [expr ] ';' | WHILE '(' expr ')' statement | FOR '(' expr ';' expr ';' expr ')' statement expr:= primary_expr | variable_name '=' expr | array_name '[' expr ']' '=' expr | expr '+' expr | expr '-' expr | expr '*' expr | expr '<' expr | expr '>' expr primary_expr:= variable_name | NUMBER | STRING | array_name '[' expr ']' | function_name '(' expr [{',' expr}*] ')' | function_name '(' ')' | '(' expr ')' | PRINTLN '(' STRING ',' expr ')'
注意:このソースコードは、完全ではない。説明のためにいろいろと簡単化し てある。「正しいプログラムは正しく」動作するが、間違ったプログラムにつ いてのチェックは完全ではない。
% cc -o tiny-c-run interp_main.o AST.o cparser.o interp.o interp_expr.o
% tiny-c-run < sample.c
% cc -o st_machine st_machine.o st_code.o
% cc -o tiny-cc-st compiler_main.o AST.o cparser.o st_compile.o \ st_compile_expr.o st_code_gen.o st_code.o
% tiny-cc-st < sample.c > output.st
% st_machine < output.st
% cc -o tiny-cc-x86 compiler_main.o AST.o cparser.o reg_compile.o \ reg_compile_expr.o x86_code_gen.o
% tiny-cc-x86 < sample.c > output.s
% cc output.s println.c
% ./a.out