Unbreak VC++ build.
[oota-llvm.git] / utils / TableGen / FileLexer.l
index 08daf2fc2e698f3d3f88f8b264d72d7296e06274..653e9d10fbf0dc5163bb4d5a1bf789dd875cbf9a 100644 (file)
@@ -27,6 +27,7 @@
 %x comment
 
 %{
+#include "llvm/Config/config.h"
 #include "Record.h"
 typedef std::pair<llvm::Record*, std::vector<llvm::Init*>*> SubClassRefTy;
 #include "FileParser.h"
@@ -36,14 +37,14 @@ int Fileparse();
 namespace llvm {
 
 // Global variable recording the location of the include directory
-std::string IncludeDirectory;
+std::vector<std::string> IncludeDirectories;
 
 /// 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;
@@ -74,7 +75,8 @@ std::ostream &err() {
 
 /// ParseFile - this function begins the parsing of the specified tablegen file.
 ///
-void ParseFile(const std::string &Filename, const std::string & IncludeDir) {
+void ParseFile(const std::string &Filename, 
+               const std::vector<std::string> &IncludeDirs) {
   FILE *F = stdin;
   if (Filename != "-") {
     F = fopen(Filename.c_str(), "r");
@@ -90,7 +92,7 @@ void ParseFile(const std::string &Filename, const std::string & IncludeDir) {
 
   // Record the location of the include directory so that the lexer can find
   // it later.
-  IncludeDirectory = IncludeDir;
+  IncludeDirectories = IncludeDirs;
  
   Filein = F;
   Filelineno = 1;
@@ -124,10 +126,13 @@ static void HandleInclude(const char *Buffer) {
     // 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.
-    std::string NextFilename = IncludeDirectory + "/" + Filename;
-    yyin = fopen(NextFilename.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";
       exit(1);
@@ -191,10 +196,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);
@@ -209,13 +222,14 @@ ${Identifier}  { Filelval.StrVal = new std::string(yytext+1, yytext+yyleng);
 
 
 "/*"                    { BEGIN(comment); CommentDepth++; }
-<comment>[^*/]*         /* eat anything that's not a '*' or '/' */
-<comment>"*"+[^*/]*     /* eat up '*'s not followed by '/'s */
+<comment>[^*/]*         {} /* eat anything that's not a '*' or '/' */
+<comment>"*"+[^*/]*     {} /* eat up '*'s not followed by '/'s */
 <comment>"/*"           { ++CommentDepth; }
-<comment>"/"+[^*]*      /* eat up /'s not followed by *'s */
+<comment>"/"+[^*/]*     {} /* eat up /'s not followed by *'s */
 <comment>"*"+"/"        { if (!--CommentDepth) { BEGIN(INITIAL); } }
 <comment><<EOF>>        { err() << "Unterminated comment!\n"; exit(1); }
 
 .              { return Filetext[0]; }
 
 %%
+