1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-02-01 05:01:59 +01:00

Add initial lexer and parser support for shifting values. Every use of this

will lead to it being rejected though.

llvm-svn: 21335
This commit is contained in:
Chris Lattner 2005-04-19 01:11:03 +00:00
parent 3b1c0df702
commit 414d27b765
3 changed files with 29 additions and 0 deletions

View File

@ -195,6 +195,11 @@ field { return FIELD; }
let { return LET; }
in { return IN; }
!sra { return SRATOK; }
!srl { return SRLTOK; }
!shl { return SHLTOK; }
{Identifier} { Filelval.StrVal = new std::string(yytext, yytext+yyleng);
return ID; }
${Identifier} { Filelval.StrVal = new std::string(yytext+1, yytext+yyleng);

View File

@ -189,6 +189,7 @@ using namespace llvm;
};
%token INT BIT STRING BITS LIST CODE DAG CLASS DEF FIELD LET IN
%token SHLTOK SRATOK SRLTOK
%token <IntVal> INTVAL
%token <StrVal> ID VARNAME STRVAL CODEFRAGMENT
@ -308,6 +309,24 @@ Value : INTVAL {
exit(1);
}
delete $3;
} | SHLTOK '(' Value ',' Value ')' {
$$ = $3->getBinaryOp(Init::SHL, $5);
if ($$ == 0) {
err() << "Cannot shift values '" << *$3 << "' and '" << *$5 << "'!\n";
exit(1);
}
} | SRATOK '(' Value ',' Value ')' {
$$ = $3->getBinaryOp(Init::SRA, $5);
if ($$ == 0) {
err() << "Cannot shift values '" << *$3 << "' and '" << *$5 << "'!\n";
exit(1);
}
} | SRLTOK '(' Value ',' Value ')' {
$$ = $3->getBinaryOp(Init::SRL, $5);
if ($$ == 0) {
err() << "Cannot shift values '" << *$3 << "' and '" << *$5 << "'!\n";
exit(1);
}
};
OptVarName : /* empty */ {

View File

@ -463,6 +463,11 @@ struct Init {
virtual Init *getFieldInit(Record &R, const std::string &FieldName) const {
return 0;
}
enum BinaryOp { SHL, SRA, SRL };
virtual Init *getBinaryOp(BinaryOp Op, Init *RHS) {
return 0;
}
/// resolveReferences - This method is used by classes that refer to other
/// variables which may not be defined at the time they expression is formed.