diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2018-09-07 21:52:37 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2018-09-07 21:52:37 +0200 |
commit | 87da5f12b7c055471bce6eb5e9b19607f09500ec (patch) | |
tree | d8b1b1aeed14f1bcc113d96eb916a91752c48d61 /minie | |
parent | c34d5150cd44af39b12cf5af7ff627677bb82c02 (diff) | |
download | compilertests-87da5f12b7c055471bce6eb5e9b19607f09500ec.tar.gz compilertests-87da5f12b7c055471bce6eb5e9b19607f09500ec.tar.bz2 |
some dabbling with parsing ifs
Diffstat (limited to 'minie')
-rw-r--r-- | minie/README | 4 | ||||
-rw-r--r-- | minie/e2c.c | 84 | ||||
-rw-r--r-- | minie/test4.e | 12 |
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 |