Add support for code fragments

llvm-svn: 7440
This commit is contained in:
Chris Lattner 2003-07-30 22:15:58 +00:00
parent 284136170e
commit 34d10a1aab
3 changed files with 29 additions and 7 deletions

View 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; }

View 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 '}' {

View 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 {