00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef COMMA_PARSER_PARSER_HDR_GUARD
00010 #define COMMA_PARSER_PARSER_HDR_GUARD
00011
00012 #include "comma/parser/Lexer.h"
00013 #include "comma/parser/Bridge.h"
00014 #include "comma/basic/IdentifierPool.h"
00015 #include "llvm/ADT/SmallVector.h"
00016 #include <iosfwd>
00017
00018 namespace comma {
00019
00020 class Parser {
00021
00022 public:
00023 Parser(TextProvider &txtProvider,
00024 IdentifierPool &idPool,
00025 Bridge &bridge,
00026 Diagnostic &diag);
00027
00028
00029 typedef void (Parser::*parseFn)();
00030
00031
00032 typedef Node (Parser::*parseNodeFn)();
00033
00034 void parseModel();
00035 Node parseModelParameter();
00036 void parseModelParameterization();
00037 void parseModelSupersignatures();
00038
00039 void parseSignatureComponents();
00040
00041 Node parseModelInstantiation();
00042
00043
00044
00045
00046
00047 struct ParameterInfo {
00048 IdentifierInfo *formal;
00049 Node type;
00050 Location formalLocation;
00051 Location typeLocation;
00052 };
00053
00054
00055
00056
00057
00058
00059 bool parseFormalParameter(ParameterInfo ¶mInfo, parseNodeFn parser);
00060
00061 Node parseFunctionParameter();
00062 Node parseFunctionParmeterList();
00063 Node parseFunctionProto();
00064
00065
00066
00067 bool parseTopLevelDeclaration();
00068
00069 private:
00070 TextProvider &txtProvider;
00071 IdentifierPool &idPool;
00072 Bridge &action;
00073 Diagnostic &diagnostic;
00074
00075 Lexer lexer;
00076
00077 Lexer::Token token[2];
00078
00079 bool seenError;
00080
00081
00082
00083 typedef llvm::SmallVector<Node, 4> NodeVector;
00084
00085
00086 typedef llvm::SmallVector<Location, 4> LocationVector;
00087
00088
00089 typedef llvm::SmallVector<IdentifierInfo*, 4> IdInfoVector;
00090
00091 unsigned currentLine();
00092 unsigned currentColumn();
00093 Location currentLocation();
00094
00095 IdentifierInfo *getIdentifierInfo(const Lexer::Token &tkn);
00096
00097 Lexer::Token &nextToken();
00098 Lexer::Token ¤tToken();
00099 Lexer::Token &peekToken();
00100 void ignoreToken();
00101
00102 Lexer::Code currentTokenCode();
00103 Lexer::Code peekTokenCode();
00104
00105 bool currentTokenIs(Lexer::Code code);
00106 bool nextTokenIs(Lexer::Code code);
00107 bool expectToken(Lexer::Code code);
00108 bool reduceToken(Lexer::Code code);
00109 bool requireToken(Lexer::Code code);
00110
00111 bool seekToken(Lexer::Code code);
00112 bool seekAndConsumeToken(Lexer::Code code);
00113
00114 bool seekTokens(Lexer::Code code0,
00115 Lexer::Code code1 = Lexer::UNUSED_ID,
00116 Lexer::Code code2 = Lexer::UNUSED_ID,
00117 Lexer::Code code3 = Lexer::UNUSED_ID,
00118 Lexer::Code code4 = Lexer::UNUSED_ID);
00119
00120 bool seekAndConsumeTokens(Lexer::Code code0,
00121 Lexer::Code code1 = Lexer::UNUSED_ID,
00122 Lexer::Code code2 = Lexer::UNUSED_ID,
00123 Lexer::Code code3 = Lexer::UNUSED_ID,
00124 Lexer::Code code4 = Lexer::UNUSED_ID);
00125
00126 bool seekEndLabel(const char *label);
00127
00128 DiagnosticStream &report(Location loc, diag::Kind kind) {
00129 SourceLocation sloc = txtProvider.getSourceLocation(loc);
00130 return diagnostic.report(sloc, kind);
00131 }
00132
00133 DiagnosticStream &report(SourceLocation sloc, diag::Kind kind) {
00134 return diagnostic.report(sloc, kind);
00135 }
00136
00137 DiagnosticStream &report(diag::Kind kind) {
00138 SourceLocation sloc = txtProvider.getSourceLocation(currentLocation());
00139 return diagnostic.report(sloc, kind);
00140 }
00141
00142 IdentifierInfo *parseIdentifierInfo();
00143 IdentifierInfo *parseFunctionIdentifierInfo();
00144
00145
00146
00147
00148 bool parseEndTag(IdentifierInfo *expectedTag = 0);
00149
00150
00151
00152 bool unitExprFollows();
00153
00154
00155
00156 bool argumentSelectorFollows();
00157
00158
00159 template <class T> void deleteNodes(T &nodes) {
00160 typename T::iterator iter;
00161 typename T::iterator endIter = nodes.end();
00162 for (iter = nodes.begin(); iter != endIter; ++iter)
00163 action.deleteNode(*iter);
00164 }
00165
00166 };
00167
00168 }
00169
00170 #endif