vhdl_file.cpp
87 lines
| 2.0 KiB
| text/x-c
|
CppLexer
/ vhdlparser / vhdl_file.cpp
r0 | #include "vhdl_file.h" | |||
r1 | #include <QDebug> | |||
r0 | ||||
VHDL_Tools::VHDL_File::VHDL_File() | ||||
{ | ||||
this->scanner = NULL; | ||||
} | ||||
r1 | ||||
bool VHDL_Tools::VHDL_File::parseFile(const QString &file, bool trashPreviousTree) | ||||
r0 | { | |||
std::ifstream in_file( file.toStdString().c_str() ); | ||||
if( ! in_file.good() ) return false; | ||||
r1 | if(scanner==NULL) | |||
r0 | { | |||
r1 | try | |||
{ | ||||
scanner = new VHDL_Tools::vhdl_Scanner( &in_file ,file); | ||||
} | ||||
catch( std::bad_alloc &ba ) | ||||
{ | ||||
std::cerr << "Failed to allocate scanner: (" << | ||||
ba.what() << ")\n"; | ||||
return false; | ||||
} | ||||
r0 | } | |||
r2 | qDebug()<<"Parsing File "<<file<<"\n"; | |||
r1 | scanner->newFile(&in_file,file,trashPreviousTree); | |||
r0 | while (scanner->scan()!=0); | |||
r1 | makeParseTree(scanner->getScanTree()); | |||
r0 | return false; | |||
} | ||||
r1 | ||||
VHDL_Tools::VHDL_AST_Node *VHDL_Tools::VHDL_File::getParseTree() | ||||
{ | ||||
return rootNode; | ||||
} | ||||
int VHDL_Tools::VHDL_File::makeParseTree(VHDL_AST_Node *rootNode) | ||||
{ | ||||
this->rootNode = rootNode; | ||||
VHDL_AST_Node *currentNode=rootNode; | ||||
QStack<VHDL_AST_Node*> openBlocks; | ||||
openBlocks.push(rootNode); | ||||
r2 | do | |||
{ | ||||
parseNext(¤tNode,&openBlocks); | ||||
}while(currentNode->childs.count()); | ||||
return 0; | ||||
} | ||||
int VHDL_Tools::VHDL_File::parseNext(VHDL_Tools::VHDL_AST_Node **rootNode, QStack<VHDL_Tools::VHDL_AST_Node *> *openBlocksContext) | ||||
{ | ||||
VHDL_AST_Node *currentNode=*rootNode; | ||||
if(currentNode) | ||||
r1 | { | |||
switch (currentNode->type) | ||||
{ | ||||
case entity: | ||||
r2 | parse_Entity(¤tNode,openBlocksContext); | |||
r1 | break; | |||
r2 | case architecture: | |||
parse_Architecture(¤tNode,openBlocksContext); | ||||
r1 | break; | |||
case clause: | ||||
r2 | parse_Clause(¤tNode,openBlocksContext); | |||
r1 | break; | |||
r2 | case package: | |||
parse_Package(¤tNode,openBlocksContext); | ||||
r1 | break; | |||
default: | ||||
r2 | walk_forward(¤tNode,0); | |||
r1 | break; | |||
} | ||||
} | ||||
r2 | *rootNode =currentNode; | |||
r1 | return 0; | |||
} | ||||
r2 | ||||