diff options
author | Chris Lattner <sabre@nondot.org> | 2007-11-22 20:49:04 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-11-22 20:49:04 +0000 |
commit | f460165a4c1bf4bc762f9b3f12b9ed284b89cc99 (patch) | |
tree | 682aa3de3d166b50c3025180826f14903bbd5e1e /utils/TableGen/TGLexer.h | |
parent | ed4a2f168873527e1737deaa7a0c6c045a2cff7d (diff) | |
download | llvm-f460165a4c1bf4bc762f9b3f12b9ed284b89cc99.tar.gz llvm-f460165a4c1bf4bc762f9b3f12b9ed284b89cc99.tar.bz2 llvm-f460165a4c1bf4bc762f9b3f12b9ed284b89cc99.tar.xz |
Rewrite the tblgen parser in a recursive descent style, eliminating the bison parser.
This makes the parser much easier to understand, eliminates a ton of global variables,
and gives tblgen nice caret diagnostics. It is also faster, but tblgen probably doesn't
care about performance.
There are a couple of FIXMEs which I will take care of next.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44274 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/TGLexer.h')
-rw-r--r-- | utils/TableGen/TGLexer.h | 79 |
1 files changed, 66 insertions, 13 deletions
diff --git a/utils/TableGen/TGLexer.h b/utils/TableGen/TGLexer.h index ef786b6f28..9f1b535cd4 100644 --- a/utils/TableGen/TGLexer.h +++ b/utils/TableGen/TGLexer.h @@ -20,12 +20,49 @@ namespace llvm { class MemoryBuffer; + +namespace tgtok { + enum TokKind { + // Markers + Eof, Error, + + // Tokens with no info. + minus, plus, // - + + l_square, r_square, // [ ] + l_brace, r_brace, // { } + l_paren, r_paren, // ( ) + less, greater, // < > + colon, semi, // ; : + comma, period, // , . + equal, question, // = ? + + // Keywords. + Bit, Bits, Class, Code, Dag, Def, Defm, Field, In, Int, Let, List, + MultiClass, String, + + // !keywords. + XConcat, XSRA, XSRL, XSHL, XStrConcat, + + // Integer value. + IntVal, + + // String valued tokens. + Id, StrVal, VarName, CodeFragment + }; +} +/// TGLexer - TableGen Lexer class. class TGLexer { const char *CurPtr; unsigned CurLineNo; MemoryBuffer *CurBuf; + // Information about the current token. + const char *TokStart; + tgtok::TokKind CurCode; + std::string CurStrVal; // This is valid for ID, STRVAL, VARNAME, CODEFRAGMENT + int CurIntVal; // This is valid for INTVAL. + /// IncludeRec / IncludeStack - This captures the current set of include /// directives we are nested within. struct IncludeRec { @@ -40,7 +77,6 @@ class TGLexer { // IncludeDirectories - This is the list of directories we should search for // include files in. std::vector<std::string> IncludeDirectories; - const char *TokStart; public: TGLexer(MemoryBuffer *StartBuf); ~TGLexer(); @@ -49,29 +85,46 @@ public: IncludeDirectories = Dirs; } - int LexToken(); + tgtok::TokKind Lex() { + return CurCode = LexToken(); + } + + tgtok::TokKind getCode() const { return CurCode; } - typedef const char* LocationTy; - LocationTy getTokenStart() const { return TokStart; } + const std::string &getCurStrVal() const { + assert((CurCode == tgtok::Id || CurCode == tgtok::StrVal || + CurCode == tgtok::VarName || CurCode == tgtok::CodeFragment) && + "This token doesn't have a string value"); + return CurStrVal; + } + int getCurIntVal() const { + assert(CurCode == tgtok::IntVal && "This token isn't an integer"); + return CurIntVal; + } - void PrintError(LocationTy Loc, const std::string &Msg) const; + typedef const char* LocTy; + LocTy getLoc() const { return TokStart; } + + void PrintError(LocTy Loc, const std::string &Msg) const; - std::ostream &err() const; void PrintIncludeStack(std::ostream &OS) const; private: - int ReturnError(const char *Loc, const std::string &Msg); + /// LexToken - Read the next token and return its code. + tgtok::TokKind LexToken(); + + tgtok::TokKind ReturnError(const char *Loc, const std::string &Msg); int getNextChar(); void SkipBCPLComment(); bool SkipCComment(); - int LexIdentifier(); + tgtok::TokKind LexIdentifier(); bool LexInclude(); - int LexString(); - int LexVarName(); - int LexNumber(); - int LexBracket(); - int LexExclaim(); + tgtok::TokKind LexString(); + tgtok::TokKind LexVarName(); + tgtok::TokKind LexNumber(); + tgtok::TokKind LexBracket(); + tgtok::TokKind LexExclaim(); }; } // end namespace llvm |