summaryrefslogtreecommitdiff
path: root/minie
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2019-02-08 21:52:01 +0100
committerAndreas Baumann <mail@andreasbaumann.cc>2019-02-08 21:52:01 +0100
commitcf4599dd0f78f984fbacbb0a57eb07eb75b80910 (patch)
tree1b3c441f1565b954d02cbc00f02142e26bd612ff /minie
parent8186616a41e730aeda49c82309aaafa0134dd03d (diff)
downloadcompilertests-cf4599dd0f78f984fbacbb0a57eb07eb75b80910.tar.gz
compilertests-cf4599dd0f78f984fbacbb0a57eb07eb75b80910.tar.bz2
some work on LHS/RHS in assignment with char arrays
Diffstat (limited to 'minie')
-rwxr-xr-xminie/build.sh6
-rw-r--r--minie/e2c.c63
-rw-r--r--minie/test9.e12
3 files changed, 65 insertions, 16 deletions
diff --git a/minie/build.sh b/minie/build.sh
index 46565ff..5129401 100755
--- a/minie/build.sh
+++ b/minie/build.sh
@@ -3,9 +3,9 @@
set -e
gcc -m32 --stack-usage -g -O0 -Wall -pedantic -std=c89 -Wno-return-type -o e2c e2c.c
-tcc -o e2c e2c.c
-pcc -Wall -O0 -g -D__float128="long double" -o e2c e2c.c
-clang -O0 -Wall -pedantic -std=c89 -Wno-return-type -o e2c e2c.c
+tcc -g -o e2c e2c.c
+pcc -g -Wall -O0 -g -D__float128="long double" -o e2c e2c.c
+clang -g -O0 -Wall -pedantic -std=c89 -Wno-return-type -o e2c e2c.c
./e2c < test1.e
set +e
./e2c < test2.e
diff --git a/minie/e2c.c b/minie/e2c.c
index ad4b03c..e2d35f2 100644
--- a/minie/e2c.c
+++ b/minie/e2c.c
@@ -81,6 +81,7 @@ char *symname[S_eof+1] = {
"end",
"import",
"procedure",
+ "return",
"var",
"if",
"do",
@@ -898,18 +899,62 @@ static void expression( void )
}
}
-static void assignment( void )
+static int selected_array;
+
+static void selector( void )
{
Type type;
+
+ selected_array = 0;
+ if( sym == S_lbracket ) {
+ Expect( S_lbracket );
+ type = get_symbol_type( varName );
+ if( type.type != TYPE_ARRAY ) {
+ Abort( "Selecting element of non-array" );
+ }
+ selected_array = 1;
+ emit( "%s[", varName );
+ expression( );
+ Expect( S_rbracket );
+ emit( "]" );
+ }
- /* precondition: ident is a variable and already parsed */
- Expect( S_assign );
- type = get_symbol_type( varName );
+ /* TODO: here we had record field selector later */
+}
+
+static void assignment( void )
+{
+ Type type;
+
+ /* left hand side */
+ /* precondition: qualident has been already parsed outside */
+ selector( );
+
+ /* x := ( a+ b )- 3; -> x = (a+b)-3;
+ * s1 := s2; -> strncpy( s2, s1, length( s2 ) );
+ * s[i] := c; -> s[i] = c;
+ * s[i] := char( 0 ); -> s[i] = '\0';
+ * s.str[index(18)+2] := 'a' + f(offset+2);
+ */
+ /* special case: array of char on both sides comes heavily in the
+ * way without an AST in-between
+ */
+
if( type.type == TYPE_ARRAY && type.details.array.type->type == TYPE_CHAR ) {
emit( "strncpy( %s, ", varName );
} else {
- emit( "%s = ", varName );
+ if( selected_array ) {
+ emit( " = ", varName );
+ } else {
+ emit( "%s = ", varName );
+ }
}
+
+ Expect( S_assign );
+
+ /* emit( " = " ); */
+
+ /* right hand side, any expression */
expression( );
if( type.type == TYPE_ARRAY && type.details.array.type->type == TYPE_CHAR ) {
emit( ", %d )", type.details.array.len );
@@ -990,13 +1035,10 @@ static void parameterList( void )
strncpy( funcName, varName, MAX_IDENT_LEN );
funcName[MAX_IDENT_LEN-1] = '\0';
- if( sym != S_lparen ) {
- Abort( "Expected symbol '%s'", symname[sym] );
- }
- sym = getSym( );
+ Expect( S_lparen );
if( sym == S_rparen ) {
if( strcmp( funcName, "system.readchar" ) == 0 ) {
- emit( "getc( )" );
+ emit( "getc( stdin )" );
sym = getSym( );
return;
}
@@ -1082,6 +1124,7 @@ static void statement( void )
return;
} else if( sym == S_ident ) {
qualident( );
+ /* procedure call with parameter */
if( sym == S_lparen ) {
parameterList( );
emitLn( ";" );
diff --git a/minie/test9.e b/minie/test9.e
index c72ff17..e7ce804 100644
--- a/minie/test9.e
+++ b/minie/test9.e
@@ -6,14 +6,20 @@ var
len : integer;
i : integer;
s : array[64] of char;
+ d : array[64] of char;
c : char;
begin
i := 0;
len := length( s );
+ c := system.readchar( );
+ (* C EOF is no char( 0 ) in e *)
while ( i < len ) and ( c <> char( 0 ) ) do
- c := system.readchar( );
s[i] := c;
- i := i + 1
- end
+ i := i + 1;
+ c := system.readchar( )
+ end;
+ (* prints garbage *)
+ system.writeline( s );
+ (* doesn't work currently: d := s *)
end