summaryrefslogtreecommitdiff
path: root/minie
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2018-09-04 21:50:34 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2018-09-04 21:50:34 +0200
commit1edf603d623fe0bc71c520d84414e8a302c6588e (patch)
tree5d5b99af8c7f7f2bd4cd14c413563e5e0cbb4867 /minie
parent7cce459e7af6b3ee64a8f38de187e21786156aca (diff)
downloadcompilertests-1edf603d623fe0bc71c520d84414e8a302c6588e.tar.gz
compilertests-1edf603d623fe0bc71c520d84414e8a302c6588e.tar.bz2
some work on assignment blocks and module inits
Diffstat (limited to 'minie')
-rw-r--r--minie/README1
-rw-r--r--minie/e2c.c102
-rw-r--r--minie/test3.e2
-rw-r--r--minie/test4.e6
4 files changed, 103 insertions, 8 deletions
diff --git a/minie/README b/minie/README
index eca8290..bf578c2 100644
--- a/minie/README
+++ b/minie/README
@@ -1,3 +1,4 @@
gcc -g -O0 -Wall -pedantic -std=c89 -o e2c e2c.c
./e2c < test1.e
./e2c < test2.e
+./e2c < test3.e
diff --git a/minie/e2c.c b/minie/e2c.c
index aca18e3..e2874d2 100644
--- a/minie/e2c.c
+++ b/minie/e2c.c
@@ -1,9 +1,11 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
+#include <stdarg.h>
enum {
MAX_IDENT_LEN = 16,
+ MAX_NUMBER_LEN = 9,
MAX_ERRMSG_LEN = 64
};
@@ -11,24 +13,32 @@ static int look;
static int row;
static int col;
static char ident[MAX_IDENT_LEN];
+static char moduleName[MAX_IDENT_LEN];
+static int num;
typedef enum {
S_char = 0,
S_ident,
+ S_number,
S_module,
S_begin,
S_end,
S_semicolon,
+ S_colon,
+ S_assign,
S_eof
} Symbol;
char *symname[S_eof+1] = {
"char",
"ident",
+ "nunber",
"module",
"begin",
"end",
";",
+ ":",
+ ":=",
"eof"
};
@@ -56,17 +66,17 @@ static int getChar( void )
if( c == EOF ) {
return c;
}
- row++;
+ col++;
if( c == '\n' ) {
- row = 1;
- col++;
+ col = 1;
+ row++;
}
return c;
}
static int isWhite( int c )
{
- if( c == ' ' || c == '\n' ) return 1;
+ if( c == ' ' || c == '\n' || c == '\t' ) return 1;
return 0;
}
@@ -109,12 +119,42 @@ static void identifier( )
}
}
+static void number( )
+{
+ int n = 0;
+ if( isDigit( look ) ) {
+ num = look - '0';
+ look = getChar( );
+ while( isDigit( look ) && n < MAX_NUMBER_LEN ) {
+ n++;
+ num = 10 * num + (look - '0' );
+ look = getChar( );
+ }
+ if( n == MAX_NUMBER_LEN ) {
+ Abort( "Number constand exceeds maximal length" );
+ }
+ sym = S_number;
+ }
+}
+
static Symbol getSym( )
{
skipWhite( );
ident[0] = '\0';
switch( look ) {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
case 'a':
+ number( );
+ return S_number;
case 'b':
identifier( );
if( strcmp( ident, "begin" ) == 0 ) {
@@ -185,6 +225,13 @@ static Symbol getSym( )
case 'Z':
identifier( );
return S_ident;
+ case ':':
+ look = getChar( );
+ if( look == '=' ) {
+ look = getChar( );
+ return S_assign;
+ }
+ return S_colon;
case ';':
look = getChar( );
return S_semicolon;
@@ -211,9 +258,13 @@ static void Expect( Symbol expect )
}
}
-static void emit( char *s )
+static void emit( char *s, ... )
{
- puts( s );
+ va_list args;
+ va_start( args, s );
+ vprintf( s, args );
+ va_end( args );
+ puts( "" );
}
static void prologue( void )
@@ -223,10 +274,11 @@ static void prologue( void )
static void init( void )
{
- look = getChar( );
col = 1;
row = 1;
+ look = getChar( );
ident[0] = '\0';
+ num = 0;
sym = getSym( );
}
@@ -234,18 +286,54 @@ static void epilogue( void )
{
}
+static void variableName( void )
+{
+ identifier( );
+}
+
+static void expression( void )
+{
+ if( sym == S_number ) {
+ sym = getSym( );
+ } else {
+ Abort( "Expected expression" );
+ }
+}
+
+static void statement( void )
+{
+ if( sym == S_end ) return;
+ variableName( );
+ sym = getSym( );
+ Expect( S_assign );
+ expression( );
+ emit( "name = var" );
+}
+
static void block( void )
{
Expect( S_begin );
+ statement( );
+ if( sym == S_end ) return;
+ while( sym == S_semicolon ) {
+ sym = getSym( );
+ statement( );
+ }
Expect( S_end );
}
static void module( void )
{
Expect( S_module );
+ if( sym == S_ident ) {
+ strncpy( moduleName, ident, MAX_IDENT_LEN );
+ moduleName[MAX_IDENT_LEN-1] = '\0';
+ }
Expect( S_ident );
Expect( S_semicolon );
+ emit( "module_%s_init( ) {", moduleName );
block( );
+ emit( "}" );
}
int main( void )
diff --git a/minie/test3.e b/minie/test3.e
index 1b9f2b3..de8db16 100644
--- a/minie/test3.e
+++ b/minie/test3.e
@@ -1,4 +1,4 @@
-module test3;
+module
begin
end
diff --git a/minie/test4.e b/minie/test4.e
new file mode 100644
index 0000000..7b7ea02
--- /dev/null
+++ b/minie/test4.e
@@ -0,0 +1,6 @@
+module test4;
+
+begin
+ x := 7;
+ y := 22;
+end