X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=utils%2FTableGen%2FFileLexer.l;h=cc6825f5e07e1c29546cb2d5bc2517499656fb11;hb=a683f9ba1356e92a5e7243d9f80fe8a8b6f737c8;hp=64ed4c625a97022e5fd5865a3d6db0929de37110;hpb=2d930034f4ff48c6c285bb5960c582a46f0fb9fd;p=oota-llvm.git diff --git a/utils/TableGen/FileLexer.l b/utils/TableGen/FileLexer.l index 64ed4c625a9..cc6825f5e07 100644 --- a/utils/TableGen/FileLexer.l +++ b/utils/TableGen/FileLexer.l @@ -1,4 +1,11 @@ /*===-- FileLexer.l - Scanner for TableGen Files ----------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by the LLVM research group and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// // // This file defines a simple flex scanner for TableGen files. This is pretty // straight-forward, except for the magic to handle file inclusion. @@ -20,18 +27,25 @@ %x comment %{ +#include "llvm/Config/config.h" +#include "llvm/Support/Streams.h" #include "Record.h" -typedef std::pair*> SubClassRefTy; +typedef std::pair*> SubClassRefTy; #include "FileParser.h" +int Fileparse(); + +namespace llvm { + // Global variable recording the location of the include directory -std::string IncludeDirectory; +std::vector IncludeDirectories; -// ParseInt - This has to handle the special case of binary numbers 0b0101 +/// ParseInt - This has to handle the special case of binary numbers 0b0101 +/// static int ParseInt(const char *Str) { if (Str[0] == '0' && Str[1] == 'b') - return strtol(Str+2, 0, 2); - return strtol(Str, 0, 0); + return strtoll(Str+2, 0, 2); + return strtoll(Str, 0, 0); } static int CommentDepth = 0; @@ -49,39 +63,30 @@ struct IncludeRec { static std::vector IncludeStack; - std::ostream &err() { - if (IncludeStack.empty()) - return std::cerr << "At end of input: "; + if (IncludeStack.empty()) { + cerr << "At end of input: "; + return *cerr.stream(); + } for (unsigned i = 0, e = IncludeStack.size()-1; i != e; ++i) - std::cerr << "Included from " << IncludeStack[i].Filename << ":" - << IncludeStack[i].LineNo << ":\n"; - return std::cerr << "Parsing " << IncludeStack.back().Filename << ":" - << Filelineno << ": "; + cerr << "Included from " << IncludeStack[i].Filename << ":" + << IncludeStack[i].LineNo << ":\n"; + cerr << "Parsing " << IncludeStack.back().Filename << ":" + << Filelineno << ": "; + return *cerr.stream(); } - -int Fileparse(); - -// -// Function: ParseFile() -// -// Description: -// This function begins the parsing of the specified tablegen file. -// -// Inputs: -// Filename - A string containing the name of the file to parse. -// IncludeDir - A string containing the directory from which include -// files can be found. -// -void ParseFile(const std::string &Filename, const std::string & IncludeDir) { +/// ParseFile - this function begins the parsing of the specified tablegen file. +/// +void ParseFile(const std::string &Filename, + const std::vector &IncludeDirs) { FILE *F = stdin; if (Filename != "-") { F = fopen(Filename.c_str(), "r"); if (F == 0) { - std::cerr << "Could not open input file '" + Filename + "'!\n"; + cerr << "Could not open input file '" + Filename + "'!\n"; exit (1); } IncludeStack.push_back(IncludeRec(Filename, F)); @@ -89,11 +94,9 @@ void ParseFile(const std::string &Filename, const std::string & IncludeDir) { IncludeStack.push_back(IncludeRec("", stdin)); } - // // Record the location of the include directory so that the lexer can find // it later. - // - IncludeDirectory = IncludeDir; + IncludeDirectories = IncludeDirs; Filein = F; Filelineno = 1; @@ -101,8 +104,9 @@ void ParseFile(const std::string &Filename, const std::string & IncludeDir) { Filein = stdin; } -// HandleInclude - This function is called when an include directive is -// encountered in the input stream... +/// HandleInclude - This function is called when an include directive is +/// encountered in the input stream... +/// static void HandleInclude(const char *Buffer) { unsigned Length = yyleng; assert(Buffer[Length-1] == '"'); @@ -114,7 +118,7 @@ static void HandleInclude(const char *Buffer) { } assert(Length >= 2 && "Double quotes not found?"); std::string Filename(Buffer+1, Buffer+Length-1); - //std::cerr << "Filename = '" << Filename << "'\n"; + //cerr << "Filename = '" << Filename << "'\n"; // Save the line number and lex buffer of the includer... IncludeStack.back().LineNo = Filelineno; @@ -123,20 +127,21 @@ static void HandleInclude(const char *Buffer) { // Open the new input file... yyin = fopen(Filename.c_str(), "r"); if (yyin == 0) { - // // If we couldn't find the file in the current directory, look for it in // the include directories. // - // NOTE: - // Right now, there is only one directory. We need to eventually add - // support for more. - // - Filename = IncludeDirectory + "/" + Filename; - yyin = fopen(Filename.c_str(), "r"); + std::string NextFilename; + for (unsigned i = 0, e = IncludeDirectories.size(); i != e; ++i) { + NextFilename = IncludeDirectories[i] + "/" + Filename; + if ((yyin = fopen(NextFilename.c_str(), "r"))) + break; + } + if (yyin == 0) { err() << "Could not find include file '" << Filename << "'!\n"; - abort(); + exit(1); } + Filename = NextFilename; } // Add the file to our include stack... @@ -147,12 +152,11 @@ static void HandleInclude(const char *Buffer) { yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); } - -// yywrap - This is called when the lexer runs out of input in one of the files. -// Switch back to an includer if an includee has run out of input. -// +/// yywrap - This is called when the lexer runs out of input in one of the +/// files. Switch back to an includer if an includee has run out of input. +/// extern "C" -int yywrap() { +int yywrap(void) { if (IncludeStack.back().File != stdin) fclose(IncludeStack.back().File); IncludeStack.pop_back(); @@ -164,6 +168,10 @@ int yywrap() { return 0; } +} // End llvm namespace + +using namespace llvm; + %} Comment \/\/.* @@ -192,10 +200,18 @@ dag { return DAG; } class { return CLASS; } def { return DEF; } +defm { return DEFM; } +multiclass { return MULTICLASS; } field { return FIELD; } let { return LET; } in { return IN; } +!sra { return SRATOK; } +!srl { return SRLTOK; } +!shl { return SHLTOK; } +!strconcat { return STRCONCATTOK; } + + {Identifier} { Filelval.StrVal = new std::string(yytext, yytext+yyleng); return ID; } ${Identifier} { Filelval.StrVal = new std::string(yytext+1, yytext+yyleng); @@ -206,17 +222,18 @@ ${Identifier} { Filelval.StrVal = new std::string(yytext+1, yytext+yyleng); {Integer} { Filelval.IntVal = ParseInt(Filetext); return INTVAL; } -[ \t\n]+ { /* Ignore whitespace */ } +[ \t\n\r]+ { /* Ignore whitespace */ } "/*" { BEGIN(comment); CommentDepth++; } -[^*/]* /* eat anything that's not a '*' or '/' */ -"*"+[^*/]* /* eat up '*'s not followed by '/'s */ +[^*/]* {} /* eat anything that's not a '*' or '/' */ +"*"+[^*/]* {} /* eat up '*'s not followed by '/'s */ "/*" { ++CommentDepth; } -"/"+[^*]* /* eat up /'s not followed by *'s */ +"/"+[^*/]* {} /* eat up /'s not followed by *'s */ "*"+"/" { if (!--CommentDepth) { BEGIN(INITIAL); } } -<> { err() << "Unterminated comment!\n"; abort(); } +<> { err() << "Unterminated comment!\n"; exit(1); } . { return Filetext[0]; } %% +