summaryrefslogtreecommitdiff
path: root/minie
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2018-09-05 14:20:02 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2018-09-05 14:20:02 +0200
commit74a7a96124548a28d06116fcc96e9542041ea5ae (patch)
treec869e58e1c70905bb717e4233c74afa7e00129aa /minie
parent1edf603d623fe0bc71c520d84414e8a302c6588e (diff)
downloadcompilertests-74a7a96124548a28d06116fcc96e9542041ea5ae.tar.gz
compilertests-74a7a96124548a28d06116fcc96e9542041ea5ae.tar.bz2
variable declarations
Diffstat (limited to 'minie')
-rw-r--r--minie/README1
-rw-r--r--minie/e2c.c91
-rw-r--r--minie/test4.e4
3 files changed, 84 insertions, 12 deletions
diff --git a/minie/README b/minie/README
index bf578c2..93e3b0e 100644
--- a/minie/README
+++ b/minie/README
@@ -2,3 +2,4 @@ gcc -g -O0 -Wall -pedantic -std=c89 -o e2c e2c.c
./e2c < test1.e
./e2c < test2.e
./e2c < test3.e
+./e2c < test4.e
diff --git a/minie/e2c.c b/minie/e2c.c
index e2874d2..88f9eb7 100644
--- a/minie/e2c.c
+++ b/minie/e2c.c
@@ -12,8 +12,10 @@ enum {
static int look;
static int row;
static int col;
-static char ident[MAX_IDENT_LEN];
-static char moduleName[MAX_IDENT_LEN];
+static char ident[MAX_IDENT_LEN+1];
+static char moduleName[MAX_IDENT_LEN+1];
+static char varName[MAX_IDENT_LEN+1];
+static char typeName[MAX_IDENT_LEN+1];
static int num;
typedef enum {
@@ -23,6 +25,7 @@ typedef enum {
S_module,
S_begin,
S_end,
+ S_var,
S_semicolon,
S_colon,
S_assign,
@@ -36,6 +39,7 @@ char *symname[S_eof+1] = {
"module",
"begin",
"end",
+ "var",
";",
":",
":=",
@@ -44,9 +48,11 @@ char *symname[S_eof+1] = {
static Symbol sym;
-static void Err( char *s )
+static void Err( char *s, va_list args )
{
- fprintf( stderr, "Error line %d, pos %d: %s\n", row, col, s );
+ fprintf( stderr, "Error line %d, pos %d: ", row, col );
+ vfprintf( stderr, s, args );
+ fputs( "\n", stderr );
}
static void Halt( )
@@ -54,9 +60,12 @@ static void Halt( )
exit( EXIT_FAILURE );
}
-static void Abort( char *s )
+static void Abort( char *s, ... )
{
- Err( s );
+ va_list args;
+ va_start( args, s );
+ Err( s, args );
+ va_end( args );
Halt( );
}
@@ -193,6 +202,11 @@ static Symbol getSym( )
case 't':
case 'u':
case 'v':
+ identifier( );
+ if( strcmp( ident, "var" ) == 0 ) {
+ return S_var;
+ }
+ return S_ident;
case 'w':
case 'x':
case 'y':
@@ -248,7 +262,7 @@ static void Expect( Symbol expect )
if( sym == expect ) {
sym = getSym( );
} else {
- char s[MAX_ERRMSG_LEN];
+ char s[MAX_ERRMSG_LEN+1];
s[0] = '\0';
strncat( s, "Expected symbol '", MAX_ERRMSG_LEN );
strncat( s, symname[expect], MAX_ERRMSG_LEN );
@@ -284,11 +298,18 @@ static void init( void )
static void epilogue( void )
{
+ emit( "int main( void ) {" );
+ emit( "module_%s_init( );", moduleName );
+ emit( "}" );
}
static void variableName( void )
{
identifier( );
+ if( sym == S_ident ) {
+ strncpy( varName, ident, MAX_IDENT_LEN );
+ varName[MAX_IDENT_LEN-1] = '\0';
+ }
}
static void expression( void )
@@ -302,26 +323,69 @@ static void expression( void )
static void statement( void )
{
+ char v[MAX_IDENT_LEN+1];
+
if( sym == S_end ) return;
variableName( );
+ strncpy( v, ident, MAX_IDENT_LEN );
+ v[MAX_IDENT_LEN-1] = '\0';
sym = getSym( );
Expect( S_assign );
expression( );
- emit( "name = var" );
+ emit( "%s = %d;", v, num );
}
-static void block( void )
+static void statementBlock( void )
{
Expect( S_begin );
statement( );
if( sym == S_end ) return;
while( sym == S_semicolon ) {
- sym = getSym( );
+ sym = getSym( );
statement( );
}
Expect( S_end );
}
+static void type( void )
+{
+ identifier( );
+ if( sym == S_ident ) {
+ /* TODO: handle build-in types in init, register them in
+ type table */
+ if( strcmp( ident, "INTEGER" ) == 0 ) {
+ strcpy( typeName, "int" );
+ sym = getSym( );
+ } else {
+ Abort( "Unknown type '%s'", ident );
+ }
+ }
+}
+
+static void variableDeclaration( void )
+{
+ variableName( );
+ sym = getSym( );
+ Expect( S_colon );
+ type( );
+ emit( "static %s %s;", typeName, varName );
+}
+
+static void declarationBlock( void )
+{
+ Expect( S_var );
+ variableDeclaration( );
+ if( sym == S_begin ) return;
+ while( sym == S_semicolon ) {
+ sym = getSym( );
+ if( sym == S_ident ) {
+ variableDeclaration( );
+ } else if( sym == S_begin ) {
+ return;
+ }
+ }
+}
+
static void module( void )
{
Expect( S_module );
@@ -331,8 +395,11 @@ static void module( void )
}
Expect( S_ident );
Expect( S_semicolon );
- emit( "module_%s_init( ) {", moduleName );
- block( );
+ if( sym == S_var ) {
+ declarationBlock( );
+ }
+ emit( "void module_%s_init( ) {", moduleName );
+ statementBlock( );
emit( "}" );
}
diff --git a/minie/test4.e b/minie/test4.e
index 7b7ea02..95eb1cb 100644
--- a/minie/test4.e
+++ b/minie/test4.e
@@ -1,5 +1,9 @@
module test4;
+var
+ x : INTEGER;
+ y : INTEGER;
+
begin
x := 7;
y := 22;