mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
7cabd2e787
Add some data structures to represent for loops. These will be referenced during object processing to do any needed iteration and instantiation. Add foreach keyword support to the lexer. Add a mode to indicate that we're parsing a foreach loop. This allows the value parser to early-out when processing the foreach value list. Add a routine to parse foreach iteration declarations. This is separate from ParseDeclaration because the type of the named value (the iterator) doesn't match the type of the initializer value (the value list). It also needs to add two values to the foreach record: the iterator and the value list. Add parsing support for foreach. Add the code to process foreach loops and create defs based on iterator values. Allow foreach loops to be matched at the top level. When parsing an IDValue check if it is a foreach loop iterator for one of the active loops. If so, return a VarInit for it. Add Emacs keyword support for foreach. Add VIM keyword support for foreach. Add tests to check foreach operation. Add TableGen documentation for foreach. Support foreach with multiple objects. Support non-braced foreach body with one object. Do not require types for the foreach declaration. Assume the iterator type from the iteration list element type. llvm-svn: 151164
128 lines
3.2 KiB
C++
128 lines
3.2 KiB
C++
//===- TGLexer.h - Lexer for TableGen Files ---------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This class represents the Lexer for tablegen files.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef TGLEXER_H
|
|
#define TGLEXER_H
|
|
|
|
#include "llvm/Support/DataTypes.h"
|
|
#include <string>
|
|
#include <vector>
|
|
#include <cassert>
|
|
|
|
namespace llvm {
|
|
class MemoryBuffer;
|
|
class SourceMgr;
|
|
class SMLoc;
|
|
class Twine;
|
|
|
|
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, // = ?
|
|
paste, // #
|
|
|
|
// Keywords.
|
|
Bit, Bits, Class, Code, Dag, Def, Foreach, Defm, Field, In, Int, Let, List,
|
|
MultiClass, String,
|
|
|
|
// !keywords.
|
|
XConcat, XSRA, XSRL, XSHL, XStrConcat, XCast, XSubst,
|
|
XForEach, XHead, XTail, XEmpty, XIf, XEq,
|
|
|
|
// Integer value.
|
|
IntVal,
|
|
|
|
// String valued tokens.
|
|
Id, StrVal, VarName, CodeFragment
|
|
};
|
|
}
|
|
|
|
/// TGLexer - TableGen Lexer class.
|
|
class TGLexer {
|
|
SourceMgr &SrcMgr;
|
|
|
|
const char *CurPtr;
|
|
const MemoryBuffer *CurBuf;
|
|
|
|
// Information about the current token.
|
|
const char *TokStart;
|
|
tgtok::TokKind CurCode;
|
|
std::string CurStrVal; // This is valid for ID, STRVAL, VARNAME, CODEFRAGMENT
|
|
int64_t CurIntVal; // This is valid for INTVAL.
|
|
|
|
/// CurBuffer - This is the current buffer index we're lexing from as managed
|
|
/// by the SourceMgr object.
|
|
int CurBuffer;
|
|
/// Dependencies - This is the list of all included files.
|
|
std::vector<std::string> Dependencies;
|
|
|
|
public:
|
|
TGLexer(SourceMgr &SrcMgr);
|
|
~TGLexer() {}
|
|
|
|
tgtok::TokKind Lex() {
|
|
return CurCode = LexToken();
|
|
}
|
|
|
|
const std::vector<std::string> &getDependencies() const {
|
|
return Dependencies;
|
|
}
|
|
|
|
tgtok::TokKind getCode() const { return CurCode; }
|
|
|
|
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;
|
|
}
|
|
int64_t getCurIntVal() const {
|
|
assert(CurCode == tgtok::IntVal && "This token isn't an integer");
|
|
return CurIntVal;
|
|
}
|
|
|
|
SMLoc getLoc() const;
|
|
|
|
private:
|
|
/// LexToken - Read the next token and return its code.
|
|
tgtok::TokKind LexToken();
|
|
|
|
tgtok::TokKind ReturnError(const char *Loc, const Twine &Msg);
|
|
|
|
int getNextChar();
|
|
int peekNextChar(int Index);
|
|
void SkipBCPLComment();
|
|
bool SkipCComment();
|
|
tgtok::TokKind LexIdentifier();
|
|
bool LexInclude();
|
|
tgtok::TokKind LexString();
|
|
tgtok::TokKind LexVarName();
|
|
tgtok::TokKind LexNumber();
|
|
tgtok::TokKind LexBracket();
|
|
tgtok::TokKind LexExclaim();
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif
|