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 17cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/ADT/StringRef.h" 183cc52ea33c0b96d1682f14fc45c45b57df0f39b6Michael J. Spencer#include "llvm/Support/DataTypes.h" 19a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silva#include "llvm/Support/SMLoc.h" 20a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include <cassert> 21a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silva#include <map> 22a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner#include <string> 23a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner 24a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattnernamespace llvm { 258070ea3f068980d08cc10381f4c9369d19a91353Chris Lattnerclass SourceMgr; 261e3a8a492471f5dc3f50452af9eb9a2dfb1aeb39Chris Lattnerclass SMLoc; 27d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramerclass Twine; 28d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer 29f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnernamespace tgtok { 30f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner enum TokKind { 31f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner // Markers 32f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner Eof, Error, 33f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 34f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner // Tokens with no info. 35f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner minus, plus, // - + 36f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner l_square, r_square, // [ ] 37f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner l_brace, r_brace, // { } 38f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner l_paren, r_paren, // ( ) 39f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner less, greater, // < > 40606957fdd69f5ee1a561cd8acd070623f8ec9a21Francois Pichet colon, semi, // : ; 41f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner comma, period, // , . 42f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner equal, question, // = ? 43d3d1cad535d1c88e13e8e082c136260ee624967fDavid Greene paste, // # 44d3d1cad535d1c88e13e8e082c136260ee624967fDavid Greene 45f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner // Keywords. 46cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene Bit, Bits, Class, Code, Dag, Def, Foreach, Defm, Field, In, Int, Let, List, 47f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner MultiClass, String, 48f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 49f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner // !keywords. 50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines XConcat, XADD, XSRA, XSRL, XSHL, XListConcat, XStrConcat, XCast, XSubst, 511434f66b2e132a707e2c8ccb3350ea13fb5aa051David Greene XForEach, XHead, XTail, XEmpty, XIf, XEq, 52c7cafcd815519b06318629b424abe746437e1389David Greene 53f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner // Integer value. 54f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner IntVal, 55f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 56f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner // String valued tokens. 57f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner Id, StrVal, VarName, CodeFragment 58f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner }; 59f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner} 60a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner 61f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner/// TGLexer - TableGen Lexer class. 62a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattnerclass TGLexer { 638070ea3f068980d08cc10381f4c9369d19a91353Chris Lattner SourceMgr &SrcMgr; 64aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner 65a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner const char *CurPtr; 66cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines StringRef CurBuf; 67a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner 68f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner // Information about the current token. 69f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner const char *TokStart; 70f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind CurCode; 71f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner std::string CurStrVal; // This is valid for ID, STRVAL, VARNAME, CODEFRAGMENT 7263f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman int64_t CurIntVal; // This is valid for INTVAL. 73aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner 74aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner /// CurBuffer - This is the current buffer index we're lexing from as managed 75aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner /// by the SourceMgr object. 76cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines unsigned CurBuffer; 77a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silva 78a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silvapublic: 79a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silva typedef std::map<std::string, SMLoc> DependenciesMapTy; 80a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silvaprivate: 81dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger /// Dependencies - This is the list of all included files. 82a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silva DependenciesMapTy Dependencies; 83a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silva 84a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattnerpublic: 858070ea3f068980d08cc10381f4c9369d19a91353Chris Lattner TGLexer(SourceMgr &SrcMgr); 86aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner ~TGLexer() {} 87a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner 88f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind Lex() { 89f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner return CurCode = LexToken(); 90f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner } 91dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger 92a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silva const DependenciesMapTy &getDependencies() const { 93dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger return Dependencies; 94dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger } 95f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 96f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind getCode() const { return CurCode; } 97a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner 98f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner const std::string &getCurStrVal() const { 99f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner assert((CurCode == tgtok::Id || CurCode == tgtok::StrVal || 100f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner CurCode == tgtok::VarName || CurCode == tgtok::CodeFragment) && 101f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner "This token doesn't have a string value"); 102f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner return CurStrVal; 103f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner } 10463f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman int64_t getCurIntVal() const { 105f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner assert(CurCode == tgtok::IntVal && "This token isn't an integer"); 106f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner return CurIntVal; 107f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner } 10856a9fcfd1e19c7adfcc4c948e2f5e471ca8ed241Chris Lattner 1091e3a8a492471f5dc3f50452af9eb9a2dfb1aeb39Chris Lattner SMLoc getLoc() const; 110c8a9bbcbc777f5071ed67879b9f6f3b02c5d1e34Chris Lattner 111a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattnerprivate: 112f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner /// LexToken - Read the next token and return its code. 113f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind LexToken(); 114f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 115d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer tgtok::TokKind ReturnError(const char *Loc, const Twine &Msg); 116c8a9bbcbc777f5071ed67879b9f6f3b02c5d1e34Chris Lattner 117a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner int getNextChar(); 118a761f92cd38572dd65cc995c5f59b9c2c0f51068David Greene int peekNextChar(int Index); 119a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner void SkipBCPLComment(); 120a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner bool SkipCComment(); 121f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind LexIdentifier(); 122a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner bool LexInclude(); 123f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind LexString(); 124f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind LexVarName(); 125f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind LexNumber(); 126f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind LexBracket(); 127f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner tgtok::TokKind LexExclaim(); 128a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner}; 129a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner 130a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner} // end namespace llvm 131a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner 132a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner#endif 133