Add support for code fragments
authorChris Lattner <sabre@nondot.org>
Wed, 30 Jul 2003 22:15:58 +0000 (22:15 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 30 Jul 2003 22:15:58 +0000 (22:15 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7440 91177308-0d34-0410-b5e6-96231b3b80d8

support/tools/TableGen/FileLexer.l
support/tools/TableGen/FileParser.y
support/tools/TableGen/Record.h
utils/TableGen/FileLexer.l
utils/TableGen/FileParser.y
utils/TableGen/Record.h

index 34a2818b2f2b347b787c54ea4446f22715e5dd63..a98a88170eaba5b23f2789ddc3b6521000ad14b0 100644 (file)
@@ -132,19 +132,21 @@ int yywrap() {
 
 %}
 
-Comment     \/\/.*
+Comment      \/\/.*
 
-Identifier  [a-zA-Z_][0-9a-zA-Z_]*
-Integer     [-+]?[0-9]+|0x[0-9a-fA-F]+|0b[01]+
-StringVal   \"[^"]*\"
-IncludeStr  include[ \t\n]+\"[^"]*\"
+Identifier   [a-zA-Z_][0-9a-zA-Z_]*
+Integer      [-+]?[0-9]+|0x[0-9a-fA-F]+|0b[01]+
+CodeFragment \[\{([^}]+|\}[^\]])*\}\]
+StringVal    \"[^"]*\"
+IncludeStr   include[ \t\n]+\"[^"]*\"
 
 %%
 
 {Comment}      { /* Ignore comments */ }
 
 {IncludeStr}   { HandleInclude(yytext); }
-
+{CodeFragment} { Filelval.StrVal = new std::string(yytext+2, yytext+yyleng-2);
+                 return CODEFRAGMENT; }
 
 int            { return INT; }
 bit            { return BIT; }
index e906a5e4e38d292e014e66a0afe75f084991a0e7..d248242b2d6be08ad7f40fc0c9c277b4db854eff 100644 (file)
@@ -155,7 +155,7 @@ static void addSubClass(Record *SC, const std::vector<Init*> &TemplateArgs) {
 
 %token INT BIT STRING BITS LIST CODE CLASS DEF FIELD SET IN
 %token <IntVal>      INTVAL
-%token <StrVal>      ID STRVAL
+%token <StrVal>      ID STRVAL CODEFRAGMENT
 
 %type <Ty>           Type
 %type <RecPtr>       DefList DefListNE
@@ -217,6 +217,9 @@ Value : INTVAL {
   } | STRVAL {
     $$ = new StringInit(*$1);
     delete $1;
+  } | CODEFRAGMENT {
+    $$ = new CodeInit(*$1);
+    delete $1;
   } | '?' {
     $$ = new UnsetInit();
   } | '{' ValueList '}' {
index 308047a2b432e94deb4f531a9e25838309e2ca17..3c07114f2e55fbf7448a1681efc7d3d077601f44 100644 (file)
@@ -18,6 +18,7 @@ class BitInit;
 class BitsInit;
 class IntInit;
 class StringInit;
+class CodeInit;
 class ListInit;
 class DefInit;
 class TypedInit;
@@ -39,6 +40,7 @@ struct RecTy {
   virtual Init *convertValue(   IntInit *II) { return 0; }
   virtual Init *convertValue(StringInit *SI) { return 0; }
   virtual Init *convertValue(  ListInit *LI) { return 0; }
+  virtual Init *convertValue(  CodeInit *CI) { return 0; }
   virtual Init *convertValue(VarBitInit *VB) { return 0; }
   virtual Init *convertValue(   DefInit *DI) { return 0; }
   virtual Init *convertValue( TypedInit *TI) { return 0; }
@@ -135,6 +137,7 @@ public:
 ///
 struct CodeRecTy : public RecTy {
   Init *convertValue(UnsetInit *UI) { return (Init*)UI; }
+  Init *convertValue( CodeInit *CI) { return (Init*)CI; }
 
   void print(std::ostream &OS) const { OS << "code"; }
 };
@@ -321,6 +324,20 @@ public:
   virtual void print(std::ostream &OS) const { OS << "\"" << Value << "\""; }
 };
 
+/// CodeInit - "[{...}]" - Represent a code fragment.
+///
+class CodeInit : public Init {
+  std::string Value;
+public:
+  CodeInit(const std::string &V) : Value(V) {}
+
+  virtual Init *convertInitializerTo(RecTy *Ty) {
+    return Ty->convertValue(this);
+  }
+
+  virtual void print(std::ostream &OS) const { OS << "[{" << Value << "}]"; }
+};
+
 /// ListInit - [AL, AH, CL] - Represent a list of defs
 ///
 class ListInit : public Init {
index 34a2818b2f2b347b787c54ea4446f22715e5dd63..a98a88170eaba5b23f2789ddc3b6521000ad14b0 100644 (file)
@@ -132,19 +132,21 @@ int yywrap() {
 
 %}
 
-Comment     \/\/.*
+Comment      \/\/.*
 
-Identifier  [a-zA-Z_][0-9a-zA-Z_]*
-Integer     [-+]?[0-9]+|0x[0-9a-fA-F]+|0b[01]+
-StringVal   \"[^"]*\"
-IncludeStr  include[ \t\n]+\"[^"]*\"
+Identifier   [a-zA-Z_][0-9a-zA-Z_]*
+Integer      [-+]?[0-9]+|0x[0-9a-fA-F]+|0b[01]+
+CodeFragment \[\{([^}]+|\}[^\]])*\}\]
+StringVal    \"[^"]*\"
+IncludeStr   include[ \t\n]+\"[^"]*\"
 
 %%
 
 {Comment}      { /* Ignore comments */ }
 
 {IncludeStr}   { HandleInclude(yytext); }
