From e3a1d054483d6e2551a43232f2c968fc7ce523f2 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 30 Jul 2003 22:15:58 +0000 Subject: [PATCH] Add support for code fragments git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7440 91177308-0d34-0410-b5e6-96231b3b80d8 --- support/tools/TableGen/FileLexer.l | 14 ++++++++------ support/tools/TableGen/FileParser.y | 5 ++++- support/tools/TableGen/Record.h | 17 +++++++++++++++++ utils/TableGen/FileLexer.l | 14 ++++++++------ utils/TableGen/FileParser.y | 5 ++++- utils/TableGen/Record.h | 17 +++++++++++++++++ 6 files changed, 58 insertions(+), 14 deletions(-) diff --git a/support/tools/TableGen/FileLexer.l b/support/tools/TableGen/FileLexer.l index 34a2818b2f2..a98a88170ea 100644 --- a/support/tools/TableGen/FileLexer.l +++ b/support/tools/TableGen/FileLexer.l @@ -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; } diff --git a/support/tools/TableGen/FileParser.y b/support/tools/TableGen/FileParser.y index e906a5e4e38..d248242b2d6 100644 --- a/support/tools/TableGen/FileParser.y +++ b/support/tools/TableGen/FileParser.y @@ -155,7 +155,7 @@ static void addSubClass(Record *SC, const std::vector &TemplateArgs) { %token INT BIT STRING BITS LIST CODE CLASS DEF FIELD SET IN %token INTVAL -%token ID STRVAL +%token ID STRVAL CODEFRAGMENT %type Type %type DefList DefListNE @@ -217,6 +217,9 @@ Value : INTVAL { } | STRVAL { $$ = new StringInit(*$1); delete $1; + } | CODEFRAGMENT { + $$ = new CodeInit(*$1); + delete $1; } | '?' { $$ = new UnsetInit(); } | '{' ValueList '}' { diff --git a/support/tools/TableGen/Record.h b/support/tools/TableGen/Record.h index 308047a2b43..3c07114f2e5 100644 --- a/support/tools/TableGen/Record.h +++ b/support/tools/TableGen/Record.h @@ -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 { diff --git a/utils/TableGen/FileLexer.l b/utils/TableGen/FileLexer.l index 34a2818b2f2..a98a88170ea 100644 --- a/utils/TableGen/FileLexer.l +++ b/utils/TableGen/FileLexer.l @@ -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; } diff --git a/utils/TableGen/FileParser.y b/utils/TableGen/FileParser.y index e906a5e4e38..d248242b2d6 100644 --- a/utils/TableGen/FileParser.y +++ b/utils/TableGen/FileParser.y @@ -155,7 +155,7 @@ static void addSubClass(Record *SC, const std::vector &TemplateArgs) { %token INT BIT STRING BITS LIST CODE CLASS DEF FIELD SET IN %token INTVAL -%token ID STRVAL +%token ID STRVAL CODEFRAGMENT %type Type %type DefList DefListNE @@ -217,6 +217,9 @@ Value : INTVAL { } | STRVAL { $$ = new StringInit(*$1); delete $1; + } | CODEFRAGMENT { + $$ = new CodeInit(*$1); + delete $1; } | '?' { $$ = new UnsetInit(); } | '{' ValueList '}' { diff --git a/utils/TableGen/Record.h b/utils/TableGen/Record.h index 308047a2b43..3c07114f2e5 100644 --- a/utils/TableGen/Record.h +++ b/utils/TableGen/Record.h @@ -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 { -- 2.34.1