1a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner//===- TGLexer.h - Lexer for TableGen Files ---------------------*- C++ -*-===// 2a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner// 3a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner// The LLVM Compiler Infrastructure 4a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner// 53060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// This file is distributed under the University of Illinois Open Source 63060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// License. See LICENSE.TXT for details. 7a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner// 8a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner//===----------------------------------------------------------------------===// 9a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner// 10a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner// This class represents the Lexer for tablegen files. 11a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner// 12a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner//===----------------------------------------------------------------------===// 13a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner 14a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner#ifndef TGLEXER_H 15a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner#define TGLEXER_H 16a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner 173cc52ea33c0b96d1682f14fc45c45b57df0f39b6Michael J. Spencer#include "llvm/Support/DataTypes.h" 18a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner#include <string> 19dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger#include <vector> 208dcf7513105fee939605eb98d86600ec279e3891Chris Lattner#include <cassert> 21a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner 22a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattnernamespace llvm { 23a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattnerclass MemoryBuffer; 248070ea3f068980d08cc10381f4c9369d19a91353Chris Lattnerclass SourceMgr; 251e3a8a492471f5dc3f50452af9eb9a2dfb1aeb39Chris Lattnerclass SMLoc; 26d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramerclass Twine; 27d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer 28f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnernamespace tgtok { 29f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner enum TokKind { 30f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner // Markers 31f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner Eof, Error, 32f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 33f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner // Tokens with no info. 34f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner minus, plus, // - + 35f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner l_square, r_square, // [ ] 36f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner l_brace, r_brace, // { } 37f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner l_paren, r_paren, // ( ) 38f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner less, greater, // < > 39606957fdd69f5ee1a561cd8acd070623f8ec9a21Francois Pichet colon, semi, // : ; 40f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner comma, period, // , . 41f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner equal, question, // = ? 42d3d1cad535d1c88e13e8e082c136260ee624967fDavid Greene paste, // # 43d3d1cad535d1c88e13e8e082c136260ee624967fDavid Greene 44f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner // Keywords. 45cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene Bit, Bits, Class, Code, Dag, Def, Foreach, Defm, Field, In, Int, Let, List, 46f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner MultiClass, String, 47f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 48f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner // !keywords. 49c7252ce74324e44efa7ec2506035a8e2d2e93d2fChris Lattner XConcat, XSRA, XSRL, XSHL, XStrConcat, XCast, XSubst, 501434f66b2e132a707e2c8ccb3350ea13fb5aa051David Greene XForEach, XHead, XTail, XEmpty, XIf, XEq, 51c7cafcd815519b06318629b424abe746437e1389David Greene 52f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner // Integer value. 53f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner IntVal, 54f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 55f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner // String valued tokens. 56f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner Id, StrVal, VarName, CodeFragment 57f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner }; 58f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner} 59a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner 60f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner/// TGLexer - TableGen Lexer class. 61a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattnerclass TGLexer { 628070ea3f068980d08cc10381f4c9369d19a91353Chris Lattner SourceMgr &SrcMgr; 63aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner 64a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner const char *CurPtr; 65aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner const MemoryBuffer *CurBuf; 66a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner 67f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner // Information about the current token. 68f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner const char *TokStart; 69f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind CurCode; 70f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner std::string CurStrVal; // This is valid for ID, STRVAL, VARNAME, CODEFRAGMENT 7163f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman int64_t CurIntVal; // This is valid for INTVAL. 72aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner 73aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner /// CurBuffer - This is the current buffer index we're lexing from as managed 74aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner /// by the SourceMgr object. 75aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner int CurBuffer; 76dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger /// Dependencies - This is the list of all included files. 77dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger std::vector<std::string> Dependencies; 78a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner 79a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattnerpublic: 808070ea3f068980d08cc10381f4c9369d19a91353Chris Lattner TGLexer(SourceMgr &SrcMgr); 81aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner ~TGLexer() {} 82a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner 83f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind Lex() { 84f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner return CurCode = LexToken(); 85f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner } 86dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger 87dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger const std::vector<std::string> &getDependencies() const { 88dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger return Dependencies; 89dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger } 90f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 91f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind getCode() const { return CurCode; } 92a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner 93f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner const std::string &getCurStrVal() const { 94f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner assert((CurCode == tgtok::Id || CurCode == tgtok::StrVal || 95f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner CurCode == tgtok::VarName || CurCode == tgtok::CodeFragment) && 96f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner "This token doesn't have a string value"); 97f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner return CurStrVal; 98f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner } 9963f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman int64_t getCurIntVal() const { 100f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner assert(CurCode == tgtok::IntVal && "This token isn't an integer"); 101f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner return CurIntVal; 102f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner } 10356a9fcfd1e19c7adfcc4c948e2f5e471ca8ed241Chris Lattner 1041e3a8a492471f5dc3f50452af9eb9a2dfb1aeb39Chris Lattner SMLoc getLoc() const; 105c8a9bbcbc777f5071ed67879b9f6f3b02c5d1e34Chris Lattner 106a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattnerprivate: 107f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner /// LexToken - Read the next token and return its code. 108f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind LexToken(); 109f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 110d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer tgtok::TokKind ReturnError(const char *Loc, const Twine &Msg); 111c8a9bbcbc777f5071ed67879b9f6f3b02c5d1e34Chris Lattner 112a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner int getNextChar(); 113a761f92cd38572dd65cc995c5f59b9c2c0f51068David Greene int peekNextChar(int Index); 114a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner void SkipBCPLComment(); 115a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner bool SkipCComment(); 116f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind LexIdentifier(); 117a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner bool LexInclude(); 118f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind LexString(); 119f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind LexVarName(); 120f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind LexNumber(); 121f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind LexBracket(); 122f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind LexExclaim(); 123a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner}; 124a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner 125a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner} // end namespace llvm 126a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner 127a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner#endif 128