summaryrefslogtreecommitdiff
path: root/utils/TableGen/TGLexer.h
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-11-22 20:49:04 +0000
committerChris Lattner <sabre@nondot.org>2007-11-22 20:49:04 +0000
commitf460165a4c1bf4bc762f9b3f12b9ed284b89cc99 (patch)
tree682aa3de3d166b50c3025180826f14903bbd5e1e /utils/TableGen/TGLexer.h
parented4a2f168873527e1737deaa7a0c6c045a2cff7d (diff)
downloadllvm-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.h79
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