From be88b50c010cb8f567efdf858d3ec6525b7fcdaf Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 30 Sep 2005 04:10:49 +0000 Subject: [PATCH] Refactor the grammar a bit to implement TableGen/ForwardRef.td git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23542 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/TableGen/FileParser.y | 66 +++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/utils/TableGen/FileParser.y b/utils/TableGen/FileParser.y index f5357340ca6..8fc704280f5 100644 --- a/utils/TableGen/FileParser.y +++ b/utils/TableGen/FileParser.y @@ -533,21 +533,40 @@ OptTemplateArgList : /*empty*/ | TemplateArgList; OptID : ID { $$ = $1; } | /*empty*/ { $$ = new std::string(); }; -ObjectBody : OptID { - static unsigned AnonCounter = 0; - if ($1->empty()) - *$1 = "anonymous."+utostr(AnonCounter++); - CurRec = new Record(*$1); - delete $1; - ParsingTemplateArgs = true; - } OptTemplateArgList ClassList { +ObjectName : OptID { + static unsigned AnonCounter = 0; + if ($1->empty()) + *$1 = "anonymous."+utostr(AnonCounter++); + CurRec = new Record(*$1); + delete $1; + ParsingTemplateArgs = true; +}; + +ClassName : ObjectName { + if (Records.getClass(CurRec->getName())) { + err() << "Class '" << CurRec->getName() << "' already defined!\n"; + exit(1); + } + Records.addClass(CurRec); +}; + +DefName : ObjectName { + // Ensure redefinition doesn't happen. + if (Records.getDef(CurRec->getName())) { + err() << "Def '" << CurRec->getName() << "' already defined!\n"; + exit(1); + } + Records.addDef(CurRec); +}; + +ObjectBody : OptTemplateArgList ClassList { ParsingTemplateArgs = false; - for (unsigned i = 0, e = $4->size(); i != e; ++i) { - addSubClass((*$4)[i].first, *(*$4)[i].second); + for (unsigned i = 0, e = $2->size(); i != e; ++i) { + addSubClass((*$2)[i].first, *(*$2)[i].second); // Delete the template arg values for the class - delete (*$4)[i].second; + delete (*$2)[i].second; } - delete $4; // Delete the class list... + delete $2; // Delete the class list... // Process any variables on the set stack... for (unsigned i = 0, e = LetStack.size(); i != e; ++i) @@ -560,29 +579,20 @@ ObjectBody : OptID { CurRec = 0; }; -ClassInst : CLASS ObjectBody { - if (Records.getClass($2->getName())) { - err() << "Class '" << $2->getName() << "' already defined!\n"; - exit(1); - } - Records.addClass($$ = $2); +ClassInst : CLASS ClassName ObjectBody { + $$ = $3; }; -DefInst : DEF ObjectBody { - $2->resolveReferences(); +DefInst : DEF DefName ObjectBody { + $3->resolveReferences(); // If ObjectBody has template arguments, it's an error. - if (!$2->getTemplateArgs().empty()) { - err() << "Def '" << $2->getName() + if (!$3->getTemplateArgs().empty()) { + err() << "Def '" << $3->getName() << "' is not permitted to have template arguments!\n"; exit(1); } - // Ensure redefinition doesn't happen. - if (Records.getDef($2->getName())) { - err() << "Def '" << $2->getName() << "' already defined!\n"; - exit(1); - } - Records.addDef($$ = $2); + $$ = $3; };