diff options
author | Chris Lattner <sabre@nondot.org> | 2005-04-19 01:11:03 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-04-19 01:11:03 +0000 |
commit | b9266f880a1978e60a0457743d873dd03c3f2034 (patch) | |
tree | c6c667f3d27721dfa5c2b4adb2fbc49f78224309 | |
parent | 1cbf3abbb8c716721b502da6d5ff75a9755b525a (diff) | |
download | llvm-b9266f880a1978e60a0457743d873dd03c3f2034.tar.gz llvm-b9266f880a1978e60a0457743d873dd03c3f2034.tar.bz2 llvm-b9266f880a1978e60a0457743d873dd03c3f2034.tar.xz |
Add initial lexer and parser support for shifting values. Every use of this
will lead to it being rejected though.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21335 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | utils/TableGen/FileLexer.l | 5 | ||||
-rw-r--r-- | utils/TableGen/FileParser.y | 19 | ||||
-rw-r--r-- | utils/TableGen/Record.h | 5 |
3 files changed, 29 insertions, 0 deletions
diff --git a/utils/TableGen/FileLexer.l b/utils/TableGen/FileLexer.l index 08daf2fc2e..a433587996 100644 --- a/utils/TableGen/FileLexer.l +++ b/utils/TableGen/FileLexer.l @@ -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); diff --git a/utils/TableGen/FileParser.y b/utils/TableGen/FileParser.y index 8781049956..e7d50322ef 100644 --- a/utils/TableGen/FileParser.y +++ b/utils/TableGen/FileParser.y @@ -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 */ { diff --git a/utils/TableGen/Record.h b/utils/TableGen/Record.h index e2b9c0e6ef..9c5166c0cc 100644 --- a/utils/TableGen/Record.h +++ b/utils/TableGen/Record.h @@ -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. |