Przykład kompilatora Następujący program implementuje bardzo prosty jednoprzebiegowy kompilator napisany w języku C. Ten kompilator kompiluje wyrażenia zdefiniowane w notacji infiksowej do ONP, a także do asemblera. Kompilator realizuje strategię rekurencyjnego zagłębiania się w wyrażenie. Każde wywołanie funkcji odpowiada napotkaniu symbolu nieterminalnego należącego do gramatyki języka.
#include <stdlib.h> #include <stdio.h> #include <string.h>
#define MODE_POSTFIX 0 #define MODE_ASSEMBLY 1
char lookahead; int pos; int compile_mode; char expression[20+1];
void error() { printf("Syntax error!\n"); }
void match( char t ) { if( lookahead == t )
pos++; lookahead = expression[pos];
else error(); }
void digit() { switch( lookahead )
case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if( compile_mode == MODE_POSTFIX ) printf("%c", lookahead); else printf("\tPUSH %c\n", lookahead);
match( lookahead ); break; default: error(); break;
void term() { digit(); while(1)
switch( lookahead )
case '*': match('*'); digit();
printf( "%s", compile_mode == MODE_POSTFIX ? "*" : "\tPOP B\n\tPOP A\n\tMUL A, B\n\tPUSH A\n");
break; case '/': match('/'); digit();