diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2018-09-30 21:28:10 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2018-09-30 21:28:10 +0200 |
commit | a68c1c8e9c4dcf834ca2e89ab4f73a3eaaeab28e (patch) | |
tree | 6d518ea0e2bafbd4723c59f4032b8d85305f2d26 /minie | |
parent | 9e5c8a8491c6bd1aff0cddb093c55a580f7fcbb1 (diff) | |
download | compilertests-a68c1c8e9c4dcf834ca2e89ab4f73a3eaaeab28e.tar.gz compilertests-a68c1c8e9c4dcf834ca2e89ab4f73a3eaaeab28e.tar.bz2 |
first working compilation with ec
Diffstat (limited to 'minie')
-rw-r--r-- | minie/README | 5 | ||||
-rw-r--r-- | minie/e2c.c | 18 |
2 files changed, 22 insertions, 1 deletions
diff --git a/minie/README b/minie/README index 384afaf..fe0ebc5 100644 --- a/minie/README +++ b/minie/README @@ -7,3 +7,8 @@ gcc -g -O0 -Wall -pedantic -std=c89 -o e2c e2c.c ./e2c < test4.e > test4.c && gcc -o test4 test4.c && ./test4 ./e2c < ec.e +./e2c < ec.e > ec.c && gcc -o ec ec.c +./ec < test1.e > test1.asm +nasm -o test1.bin -f bin test1.asm +ndisasm -b32 test1.bin +../crenshaw/emul test1.bin diff --git a/minie/e2c.c b/minie/e2c.c index d2274bf..6a78b0b 100644 --- a/minie/e2c.c +++ b/minie/e2c.c @@ -219,9 +219,11 @@ static void string( void ) static Symbol getSym( void ) { skipWhite( ); + /* num = 0; ident[0] = '\0'; str[0] = '\0'; + */ switch( look ) { case '0': case '1': @@ -404,6 +406,7 @@ static void emit( char *s, ... ) static void prologue( void ) { emitLn( "/* generated with e2c */" ); + emitLn( "#include <stdio.h>" ); } static void init( void ) @@ -423,6 +426,7 @@ static void epilogue( void ) emitLn( "}" ); } +/* TODO: don't abuse varName */ static void qualident( void ) { identifier( ); @@ -557,11 +561,11 @@ static void parameterList( void ) { Expect( S_lparen ); if( sym == S_rparen ) { + sym = getSym( ); return; } /* TODO: no VAR parameters, strictly pass-by-value */ expression( ); - sym = getSym( ); while( sym == S_comma ) { sym = getSym( ); /* TODO: no VAR parameters, strictly pass-by-value */ @@ -581,8 +585,18 @@ static void statement( void ) } else if( sym == S_ident ) { qualident( ); if( sym == S_lparen ) { + /* TODO: add internal function maps as symbols and procedures */ + if( strcmp( varName, "system.writeln" ) == 0 ) { + emit( "printf( " ); + } else { + emit( "%s( ", varName ); + } parameterList( ); /* TODO: procedure call */ + emitLn( ");" ); + if( strcmp( varName, "system.writeln" ) == 0 ) { + emitLn( "puts( \"\" );" ); + } } else { assignment( ); } @@ -671,7 +685,9 @@ static void procedureDeclaration( void ) sym = getSym( ); /* TODO: procedure parameters */ Expect( S_semicolon ); + emitLn( "void %s( void ) {", procName ); statementBlock( ); + emitLn( "}" ); } static void procedureBlock( void ) |