diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2019-02-24 21:44:15 +0100 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2019-02-24 21:44:15 +0100 |
commit | a1c7f0a1d6677283dcfbd838df148d839be0f374 (patch) | |
tree | b78721dbc523237ea51ce5e2becadbde55e09bdf /minie | |
parent | 5d931bd7c39025224eeac43724529b4938585367 (diff) | |
download | compilertests-a1c7f0a1d6677283dcfbd838df148d839be0f374.tar.gz compilertests-a1c7f0a1d6677283dcfbd838df148d839be0f374.tar.bz2 |
some work on constants
Diffstat (limited to 'minie')
-rw-r--r-- | minie/TODOS | 4 | ||||
-rwxr-xr-x | minie/build.sh | 2 | ||||
-rw-r--r-- | minie/e2c.c | 12 | ||||
-rw-r--r-- | minie/ec.e | 52 |
4 files changed, 64 insertions, 6 deletions
diff --git a/minie/TODOS b/minie/TODOS index d925789..b1b6011 100644 --- a/minie/TODOS +++ b/minie/TODOS @@ -229,6 +229,10 @@ in the Oberon compiler act as singletons. nested procedures +intermediate formats can be in memory or on external media. The later is +the older design when memory was scarse. It also avoids using complicated +data structures in memory. + links ----- diff --git a/minie/build.sh b/minie/build.sh index af3b490..3975514 100755 --- a/minie/build.sh +++ b/minie/build.sh @@ -26,7 +26,7 @@ set -e ./e2c < test9.e > test9.c && gcc -g -o test9 test9.c && ./test9 < test9.e ./e2c < ec.e -./e2c < ec.e > ec.c && gcc -o ec ec.c +./e2c < ec.e > ec.c && gcc -g -O0 -o ec ec.c ./ec < test1.e > test1.asm nasm -o test1.bin -f bin test1.asm ndisasm -b32 test1.bin diff --git a/minie/e2c.c b/minie/e2c.c index 8108502..d20098b 100644 --- a/minie/e2c.c +++ b/minie/e2c.c @@ -870,7 +870,7 @@ static void factor( void ) if( type.type == TYPE_FUNCTION ) { parameterList( ); } else if( type.type == TYPE_CONSTANT ) { - if( type.details.constant.type == TYPE_BOOLEAN ) { + if( type.details.constant.type == TYPE_BOOLEAN || type.details.constant.type == TYPE_INTEGER ) { emit( "%d", type.details.constant.value ); } else { Abort( "Unknown constant '%s'", varName ); @@ -1168,6 +1168,8 @@ static void parameterList( void ) } else { emit( ")" ); } + } else { + emit( ")" ); } Expect( S_rparen ); } @@ -1294,11 +1296,15 @@ static void constDeclaration( void ) variableName( ); sym = getSym( ); Expect( S_equals ); - /* TODO: ConstEpression requires an interpreter */ + /* TODO: ConstExpression requires an interpreter */ if( sym == S_number ) { + Type type; number( ); sym = getSym( ); - emitLn( "const int %s = %d;", varName, num ); + type.type = TYPE_CONSTANT; + type.details.constant.type = TYPE_INTEGER; + type.details.constant.value.integer = num; + insert_symbol( current_scope, type, varName ); } else { Abort( "Supporting numeric constants only" ); } @@ -3,6 +3,7 @@ module ec; import system; const + S_char = 0; S_module = 1; var @@ -11,11 +12,46 @@ var look : char; sym : integer; +procedure Err0( s : array of char ); +begin + system.writestring( "Error line " ); + system.writeinteger( row ); + system.writestring( ", pos " ); + system.writeinteger( col ); + system.writestring( ": " ); + system.writeline( s ); +end + +(* TODO: segfault when defining parameter *) +procedure Err1N( s : array of char, n : integer ); +begin + system.writestring( "Error line " ); + system.writeinteger( row ); + system.writestring( ", pos " ); + system.writeinteger( col ); + system.writestring( ": " ); + system.writestring( s ); + system.writestring( " " ); + system.writeinteger( n ); +end + procedure Halt; begin system.halt( 1 ) end +procedure Abort0( s : array of char ); +begin + Err0( s ); + Halt; +end + +procedure Abort1N( s : array of char, n : integer ); +begin + Err1N( s, n ); + Halt; +end + (* scanner *) procedure getChar : char; @@ -44,8 +80,17 @@ begin end end +procedure skipWhite; +begin + while ( isWhite( look ) ) do + look := getChar( ); + end +end + procedure getSym : integer; begin + skipWhite; + return S_char; end (* parser *) @@ -58,6 +103,7 @@ begin (* TODO: symtable names Abort( "Expected symbol", symname[expect] ); *) + Abort0( "Expected symbol" ); end end @@ -65,6 +111,8 @@ procedure init; begin col := 1; row := 1; + look := getChar( ); + sym := getSym( ); end procedure prologue; @@ -76,9 +124,8 @@ end procedure doModule; begin - (* TODO: unkown symbol of state CONST Expect( S_module ); - *) +(* look := getChar( ); while ( look <> char( 0 ) ) do if not isWhite( look ) do @@ -86,6 +133,7 @@ begin end; look := getChar( ); end; +*) end procedure epilogue; |