diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2021-10-01 21:10:36 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2021-10-01 21:10:36 +0200 |
commit | 7f32ad51b0f08446d7f66e5403d69299d0d60021 (patch) | |
tree | 647f786b8f31bdc46b296f9b4b9d40c0375b583d /miniany/cc.c | |
parent | b0c6943121f186c79d2152694d209f82904ff1e1 (diff) | |
download | compilertests-7f32ad51b0f08446d7f66e5403d69299d0d60021.tar.gz compilertests-7f32ad51b0f08446d7f66e5403d69299d0d60021.tar.bz2 |
c4: added strl* functions
cc: started peudo function parsing, currently for void main() only
some philosophical thinking and testing around forward function declarations
Diffstat (limited to 'miniany/cc.c')
-rw-r--r-- | miniany/cc.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/miniany/cc.c b/miniany/cc.c index 5cf2f9c..c630a8f 100644 --- a/miniany/cc.c +++ b/miniany/cc.c @@ -1411,11 +1411,13 @@ void parseStatementBlock( struct Compiler *compiler ) parserExpect( parser, S_RBRACE, "}" ); } -void parseFunctionDeclaraion( struct Compiler *compiler ) +void parseFunctionDeclaration( struct Compiler *compiler ) { struct Parser *parser; + struct Symbol *sym; parser = compiler->parser; + if( parser->token == S_IDENT ) { if( strcmp( parser->scanner->ident, "void" ) != 0 ) { scannerPrintErrorHeader( parser->scanner ); @@ -1424,18 +1426,35 @@ void parseFunctionDeclaraion( struct Compiler *compiler ) exit( EXIT_FAILURE ); } } - parser->token = getToken( parser->scanner ); + + parserExpect( parser, S_IDENT, "identifier" ); + sym = getSymbol( parser->global_scope, parser->scanner->ident ); + if( sym == NULL ) { + sym = createSymbol( parser->scanner->ident ); + insertSymbol( parser->global_scope, sym ); + } else { + scannerPrintErrorHeader( parser->scanner ); + putstring( "duplicate global symbol '" ); + putstring( parser->scanner->ident ); + putstring( "'" ); + putnl( ); + exit( EXIT_FAILURE ); + } if( parser->debug ) { putstring( "; function declaration '" ); putstring( parser->scanner->ident ); putstring( "'" ); putnl( ); } + putstring( parser->scanner->ident ); putchar( ':' ); putnl( ); + putstring( "push ebp" ); putnl( ); + putstring( "mov ebp, esp" ); putnl( ); parser->token = getToken( compiler->parser->scanner ); parserExpect( parser, S_LPAREN, "(" ); parserExpect( parser, S_RPAREN, ")" ); parseStatementBlock( compiler ); + putstring( "pop ebp" ); putnl( ); putstring( "ret" ); putnl( ); } @@ -1467,11 +1486,11 @@ int main( int argc, char **argv ) compiler = createCompiler( ); /* compiler->parser->scanner->debug = 1; */ - /* compiler->parser->debug = 1; */ + compiler->parser->debug = 1; /* compiler->generator->debug = 1; */ genPrologue( compiler ); compiler->parser->token = getToken( compiler->parser->scanner ); - parseFunctionDeclaraion( compiler ); + parseFunctionDeclaration( compiler ); genEpilogue( compiler ); freeCompiler( compiler ); |