diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2019-02-08 21:52:01 +0100 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2019-02-08 21:52:01 +0100 |
commit | cf4599dd0f78f984fbacbb0a57eb07eb75b80910 (patch) | |
tree | 1b3c441f1565b954d02cbc00f02142e26bd612ff /minie | |
parent | 8186616a41e730aeda49c82309aaafa0134dd03d (diff) | |
download | compilertests-cf4599dd0f78f984fbacbb0a57eb07eb75b80910.tar.gz compilertests-cf4599dd0f78f984fbacbb0a57eb07eb75b80910.tar.bz2 |
some work on LHS/RHS in assignment with char arrays
Diffstat (limited to 'minie')
-rwxr-xr-x | minie/build.sh | 6 | ||||
-rw-r--r-- | minie/e2c.c | 63 | ||||
-rw-r--r-- | minie/test9.e | 12 |
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 |