2007-11-18 03:57:27 +01:00
|
|
|
//===- TGLexer.h - Lexer for TableGen Files ---------------------*- C++ -*-===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
2007-12-29 21:37:13 +01:00
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
2007-11-18 03:57:27 +01:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This class represents the Lexer for tablegen files.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef TGLEXER_H
|
|
|
|
#define TGLEXER_H
|
|
|
|
|
2010-11-29 19:47:54 +01:00
|
|
|
#include "llvm/Support/DataTypes.h"
|
2013-02-07 05:30:39 +01:00
|
|
|
#include "llvm/Support/SMLoc.h"
|
2012-12-04 08:12:27 +01:00
|
|
|
#include <cassert>
|
2013-02-07 05:30:39 +01:00
|
|
|
#include <map>
|
2007-11-18 03:57:27 +01:00
|
|
|
#include <string>
|
|
|
|
|
|
|
|
namespace llvm {
|
|
|
|
class MemoryBuffer;
|
2009-06-21 05:41:50 +02:00
|
|
|
class SourceMgr;
|
2009-06-21 05:39:35 +02:00
|
|
|
class SMLoc;
|
2010-09-27 19:42:11 +02:00
|
|
|
class Twine;
|
|
|
|
|
2007-11-22 21:49:04 +01:00
|
|
|
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, // < >
|
2011-03-14 03:30:32 +01:00
|
|
|
colon, semi, // : ;
|
2007-11-22 21:49:04 +01:00
|
|
|
comma, period, // , .
|
|
|
|
equal, question, // = ?
|
2011-10-19 15:04:43 +02:00
|
|
|
paste, // #
|
|
|
|
|
2007-11-22 21:49:04 +01:00
|
|
|
// Keywords.
|
2012-02-22 17:09:41 +01:00
|
|
|
Bit, Bits, Class, Code, Dag, Def, Foreach, Defm, Field, In, Int, Let, List,
|
2007-11-22 21:49:04 +01:00
|
|
|
MultiClass, String,
|
|
|
|
|
|
|
|
// !keywords.
|
2013-01-25 15:49:08 +01:00
|
|
|
XConcat, XADD, XSRA, XSRL, XSHL, XStrConcat, XCast, XSubst,
|
2011-01-07 18:05:37 +01:00
|
|
|
XForEach, XHead, XTail, XEmpty, XIf, XEq,
|
2009-04-22 22:18:10 +02:00
|
|
|
|
2007-11-22 21:49:04 +01:00
|
|
|
// Integer value.
|
|
|
|
IntVal,
|
|
|
|
|
|
|
|
// String valued tokens.
|
|
|
|
Id, StrVal, VarName, CodeFragment
|
|
|
|
};
|
|
|
|
}
|
2007-11-18 03:57:27 +01:00
|
|
|
|
2007-11-22 21:49:04 +01:00
|
|
|
/// TGLexer - TableGen Lexer class.
|
2007-11-18 03:57:27 +01:00
|
|
|
class TGLexer {
|
2009-06-21 05:41:50 +02:00
|
|
|
SourceMgr &SrcMgr;
|
2009-03-13 08:05:43 +01:00
|
|
|
|
2007-11-18 03:57:27 +01:00
|
|
|
const char *CurPtr;
|
2009-03-13 08:05:43 +01:00
|
|
|
const MemoryBuffer *CurBuf;
|
2007-11-18 03:57:27 +01:00
|
|
|
|
2007-11-22 21:49:04 +01:00
|
|
|
// Information about the current token.
|
|
|
|
const char *TokStart;
|
|
|
|
tgtok::TokKind CurCode;
|
|
|
|
std::string CurStrVal; // This is valid for ID, STRVAL, VARNAME, CODEFRAGMENT
|
2008-10-17 03:33:43 +02:00
|
|
|
int64_t CurIntVal; // This is valid for INTVAL.
|
2009-03-13 08:05:43 +01:00
|
|
|
|
|
|
|
/// CurBuffer - This is the current buffer index we're lexing from as managed
|
|
|
|
/// by the SourceMgr object.
|
|
|
|
int CurBuffer;
|
2013-02-07 05:30:39 +01:00
|
|
|
|
|
|
|
public:
|
|
|
|
typedef std::map<std::string, SMLoc> DependenciesMapTy;
|
|
|
|
private:
|
2011-06-01 15:10:15 +02:00
|
|
|
/// Dependencies - This is the list of all included files.
|
2013-02-07 05:30:39 +01:00
|
|
|
DependenciesMapTy Dependencies;
|
|
|
|
|
2007-11-18 03:57:27 +01:00
|
|
|
public:
|
2009-06-21 05:41:50 +02:00
|
|
|
TGLexer(SourceMgr &SrcMgr);
|
2009-03-13 08:05:43 +01:00
|
|
|
~TGLexer() {}
|
2007-11-18 03:57:27 +01:00
|
|
|
|
2007-11-22 21:49:04 +01:00
|
|
|
tgtok::TokKind Lex() {
|
|
|
|
return CurCode = LexToken();
|
|
|
|
}
|
2011-06-01 15:10:15 +02:00
|
|
|
|
2013-02-07 05:30:39 +01:00
|
|
|
const DependenciesMapTy &getDependencies() const {
|
2011-06-01 15:10:15 +02:00
|
|
|
return Dependencies;
|
|
|
|
}
|
2007-11-22 21:49:04 +01:00
|
|
|
|
|
|
|
tgtok::TokKind getCode() const { return CurCode; }
|
2007-11-18 03:57:27 +01:00
|
|
|
|
2007-11-22 21:49:04 +01:00
|
|
|
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;
|
|
|
|
}
|
2008-10-17 03:33:43 +02:00
|
|
|
int64_t getCurIntVal() const {
|
2007-11-22 21:49:04 +01:00
|
|
|
assert(CurCode == tgtok::IntVal && "This token isn't an integer");
|
|
|
|
return CurIntVal;
|
|
|
|
}
|
2007-11-19 08:43:52 +01:00
|
|
|
|
2009-06-21 05:39:35 +02:00
|
|
|
SMLoc getLoc() const;
|
2007-11-19 08:38:58 +01:00
|
|
|
|
2007-11-18 03:57:27 +01:00
|
|
|
private:
|
2007-11-22 21:49:04 +01:00
|
|
|
/// LexToken - Read the next token and return its code.
|
|
|
|
tgtok::TokKind LexToken();
|
|
|
|
|
2010-09-27 19:42:11 +02:00
|
|
|
tgtok::TokKind ReturnError(const char *Loc, const Twine &Msg);
|
2007-11-19 08:38:58 +01:00
|
|
|
|
2007-11-18 03:57:27 +01:00
|
|
|
int getNextChar();
|
2011-10-19 15:03:35 +02:00
|
|
|
int peekNextChar(int Index);
|
2007-11-18 03:57:27 +01:00
|
|
|
void SkipBCPLComment();
|
|
|
|
bool SkipCComment();
|
2007-11-22 21:49:04 +01:00
|
|
|
tgtok::TokKind LexIdentifier();
|
2007-11-18 03:57:27 +01:00
|
|
|
bool LexInclude();
|
2007-11-22 21:49:04 +01:00
|
|
|
tgtok::TokKind LexString();
|
|
|
|
tgtok::TokKind LexVarName();
|
|
|
|
tgtok::TokKind LexNumber();
|
|
|
|
tgtok::TokKind LexBracket();
|
|
|
|
tgtok::TokKind LexExclaim();
|
2007-11-18 03:57:27 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
} // end namespace llvm
|
|
|
|
|
|
|
|
#endif
|