diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2018-09-04 21:50:34 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2018-09-04 21:50:34 +0200 |
commit | 1edf603d623fe0bc71c520d84414e8a302c6588e (patch) | |
tree | 5d5b99af8c7f7f2bd4cd14c413563e5e0cbb4867 /minie | |
parent | 7cce459e7af6b3ee64a8f38de187e21786156aca (diff) | |
download | compilertests-1edf603d623fe0bc71c520d84414e8a302c6588e.tar.gz compilertests-1edf603d623fe0bc71c520d84414e8a302c6588e.tar.bz2 |
some work on assignment blocks and module inits
Diffstat (limited to 'minie')
-rw-r--r-- | minie/README | 1 | ||||
-rw-r--r-- | minie/e2c.c | 102 | ||||
-rw-r--r-- | minie/test3.e | 2 | ||||
-rw-r--r-- | minie/test4.e | 6 |
4 files changed, 103 insertions, 8 deletions
diff --git a/minie/README b/minie/README index eca8290..bf578c2 100644 --- a/minie/README +++ b/minie/README @@ -1,3 +1,4 @@ gcc -g -O0 -Wall -pedantic -std=c89 -o e2c e2c.c ./e2c < test1.e ./e2c < test2.e +./e2c < test3.e diff --git a/minie/e2c.c b/minie/e2c.c index aca18e3..e2874d2 100644 --- a/minie/e2c.c +++ b/minie/e2c.c @@ -1,9 +1,11 @@ #include <stdio.h> #include <string.h> #include <stdlib.h> +#include <stdarg.h> enum { MAX_IDENT_LEN = 16, + MAX_NUMBER_LEN = 9, MAX_ERRMSG_LEN = 64 }; @@ -11,24 +13,32 @@ static int look; static int row; static int col; static char ident[MAX_IDENT_LEN]; +static char moduleName[MAX_IDENT_LEN]; +static int num; typedef enum { S_char = 0, S_ident, + S_number, S_module, S_begin, S_end, S_semicolon, + S_colon, + S_assign, S_eof } Symbol; char *symname[S_eof+1] = { "char", "ident", + "nunber", "module", "begin", "end", ";", + ":", + ":=", "eof" }; @@ -56,17 +66,17 @@ static int getChar( void ) if( c == EOF ) { return c; } - row++; + col++; if( c == '\n' ) { - row = 1; - col++; + col = 1; + row++; } return c; } static int isWhite( int c ) { - if( c == ' ' || c == '\n' ) return 1; + if( c == ' ' || c == '\n' || c == '\t' ) return 1; return 0; } @@ -109,12 +119,42 @@ static void identifier( ) } } +static void number( ) +{ + int n = 0; + if( isDigit( look ) ) { + num = look - '0'; + look = getChar( ); + while( isDigit( look ) && n < MAX_NUMBER_LEN ) { + n++; + num = 10 * num + (look - '0' ); + look = getChar( ); + } + if( n == MAX_NUMBER_LEN ) { + Abort( "Number constand exceeds maximal length" ); + } + sym = S_number; + } +} + static Symbol getSym( ) { skipWhite( ); ident[0] = '\0'; switch( look ) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': case 'a': + number( ); + return S_number; case 'b': identifier( ); if( strcmp( ident, "begin" ) == 0 ) { @@ -185,6 +225,13 @@ static Symbol getSym( ) case 'Z': identifier( ); return S_ident; + case ':': + look = getChar( ); + if( look == '=' ) { + look = getChar( ); + return S_assign; + } + return S_colon; case ';': look = getChar( ); return S_semicolon; @@ -211,9 +258,13 @@ static void Expect( Symbol expect ) } } -static void emit( char *s ) +static void emit( char *s, ... ) { - puts( s ); + va_list args; + va_start( args, s ); + vprintf( s, args ); + va_end( args ); + puts( "" ); } static void prologue( void ) @@ -223,10 +274,11 @@ static void prologue( void ) static void init( void ) { - look = getChar( ); col = 1; row = 1; + look = getChar( ); ident[0] = '\0'; + num = 0; sym = getSym( ); } @@ -234,18 +286,54 @@ static void epilogue( void ) { } +static void variableName( void ) +{ + identifier( ); +} + +static void expression( void ) +{ + if( sym == S_number ) { + sym = getSym( ); + } else { + Abort( "Expected expression" ); + } +} + +static void statement( void ) +{ + if( sym == S_end ) return; + variableName( ); + sym = getSym( ); + Expect( S_assign ); + expression( ); + emit( "name = var" ); +} + static void block( void ) { Expect( S_begin ); + statement( ); + if( sym == S_end ) return; + while( sym == S_semicolon ) { + sym = getSym( ); + statement( ); + } Expect( S_end ); } static void module( void ) { Expect( S_module ); + if( sym == S_ident ) { + strncpy( moduleName, ident, MAX_IDENT_LEN ); + moduleName[MAX_IDENT_LEN-1] = '\0'; + } Expect( S_ident ); Expect( S_semicolon ); + emit( "module_%s_init( ) {", moduleName ); block( ); + emit( "}" ); } int main( void ) diff --git a/minie/test3.e b/minie/test3.e index 1b9f2b3..de8db16 100644 --- a/minie/test3.e +++ b/minie/test3.e @@ -1,4 +1,4 @@ -module test3; +module begin end diff --git a/minie/test4.e b/minie/test4.e new file mode 100644 index 0000000..7b7ea02 --- /dev/null +++ b/minie/test4.e @@ -0,0 +1,6 @@ +module test4; + +begin + x := 7; + y := 22; +end |