From e7e182527772a6dd93a32b6a4f0836989ec59dfa Mon Sep 17 00:00:00 2001 From: hatsusato Date: Wed, 21 Sep 2016 23:25:52 +0900 Subject: [PATCH 01/17] Split storage-class-specifier into linkage-specifier and typedef-specifier --- src/parser.y | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/parser.y b/src/parser.y index a44c2741..e010fafe 100644 --- a/src/parser.y +++ b/src/parser.y @@ -283,13 +283,20 @@ init-declarator ; storage-class-specifier -: "typedef" -| "extern" -| "static" +: "static" | "auto" | "register" ; +linkage-specifier +: "extern" +| "static" +; + +typedef-specifier +: "typedef" +; + type-specifier : "void" | "char" From d3de52758de7fc861cae450a5b47b1aa3805ec7e Mon Sep 17 00:00:00 2001 From: hatsusato Date: Thu, 22 Sep 2016 00:47:21 +0900 Subject: [PATCH 02/17] Put storage-class-specifier out from declaration-specifiers --- src/parser.y | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/parser.y b/src/parser.y index e010fafe..153e09ec 100644 --- a/src/parser.y +++ b/src/parser.y @@ -259,6 +259,7 @@ constant-expression declaration : declaration-specifiers ';' | declaration-specifiers init-declarator-list ';' +| storage-class-specifier declaration-specifiers init-declarator-list ';' ; declaration-specifiers.opt @@ -267,8 +268,7 @@ declaration-specifiers.opt ; declaration-specifiers -: storage-class-specifier declaration-specifiers.opt -| type-specifier declaration-specifiers.opt +: type-specifier declaration-specifiers.opt | type-qualifier declaration-specifiers.opt ; @@ -524,6 +524,7 @@ external-declaration function-definition : declaration-specifiers declarator compound-statement +| linkage-specifier declaration-specifiers declarator compound-statement ; %% From 04d677a457aa3507acd81984a314832647335f45 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Thu, 22 Sep 2016 00:40:56 +0900 Subject: [PATCH 03/17] Split declaration into type-declaration --- src/parser.y | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/parser.y b/src/parser.y index 153e09ec..834077eb 100644 --- a/src/parser.y +++ b/src/parser.y @@ -256,9 +256,12 @@ constant-expression : conditional-expression ; -declaration +type-declaration : declaration-specifiers ';' -| declaration-specifiers init-declarator-list ';' +; + +declaration +: declaration-specifiers init-declarator-list ';' | storage-class-specifier declaration-specifiers init-declarator-list ';' ; @@ -519,7 +522,7 @@ translation-unit external-declaration : function-definition -| declaration +| type-declaration ; function-definition From 1df1f6d59c9fac065c018837456c153889c21efd Mon Sep 17 00:00:00 2001 From: hatsusato Date: Thu, 22 Sep 2016 00:43:14 +0900 Subject: [PATCH 04/17] Add global-declaration --- src/parser.y | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/parser.y b/src/parser.y index 834077eb..ec19169d 100644 --- a/src/parser.y +++ b/src/parser.y @@ -265,6 +265,11 @@ declaration | storage-class-specifier declaration-specifiers init-declarator-list ';' ; +global-declaration +: declaration-specifiers init-declarator-list ';' +| linkage-specifier declaration-specifiers init-declarator-list ';' +; + declaration-specifiers.opt : %empty | declaration-specifiers @@ -523,6 +528,7 @@ translation-unit external-declaration : function-definition | type-declaration +| global-declaration ; function-definition From 441a285529a35d4ab04f1f4c6badfba97c9e8de5 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Thu, 22 Sep 2016 00:43:38 +0900 Subject: [PATCH 05/17] Add typedef-declaration --- src/parser.y | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/parser.y b/src/parser.y index ec19169d..b2893e77 100644 --- a/src/parser.y +++ b/src/parser.y @@ -270,6 +270,10 @@ global-declaration | linkage-specifier declaration-specifiers init-declarator-list ';' ; +typedef-declaration +: typedef-specifier declaration-specifiers declarator-list ';' +; + declaration-specifiers.opt : %empty | declaration-specifiers @@ -529,6 +533,7 @@ external-declaration : function-definition | type-declaration | global-declaration +| typedef-declaration ; function-definition From f7128f5a3c3ce6230e1108be5fc62560ddc1b41f Mon Sep 17 00:00:00 2001 From: hatsusato Date: Thu, 22 Sep 2016 00:11:51 +0900 Subject: [PATCH 06/17] Add declarator-list --- src/parser.y | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/parser.y b/src/parser.y index b2893e77..14a14294 100644 --- a/src/parser.y +++ b/src/parser.y @@ -392,6 +392,11 @@ type-qualifier | "volatile" ; +declarator-list +: declarator +| declarator-list ',' declarator +; + declarator : pointer-list.opt direct-declarator ; From ff1a9b43e3cd86c41c35dca6e3eabc8b8728f380 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Thu, 22 Sep 2016 10:29:05 +0900 Subject: [PATCH 07/17] Add int.opt --- src/parser.y | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/parser.y b/src/parser.y index 14a14294..b73e91cb 100644 --- a/src/parser.y +++ b/src/parser.y @@ -75,6 +75,8 @@ void set_yyin_string(const char *code); %token VOLATILE "volatile" %token WHILE "while" +%precedence NO_INT +%precedence INT %precedence ONLY_IF %precedence ELSE @@ -309,6 +311,11 @@ typedef-specifier : "typedef" ; +int.opt +: NO_INT +| "int" +; + type-specifier : "void" | "char" From 1c8f988a99f7ed3de7250014cbf981349d40a2d3 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Thu, 22 Sep 2016 10:29:44 +0900 Subject: [PATCH 08/17] Add type rules for short, int, long and long long --- src/parser.y | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/parser.y b/src/parser.y index b73e91cb..4eace695 100644 --- a/src/parser.y +++ b/src/parser.y @@ -316,6 +316,26 @@ int.opt | "int" ; +short-type +: "short" int.opt +| "signed" "short" int.opt +; + +int-type +: "int" +| "signed" int.opt +; + +long-type +: "long" int.opt +| "signed" "long" int.opt +; + +long-long-type +: "long" "long" int.opt +| "signed" "long" "long" int.opt +; + type-specifier : "void" | "char" From cd44bb67740d363e14e5a1d82a95deb8c58ee88a Mon Sep 17 00:00:00 2001 From: hatsusato Date: Thu, 22 Sep 2016 10:30:20 +0900 Subject: [PATCH 09/17] Add fundamental-type-specifier --- src/parser.y | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/parser.y b/src/parser.y index 4eace695..7768a5d8 100644 --- a/src/parser.y +++ b/src/parser.y @@ -336,16 +336,26 @@ long-long-type | "signed" "long" "long" int.opt ; -type-specifier +fundamental-type-specifier : "void" | "char" -| "short" -| "int" -| "long" +| "signed" "char" +| "unsigned" "char" +| short-type +| "unsigned" "short" int.opt +| int-type +| "unsigned" int.opt +| long-type +| "unsigned" "long" int.opt +| long-long-type +| "unsigned" "long" "long" int.opt | "float" | "double" -| "signed" -| "unsigned" +| "long" "double" +; + +type-specifier +: fundamental-type-specifier | struct-or-union-specifier | enum-specifier | typedef-name From 79613b3cdfef7abf10a49c2d6d330a56427a3ef5 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Thu, 22 Sep 2016 10:31:33 +0900 Subject: [PATCH 10/17] Refine declaration-specifiers --- src/parser.y | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/parser.y b/src/parser.y index 7768a5d8..a9907a54 100644 --- a/src/parser.y +++ b/src/parser.y @@ -75,8 +75,6 @@ void set_yyin_string(const char *code); %token VOLATILE "volatile" %token WHILE "while" -%precedence NO_INT -%precedence INT %precedence ONLY_IF %precedence ELSE @@ -276,14 +274,8 @@ typedef-declaration : typedef-specifier declaration-specifiers declarator-list ';' ; -declaration-specifiers.opt -: %empty -| declaration-specifiers -; - declaration-specifiers -: type-specifier declaration-specifiers.opt -| type-qualifier declaration-specifiers.opt +: type-qualifier-list.opt type-specifier type-qualifier-list.opt ; init-declarator-list @@ -312,7 +304,7 @@ typedef-specifier ; int.opt -: NO_INT +: %empty | "int" ; From 843f8b27deb2e2760759fd111874835ab39b0125 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Thu, 22 Sep 2016 11:40:23 +0900 Subject: [PATCH 11/17] Remove specifier-qualifier-list and use declaration-specifiers instead --- src/parser.y | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/src/parser.y b/src/parser.y index a9907a54..311451a0 100644 --- a/src/parser.y +++ b/src/parser.y @@ -373,21 +373,7 @@ struct-declaration-list ; struct-declaration -: specifier-qualifier-list struct-declarator-list ';' -; - -specifier-qualifier-list.opt -: %empty -| specifier-qualifier-list -; - -specifier-qualifier-list -: specifier-qualifier specifier-qualifier-list.opt -; - -specifier-qualifier -: type-specifier -| type-qualifier +: declaration-specifiers struct-declarator-list ';' ; struct-declarator-list @@ -468,8 +454,8 @@ parameter-declaration ; type-name -: specifier-qualifier-list -| specifier-qualifier-list abstract-declarator +: declaration-specifiers +| declaration-specifiers abstract-declarator ; abstract-declarator From f08d752919a78b96c1e6995a85e66d40bbdb0f0b Mon Sep 17 00:00:00 2001 From: hatsusato Date: Thu, 22 Sep 2016 13:51:56 +0900 Subject: [PATCH 12/17] Add array-declarator --- src/parser.y | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/parser.y b/src/parser.y index 311451a0..65c015df 100644 --- a/src/parser.y +++ b/src/parser.y @@ -424,6 +424,11 @@ direct-declarator | direct-declarator '(' parameter-declaration-list ',' "..." ')' ; +array-declarator +: direct-declarator '[' constant-expression.opt ']' +| array-declarator '[' constant-expression.opt ']' +; + pointer-list.opt : %empty | pointer-list From e95dd28d70cdbd8dcdd348d0a2d4911af064f0b8 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Thu, 22 Sep 2016 13:52:17 +0900 Subject: [PATCH 13/17] Add (variadic-)function-declarator --- src/parser.y | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/parser.y b/src/parser.y index 65c015df..d769a9b0 100644 --- a/src/parser.y +++ b/src/parser.y @@ -429,6 +429,14 @@ array-declarator | array-declarator '[' constant-expression.opt ']' ; +function-declarator +: direct-declarator '(' parameter-declaration-list ')' +; + +variadic-function-declarator +: direct-declarator '(' parameter-declaration-list ',' "..." ')' +; + pointer-list.opt : %empty | pointer-list From 680f7b22e875d371a8e2ce80872a3358ab115b3b Mon Sep 17 00:00:00 2001 From: hatsusato Date: Thu, 22 Sep 2016 13:52:44 +0900 Subject: [PATCH 14/17] Refine (direct-)declarator --- src/parser.y | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/parser.y b/src/parser.y index d769a9b0..1e017a81 100644 --- a/src/parser.y +++ b/src/parser.y @@ -414,14 +414,14 @@ declarator-list declarator : pointer-list.opt direct-declarator +| pointer-list.opt array-declarator +| pointer-list.opt function-declarator +| pointer-list.opt variadic-function-declarator ; direct-declarator : identifier | '(' declarator ')' -| direct-declarator '[' constant-expression.opt ']' -| direct-declarator '(' parameter-declaration-list ')' -| direct-declarator '(' parameter-declaration-list ',' "..." ')' ; array-declarator From 63cfdee2454b21df3d89e288d3d4997acd5b2ba7 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Thu, 22 Sep 2016 15:01:33 +0900 Subject: [PATCH 15/17] Add array-abstract-declarator --- src/parser.y | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/parser.y b/src/parser.y index 1e017a81..a2f59c01 100644 --- a/src/parser.y +++ b/src/parser.y @@ -486,6 +486,12 @@ direct-abstract-declarator | direct-abstract-declarator '(' parameter-declaration-list ',' "..." ')' ; +array-abstract-declarator +: '[' constant-expression.opt ']' +| direct-abstract-declarator '[' constant-expression.opt ']' +| array-abstract-declarator '[' constant-expression.opt ']' +; + initializer : assignment-expression | '{' initializer-list '}' From e3352efe5f4587df5f8b1982269cad7145a9e255 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Thu, 22 Sep 2016 15:02:00 +0900 Subject: [PATCH 16/17] Add (variadic-)function-abstract-declarator --- src/parser.y | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/parser.y b/src/parser.y index a2f59c01..bb2d5b57 100644 --- a/src/parser.y +++ b/src/parser.y @@ -492,6 +492,16 @@ array-abstract-declarator | array-abstract-declarator '[' constant-expression.opt ']' ; +function-abstract-declarator +: '(' parameter-declaration-list ')' +| direct-abstract-declarator '(' parameter-declaration-list ')' +; + +variadic-function-abstract-declarator +: '(' parameter-declaration-list ',' "..." ')' +| direct-abstract-declarator '(' parameter-declaration-list ',' "..." ')' +; + initializer : assignment-expression | '{' initializer-list '}' From 71e97b832e78732981822edacd531b53931846c9 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Thu, 22 Sep 2016 15:02:34 +0900 Subject: [PATCH 17/17] Refine (direct-)abstract-declarator --- src/parser.y | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/parser.y b/src/parser.y index bb2d5b57..051f96db 100644 --- a/src/parser.y +++ b/src/parser.y @@ -474,16 +474,13 @@ type-name abstract-declarator : pointer-list | pointer-list.opt direct-abstract-declarator +| pointer-list.opt array-abstract-declarator +| pointer-list.opt function-abstract-declarator +| pointer-list.opt variadic-function-abstract-declarator ; direct-abstract-declarator : '(' abstract-declarator ')' -| '[' constant-expression.opt ']' -| direct-abstract-declarator '[' constant-expression.opt ']' -| '(' parameter-declaration-list ')' -| '(' parameter-declaration-list ',' "..." ')' -| direct-abstract-declarator '(' parameter-declaration-list ')' -| direct-abstract-declarator '(' parameter-declaration-list ',' "..." ')' ; array-abstract-declarator