summaryrefslogtreecommitdiff
path: root/minie
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2019-02-24 21:44:15 +0100
committerAndreas Baumann <mail@andreasbaumann.cc>2019-02-24 21:44:15 +0100
commita1c7f0a1d6677283dcfbd838df148d839be0f374 (patch)
treeb78721dbc523237ea51ce5e2becadbde55e09bdf /minie
parent5d931bd7c39025224eeac43724529b4938585367 (diff)
downloadcompilertests-a1c7f0a1d6677283dcfbd838df148d839be0f374.tar.gz
compilertests-a1c7f0a1d6677283dcfbd838df148d839be0f374.tar.bz2
some work on constants
Diffstat (limited to 'minie')
-rw-r--r--minie/TODOS4
-rwxr-xr-xminie/build.sh2
-rw-r--r--minie/e2c.c12
-rw-r--r--minie/ec.e52
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" );
}
diff --git a/minie/ec.e b/minie/ec.e
index 57d5a55..79c1957 100644
--- a/minie/ec.e
+++ b/minie/ec.e
@@ -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;