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);