|
As Roberto Waltman rightly said: "Wonderful! What the world needs is one more language that allows you to write: "IF IF THEN THEN ELSE IF ELSE THEN IF ELSE IF END THEN BEGIN ELSE IF;" or something like that..." He's right, of course, so I hereby present a compiler for the BETTIE language. BETTIE is an acronym for BEGIN, ELSE, THEN, er, THEN, right, IF, END. The compiler is written in C. Translation to BETTIE is left as an exercise. After the compiler source listing, you'll find a 'Hello, world' program written in BETTIE. |
/* BETTIE Compiler
The BETTIE (Begin/Else/Then/er, Then/If/End) language
has five keywords: BEGIN, ELSE, THEN, IF, and END.
I'll let you figure out the semantics for yourself.
Richard Heathfield, 1 July 2008
*/
#include <stdio.h>
#include <string.h>
#define LW 16
int t(unsigned long int n)
{
static unsigned long l = 0;
char x[] = "Oh? Oh! Oh okay.";
l==0 || putchar(' ');
putchar(x[(n & 0xFF000000) >> 24]);
putchar(x[(n & 0xFF0000) >> 16]);
putchar(x[(n & 0xFF00) >> 8]);
putchar(x[n & 0xFF]);
++l==LW && putchar('\n');
l%=LW;
return 1;
}
int main(void)
{
char i[256] = {0};
int ms = 0;
while(1 == scanf("%255s", i))
{
if(strcmp(i, "ELSE") == 0)
{
ms = !ms;
}
else
{
if(strcmp(i, "BEGIN") == 0)
{
(ms && t(0xB0C0F) && t(0xB0C06)) ||
(t(0xB0C06) && t(0xB0C02));
}
else if(strcmp(i, "END") == 0)
{
(ms && t(0xB0C06) && t(0xB0C0F)) ||
(t(0xB0C02) && t(0xB0C06));
}
else if(strcmp(i, "THEN") == 0)
{
(ms && t(0xB0C0F) && t(0xB0C02)) ||
(t(0xB0C02) && t(0xB0C0F));
}
else if(strcmp(i, "IF") == 0)
{
(ms && t(0xB0C0F) && t(0xB0C0F)) ||
(t(0xB0C06) && t(0xB0C06));
}
else
{
fprintf(stderr, "Syntax error: %s\n", i);
}
}
}
putchar('\n');
return 0;
}
ELSE THEN IF IF IF IF IF IF IF IF IF ELSE BEGIN THEN ELSE IF
IF IF IF IF IF IF IF THEN ELSE IF END THEN ELSE END THEN IF IF
IF IF IF IF IF ELSE BEGIN THEN ELSE IF IF IF IF THEN ELSE IF
END THEN ELSE IF END IF IF IF IF IF IF IF END END IF IF IF END
THEN THEN THEN IF IF IF IF IF IF IF IF ELSE BEGIN THEN ELSE IF
IF IF IF THEN ELSE IF END THEN ELSE END THEN THEN THEN IF IF
IF IF IF IF IF IF IF IF ELSE BEGIN THEN ELSE IF IF IF IF IF IF
IF IF IF THEN ELSE IF END THEN IF IF IF ELSE END ELSE THEN THEN
THEN THEN ELSE END IF IF IF END ELSE IF IF IF IF IF IF ELSE END
ELSE IF IF IF IF IF IF IF IF ELSE END THEN THEN IF END