diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2018-09-05 14:20:02 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2018-09-05 14:20:02 +0200 |
commit | 74a7a96124548a28d06116fcc96e9542041ea5ae (patch) | |
tree | c869e58e1c70905bb717e4233c74afa7e00129aa /minie | |
parent | 1edf603d623fe0bc71c520d84414e8a302c6588e (diff) | |
download | compilertests-74a7a96124548a28d06116fcc96e9542041ea5ae.tar.gz compilertests-74a7a96124548a28d06116fcc96e9542041ea5ae.tar.bz2 |
variable declarations
Diffstat (limited to 'minie')
-rw-r--r-- | minie/README | 1 | ||||
-rw-r--r-- | minie/e2c.c | 91 | ||||
-rw-r--r-- | minie/test4.e | 4 |
3 files changed, 84 insertions, 12 deletions
diff --git a/minie/README b/minie/README index bf578c2..93e3b0e 100644 --- a/minie/README +++ b/minie/README @@ -2,3 +2,4 @@ gcc -g -O0 -Wall -pedantic -std=c89 -o e2c e2c.c ./e2c < test1.e ./e2c < test2.e ./e2c < test3.e +./e2c < test4.e diff --git a/minie/e2c.c b/minie/e2c.c index e2874d2..88f9eb7 100644 --- a/minie/e2c.c +++ b/minie/e2c.c @@ -12,8 +12,10 @@ enum { static int look; static int row; static int col; -static char ident[MAX_IDENT_LEN]; -static char moduleName[MAX_IDENT_LEN]; +static char ident[MAX_IDENT_LEN+1]; +static char moduleName[MAX_IDENT_LEN+1]; +static char varName[MAX_IDENT_LEN+1]; +static char typeName[MAX_IDENT_LEN+1]; static int num; typedef enum { @@ -23,6 +25,7 @@ typedef enum { S_module, S_begin, S_end, + S_var, S_semicolon, S_colon, S_assign, @@ -36,6 +39,7 @@ char *symname[S_eof+1] = { "module", "begin", "end", + "var", ";", ":", ":=", @@ -44,9 +48,11 @@ char *symname[S_eof+1] = { static Symbol sym; -static void Err( char *s ) +static void Err( char *s, va_list args ) { - fprintf( stderr, "Error line %d, pos %d: %s\n", row, col, s ); + fprintf( stderr, "Error line %d, pos %d: ", row, col ); + vfprintf( stderr, s, args ); + fputs( "\n", stderr ); } static void Halt( ) @@ -54,9 +60,12 @@ static void Halt( ) exit( EXIT_FAILURE ); } -static void Abort( char *s ) +static void Abort( char *s, ... ) { - Err( s ); + va_list args; + va_start( args, s ); + Err( s, args ); + va_end( args ); Halt( ); } @@ -193,6 +202,11 @@ static Symbol getSym( ) case 't': case 'u': case 'v': + identifier( ); + if( strcmp( ident, "var" ) == 0 ) { + return S_var; + } + return S_ident; case 'w': case 'x': case 'y': @@ -248,7 +262,7 @@ static void Expect( Symbol expect ) if( sym == expect ) { sym = getSym( ); } else { - char s[MAX_ERRMSG_LEN]; + char s[MAX_ERRMSG_LEN+1]; s[0] = '\0'; strncat( s, "Expected symbol '", MAX_ERRMSG_LEN ); strncat( s, symname[expect], MAX_ERRMSG_LEN ); @@ -284,11 +298,18 @@ static void init( void ) static void epilogue( void ) { + emit( "int main( void ) {" ); + emit( "module_%s_init( );", moduleName ); + emit( "}" ); } static void variableName( void ) { identifier( ); + if( sym == S_ident ) { + strncpy( varName, ident, MAX_IDENT_LEN ); + varName[MAX_IDENT_LEN-1] = '\0'; + } } static void expression( void ) @@ -302,26 +323,69 @@ static void expression( void ) static void statement( 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'; sym = getSym( ); Expect( S_assign ); expression( ); - emit( "name = var" ); + emit( "%s = %d;", v, num ); } -static void block( void ) +static void statementBlock( void ) { Expect( S_begin ); statement( ); if( sym == S_end ) return; while( sym == S_semicolon ) { - sym = getSym( ); + sym = getSym( ); statement( ); } Expect( S_end ); } +static void type( void ) +{ + identifier( ); + if( sym == S_ident ) { + /* TODO: handle build-in types in init, register them in + type table */ + if( strcmp( ident, "INTEGER" ) == 0 ) { + strcpy( typeName, "int" ); + sym = getSym( ); + } else { + Abort( "Unknown type '%s'", ident ); + } + } +} + +static void variableDeclaration( void ) +{ + variableName( ); + sym = getSym( ); + Expect( S_colon ); + type( ); + emit( "static %s %s;", typeName, varName ); +} + +static void declarationBlock( void ) +{ + Expect( S_var ); + variableDeclaration( ); + if( sym == S_begin ) return; + while( sym == S_semicolon ) { + sym = getSym( ); + if( sym == S_ident ) { + variableDeclaration( ); + } else if( sym == S_begin ) { + return; + } + } +} + static void module( void ) { Expect( S_module ); @@ -331,8 +395,11 @@ static void module( void ) } Expect( S_ident ); Expect( S_semicolon ); - emit( "module_%s_init( ) {", moduleName ); - block( ); + if( sym == S_var ) { + declarationBlock( ); + } + emit( "void module_%s_init( ) {", moduleName ); + statementBlock( ); emit( "}" ); } diff --git a/minie/test4.e b/minie/test4.e index 7b7ea02..95eb1cb 100644 --- a/minie/test4.e +++ b/minie/test4.e @@ -1,5 +1,9 @@ module test4; +var + x : INTEGER; + y : INTEGER; + begin x := 7; y := 22; |