summaryrefslogtreecommitdiff
path: root/minie
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2018-09-30 21:28:10 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2018-09-30 21:28:10 +0200
commita68c1c8e9c4dcf834ca2e89ab4f73a3eaaeab28e (patch)
tree6d518ea0e2bafbd4723c59f4032b8d85305f2d26 /minie
parent9e5c8a8491c6bd1aff0cddb093c55a580f7fcbb1 (diff)
downloadcompilertests-a68c1c8e9c4dcf834ca2e89ab4f73a3eaaeab28e.tar.gz
compilertests-a68c1c8e9c4dcf834ca2e89ab4f73a3eaaeab28e.tar.bz2
first working compilation with ec
Diffstat (limited to 'minie')
-rw-r--r--minie/README5
-rw-r--r--minie/e2c.c18
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 )