summaryrefslogtreecommitdiff
path: root/minie
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2018-09-07 21:52:37 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2018-09-07 21:52:37 +0200
commit87da5f12b7c055471bce6eb5e9b19607f09500ec (patch)
treed8b1b1aeed14f1bcc113d96eb916a91752c48d61 /minie
parentc34d5150cd44af39b12cf5af7ff627677bb82c02 (diff)
downloadcompilertests-87da5f12b7c055471bce6eb5e9b19607f09500ec.tar.gz
compilertests-87da5f12b7c055471bce6eb5e9b19607f09500ec.tar.bz2
some dabbling with parsing ifs
Diffstat (limited to 'minie')
-rw-r--r--minie/README4
-rw-r--r--minie/e2c.c84
-rw-r--r--minie/test4.e12
3 files changed, 93 insertions, 7 deletions
diff --git a/minie/README b/minie/README
index 93e3b0e..28cae32 100644
--- a/minie/README
+++ b/minie/README
@@ -3,3 +3,7 @@ gcc -g -O0 -Wall -pedantic -std=c89 -o e2c e2c.c
./e2c < test2.e
./e2c < test3.e
./e2c < test4.e
+
+./e2c < test4.e > test4.c && gcc -o test4 test4.c && ./test4
+
+
diff --git a/minie/e2c.c b/minie/e2c.c
index 338695d..fae65de 100644
--- a/minie/e2c.c
+++ b/minie/e2c.c
@@ -26,6 +26,9 @@ typedef enum {
S_begin,
S_end,
S_var,
+ S_if,
+ S_do,
+ S_else,
S_semicolon,
S_colon,
S_assign,
@@ -46,6 +49,9 @@ char *symname[S_eof+1] = {
"begin",
"end",
"var",
+ "if",
+ "do",
+ "else",
";",
":",
":=",
@@ -184,10 +190,17 @@ static Symbol getSym( )
return S_ident;
case 'c':
case 'd':
+ identifier( );
+ if( strcmp( ident, "do" ) == 0 ) {
+ return S_do;
+ }
+ return S_ident;
case 'e':
identifier( );
if( strcmp( ident, "end" ) == 0 ) {
return S_end;
+ } else if( strcmp( ident, "else" ) == 0 ) {
+ return S_else;
}
return S_ident;
case 'f':
@@ -195,6 +208,11 @@ static Symbol getSym( )
case 'h':
case 'j':
case 'i':
+ identifier( );
+ if( strcmp( ident, "if" ) == 0 ) {
+ return S_if;
+ }
+ return S_ident;
case 'k':
case 'l':
identifier( );
@@ -352,7 +370,14 @@ static void factor( void )
emit( "%d", num );
sym = getSym( );
} else if( sym == S_ident ) {
- emit( "%s", ident );
+ /* TODO: hacky */
+ if( strcmp( ident, "true" ) == 0 ) {
+ emit( "1" );
+ } else if( strcmp( ident, "false" ) == 0 ) {
+ emit( "0" );
+ } else {
+ emit( "%s", ident );
+ }
sym = getSym( );
} else if( sym == S_lparen ) {
emit( "(" );
@@ -393,11 +418,10 @@ static void expression( void )
}
}
-static void statement( void )
+static void assignment( void )
{
char v[MAX_IDENT_LEN+1];
-
- if( sym == S_end ) return;
+
variableName( );
strncpy( v, ident, MAX_IDENT_LEN );
v[MAX_IDENT_LEN-1] = '\0';
@@ -408,15 +432,53 @@ static void statement( void )
emitLn( ";" );
}
-static void statementBlock( void )
+static void condition( )
+{
+ identifier( );
+ sym = getSym( );
+}
+
+static void statementSequence( void );
+
+static void doIf( void )
+{
+ condition( );
+ Expect( S_do );
+ statementSequence( );
+ if( sym == S_else ) {
+ sym = getSym( );
+ statementSequence( );
+ }
+ Expect( S_end );
+}
+
+static void statement( void )
+{
+ if( sym == S_if ) {
+ sym = getSym( );
+ doIf( );
+ /* TODO: S_else feels wrong here, just for the end ';' in an if-block */
+ } else if( sym == S_end || sym == S_else ) {
+ return;
+ } else {
+ assignment( );
+ }
+}
+
+static void statementSequence( void )
{
- Expect( S_begin );
statement( );
if( sym == S_end ) return;
while( sym == S_semicolon ) {
sym = getSym( );
statement( );
}
+}
+
+static void statementBlock( void )
+{
+ Expect( S_begin );
+ statementSequence( );
Expect( S_end );
}
@@ -427,8 +489,16 @@ static void type( void )
/* TODO: handle build-in types in init, register them in
type table */
if( strcmp( ident, "integer" ) == 0 ) {
- strcpy( typeName, "int" );
+ strcpy( typeName, "signed int" );
+ sym = getSym( );
+ } else if( strcmp( ident, "bool" ) == 0 ) {
+ /* C89, no bool */
+ strcpy( typeName, "unsigned char" );
sym = getSym( );
+ } else if( strcmp( ident, "byte" ) == 0 ) {
+ /* C89, no bool */
+ strcpy( typeName, "unsigned char" );
+ sym = getSym( );
} else {
Abort( "Unknown type '%s'", ident );
}
diff --git a/minie/test4.e b/minie/test4.e
index 303542b..22a69d8 100644
--- a/minie/test4.e
+++ b/minie/test4.e
@@ -4,9 +4,21 @@ var
x : integer;
y : integer;
z : integer;
+ b : bool;
+ c : byte;
+ res : integer;
begin
x := 7+4*(3-1/2);
y := -22+(-x);
z := x;
+ c := 45;
+ x := c;
+ if false do
+ res := 1;
+ b := true;
+ else
+ res := 2;
+ b := false;
+ end
end