From ac6f5f34ea65c29d2064cb1f9d0a6be823ab36db Mon Sep 17 00:00:00 2001 From: hatsusato Date: Sun, 11 Sep 2016 15:57:28 +0900 Subject: [PATCH 1/3] Add translation-unit action --- src/parser.y | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/parser.y b/src/parser.y index a655abc5..ec734e42 100644 --- a/src/parser.y +++ b/src/parser.y @@ -259,12 +259,18 @@ jump-statement ; translation-unit.opt -: %empty -| translation-unit +: %empty { + $$ = NULL; +} +| translation-unit { + $$ = $[translation-unit]; +} ; translation-unit -: external-declaration translation-unit.opt +: external-declaration translation-unit.opt { + $$ = cons($[external-declaration], $[translation-unit.opt]); +} ; external-declaration From 569ed48a8a9b6bebd99f6188e566327561367f27 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Sun, 11 Sep 2016 16:03:14 +0900 Subject: [PATCH 2/3] Add external-declaration action --- src/ast.h | 4 +++- src/parser.y | 15 ++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/ast.h b/src/ast.h index 424a2620..319be166 100644 --- a/src/ast.h +++ b/src/ast.h @@ -2,7 +2,9 @@ #define KMC_C90_COMPILER_AST_H enum AstTag { - AST_IDENTIFIER + AST_IDENTIFIER, + AST_FUNCTION_DEFINITION, + AST_EXTERNAL_DECLARATION }; #endif /* KMC_C90_COMPILER_AST_H */ diff --git a/src/parser.y b/src/parser.y index ec734e42..b2707a43 100644 --- a/src/parser.y +++ b/src/parser.y @@ -274,9 +274,18 @@ translation-unit ; external-declaration -: linkage-specifier.opt function-definition -| linkage-specifier.opt init-declaration -| typedef-specifier declaration +: linkage-specifier.opt function-definition { + $$ = cons(sexpr_make_ast(AST_FUNCTION_DEFINITION), + cons($[linkage-specifier.opt], $[function-definition])); +} +| linkage-specifier.opt init-declaration { + $$ = cons(sexpr_make_ast(AST_EXTERNAL_DECLARATION), + cons($[linkage-specifier.opt], $[init-declaration])); +} +| typedef-specifier declaration { + $$ = cons(sexpr_make_ast(AST_EXTERNAL_DECLARATION), + cons($[typedef-specifier], $[declaration])); +} ; function-definition-declarator From 1175d0ecec9503f139cc8126ea989c4187516a22 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Sun, 11 Sep 2016 16:07:06 +0900 Subject: [PATCH 3/3] Add function-definition action --- src/parser.y | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/parser.y b/src/parser.y index b2707a43..a7736ede 100644 --- a/src/parser.y +++ b/src/parser.y @@ -289,11 +289,17 @@ external-declaration ; function-definition-declarator -: identifier '(' parameter-declaration-list ')' +: identifier '(' parameter-declaration-list ')' { + $$ = cons($[identifier], $[parameter-declaration-list]); +} ; function-definition -: declaration-specifiers function-definition-declarator compound-statement +: declaration-specifiers function-definition-declarator compound-statement { + $$ = cons($[declaration-specifiers], + cons($[function-definition-declarator], + $[compound-statement])); +} ; %%