Mercurial > projects > dil
comparison trunk/src/dil/Parser.d @ 494:9a7ca8c56e59
Refactored a few things in the Parser.
Removed unnecessary 'bool hasBody' parameter from some declarations.
Added shebang to list of tokens in Lexer unittest.
Added some semantic methods.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Fri, 07 Dec 2007 18:22:35 +0100 |
parents | d13502b6fa5f |
children | b60450804b6e |
comparison
equal
deleted
inserted
replaced
493:d13502b6fa5f | 494:9a7ca8c56e59 |
---|---|
1005 | 1005 |
1006 Token* className; | 1006 Token* className; |
1007 TemplateParameters tparams; | 1007 TemplateParameters tparams; |
1008 BaseClass[] bases; | 1008 BaseClass[] bases; |
1009 Declarations decls; | 1009 Declarations decls; |
1010 bool hasBody; | |
1011 | 1010 |
1012 nT(); // Skip class keyword. | 1011 nT(); // Skip class keyword. |
1013 className = requireId(); | 1012 className = requireId(); |
1014 | 1013 |
1015 if (token.type == T.LParen) | 1014 if (token.type == T.LParen) |
1016 { | |
1017 tparams = parseTemplateParameterList(); | 1015 tparams = parseTemplateParameterList(); |
1018 } | |
1019 | 1016 |
1020 if (token.type == T.Colon) | 1017 if (token.type == T.Colon) |
1021 bases = parseBaseClasses(); | 1018 bases = parseBaseClasses(); |
1022 | 1019 |
1023 if (token.type == T.Semicolon) | 1020 if (token.type == T.Semicolon) |
1025 if (bases.length != 0) | 1022 if (bases.length != 0) |
1026 error(MID.BaseClassInForwardDeclaration); | 1023 error(MID.BaseClassInForwardDeclaration); |
1027 nT(); | 1024 nT(); |
1028 } | 1025 } |
1029 else if (token.type == T.LBrace) | 1026 else if (token.type == T.LBrace) |
1030 { | |
1031 hasBody = true; | |
1032 decls = parseDeclarationDefinitionsBlock(); | 1027 decls = parseDeclarationDefinitionsBlock(); |
1033 } | |
1034 else | 1028 else |
1035 expected(T.LBrace); // TODO: better error msg | 1029 expected(T.LBrace); // TODO: better error msg |
1036 | 1030 |
1037 return new ClassDeclaration(className, tparams, bases, decls, hasBody); | 1031 return new ClassDeclaration(className, tparams, bases, decls); |
1038 } | 1032 } |
1039 | 1033 |
1040 BaseClass[] parseBaseClasses(bool colonLeadsOff = true) | 1034 BaseClass[] parseBaseClasses(bool colonLeadsOff = true) |
1041 { | 1035 { |
1042 if (colonLeadsOff) | 1036 if (colonLeadsOff) |
1081 | 1075 |
1082 Token* name; | 1076 Token* name; |
1083 TemplateParameters tparams; | 1077 TemplateParameters tparams; |
1084 BaseClass[] bases; | 1078 BaseClass[] bases; |
1085 Declarations decls; | 1079 Declarations decls; |
1086 bool hasBody; | |
1087 | 1080 |
1088 nT(); // Skip interface keyword. | 1081 nT(); // Skip interface keyword. |
1089 name = requireId(); | 1082 name = requireId(); |
1090 | 1083 |
1091 if (token.type == T.LParen) | 1084 if (token.type == T.LParen) |
1092 { | |
1093 tparams = parseTemplateParameterList(); | 1085 tparams = parseTemplateParameterList(); |
1094 } | |
1095 | 1086 |
1096 if (token.type == T.Colon) | 1087 if (token.type == T.Colon) |
1097 bases = parseBaseClasses(); | 1088 bases = parseBaseClasses(); |
1098 | 1089 |
1099 if (token.type == T.Semicolon) | 1090 if (token.type == T.Semicolon) |
1101 if (bases.length != 0) | 1092 if (bases.length != 0) |
1102 error(MID.BaseClassInForwardDeclaration); | 1093 error(MID.BaseClassInForwardDeclaration); |
1103 nT(); | 1094 nT(); |
1104 } | 1095 } |
1105 else if (token.type == T.LBrace) | 1096 else if (token.type == T.LBrace) |
1106 { | |
1107 hasBody = true; | |
1108 decls = parseDeclarationDefinitionsBlock(); | 1097 decls = parseDeclarationDefinitionsBlock(); |
1109 } | |
1110 else | 1098 else |
1111 expected(T.LBrace); // TODO: better error msg | 1099 expected(T.LBrace); // TODO: better error msg |
1112 | 1100 |
1113 return new InterfaceDeclaration(name, tparams, bases, decls, hasBody); | 1101 return new InterfaceDeclaration(name, tparams, bases, decls); |
1114 } | 1102 } |
1115 | 1103 |
1116 Declaration parseAggregateDeclaration() | 1104 Declaration parseAggregateDeclaration() |
1117 { | 1105 { |
1118 assert(token.type == T.Struct || token.type == T.Union); | 1106 assert(token.type == T.Struct || token.type == T.Union); |
1120 TOK tok = token.type; | 1108 TOK tok = token.type; |
1121 | 1109 |
1122 Token* name; | 1110 Token* name; |
1123 TemplateParameters tparams; | 1111 TemplateParameters tparams; |
1124 Declarations decls; | 1112 Declarations decls; |
1125 bool hasBody; | |
1126 | 1113 |
1127 nT(); // Skip struct or union keyword. | 1114 nT(); // Skip struct or union keyword. |
1128 // name is optional. | 1115 // name is optional. |
1129 if (token.type == T.Identifier) | 1116 if (token.type == T.Identifier) |
1130 { | 1117 { |
1131 name = token; | 1118 name = token; |
1132 nT(); | 1119 nT(); |
1133 if (token.type == T.LParen) | 1120 if (token.type == T.LParen) |
1134 { | |
1135 tparams = parseTemplateParameterList(); | 1121 tparams = parseTemplateParameterList(); |
1136 } | |
1137 } | 1122 } |
1138 | 1123 |
1139 if (token.type == T.Semicolon) | 1124 if (token.type == T.Semicolon) |
1140 { | 1125 { |
1141 //if (name.length == 0) | 1126 //if (name.length == 0) |
1142 // TODO: error: forward declarations must have a name. | 1127 // TODO: error: forward declarations must have a name. |
1143 nT(); | 1128 nT(); |
1144 } | 1129 } |
1145 else if (token.type == T.LBrace) | 1130 else if (token.type == T.LBrace) |
1146 { | |
1147 hasBody = true; | |
1148 decls = parseDeclarationDefinitionsBlock(); | 1131 decls = parseDeclarationDefinitionsBlock(); |
1149 } | |
1150 else | 1132 else |
1151 expected(T.LBrace); // TODO: better error msg | 1133 expected(T.LBrace); // TODO: better error msg |
1152 | 1134 |
1153 if (tok == T.Struct) | 1135 if (tok == T.Struct) |
1154 return new StructDeclaration(name, tparams, decls, hasBody); | 1136 return new StructDeclaration(name, tparams, decls); |
1155 else | 1137 else |
1156 return new UnionDeclaration(name, tparams, decls, hasBody); | 1138 return new UnionDeclaration(name, tparams, decls); |
1157 } | 1139 } |
1158 | 1140 |
1159 Declaration parseConstructorDeclaration() | 1141 Declaration parseConstructorDeclaration() |
1160 { | 1142 { |
1161 assert(token.type == T.This); | 1143 assert(token.type == T.This); |