-
+{CodeFragment} { Filelval.StrVal = new std::string(yytext+2, yytext+yyleng-2);
+                 return CODEFRAGMENT; }
 
 int            { return INT; }
 bit            { return BIT; }
index e906a5e4e38d292e014e66a0afe75f084991a0e7..d248242b2d6be08ad7f40fc0c9c277b4db854eff 100644 (file)
@@ -155,7 +155,7 @@ static void addSubClass(Record *SC, const std::vector<Init*> &TemplateArgs) {
 
 %token INT BIT STRING BITS LIST CODE CLASS DEF FIELD SET IN
 %token <IntVal>      INTVAL
-%token <StrVal>      ID STRVAL
+%token <StrVal>      ID STRVAL CODEFRAGMENT
 
 %type <Ty>           Type
 %type <RecPtr>       DefList DefListNE
@@ -217,6 +217,9 @@ Value : INTVAL {
   } | STRVAL {
     $$ = new StringInit(*$1);
     delete $1;
+  } | CODEFRAGMENT {
+    $$ = new CodeInit(*$1);
+    delete $1;
   } | '?' {
     $$ = new UnsetInit();
   } | '{' ValueList '}' {
index 308047a2b432e94deb4f531a9e25838309e2ca17..3c07114f2e55fbf7448a1681efc7d3d077601f44 100644 (file)
@@ -18,6 +18,7 @@ class BitInit;
 class BitsInit;
 class IntInit;
 class StringInit;
+class CodeInit;
 class ListInit;
 class DefInit;
 class TypedInit;
@@ -39,6 +40,7 @@ struct RecTy {
   virtual Init *convertValue(   IntInit *II) { return 0; }
   virtual Init *convertValue(StringInit *SI) { return 0; }
   virtual Init *convertValue(  ListInit *LI) { return 0; }
+  virtual Init *convertValue(  CodeInit *CI) { return 0; }
   virtual Init *convertValue(VarBitInit *VB) { return 0; }
   virtual Init *convertValue(   DefInit *DI) { return 0; }
   virtual Init *convertValue( TypedInit *TI) { return 0; }
@@ -135,6 +137,7 @@ public:
 ///
 struct CodeRecTy : public RecTy {
   Init *convertValue(UnsetInit *UI) { return (Init*)UI; }
+  Init *convertValue( CodeInit *CI) { return (Init*)CI; }
 
   void print(std::ostream &OS) const { OS << "code"; }
 };
@@ -321,6 +324,20 @@ public:
   virtual void print(std::ostream &OS) const { OS << "\"" << Value << "\""; }
 };
 
+/// CodeInit - "[{...}]" - Represent a code fragment.
+///
+class CodeInit : public Init {
+  std::string Value;
+public:
+  CodeInit(const std::string &V) : Value(V) {}
+
+  virtual Init *convertInitializerTo(RecTy *Ty) {
+    return Ty->convertValue(this);
+  }
+
+  virtual void print(std::ostream &OS) const { OS << "[{" << Value << "}]"; }
+};
+
 /// ListInit - [AL, AH, CL] - Represent a list of defs
 ///
 class ListInit : public Init {