#ifndef ELEMENTPARSER_H #define ELEMENTPARSER_H #include "scanner/vhdl_ast_node.h" #include #include #include namespace VHDL_Tools { #define WALK_FORWARD( node , code ) \ while((node)->childs.count())\ {\ (node) = (node)->childs.first();\ if(Q_UNLIKELY((node)->type==comment))\ {\ while(((node)->type==comment) && (node)->childs.count())\ {\ (node) = (node)->childs.first(); /*get next node*/ \ (node)->move((node)->parent()->parent()); \ }\ }\ else\ {\ break;\ }\ }\ return (code); #define PARSE_COMMENT(node)\ WALK_FORWARD((node),0);\ (node)->move((node)->parent()->parent()); inline int walk_forward(VHDL_AST_Node **rootNode,int code) { VHDL_AST_Node *node = *rootNode; int retcode=code; while(node->childs.count()) { node = node->childs.first(); retcode=0; if(Q_UNLIKELY(node->type==comment)) { while((node->type==comment) && node->childs.count()) { node = node->childs.first(); /*get next node*/ node->moveWithoutChilds(node->parent()->parent()); } break; } else { break; } } *rootNode=node; return (retcode); } #define skipTokens(node,TokenType) while (((node)->type & 0x0FF )==(TokenType & 0x0FF)){walk_forward(&(node),-1);} bool isInContext(QStack openBlocksContext, VHDL_Tools::VHDL_AST_Node_type type); int closeAndMatchBlock(VHDL_Tools::VHDL_AST_Node** currentNode,QStack* openBlocksContext,QListskipTypes,bool skipOpenType=false,bool endWithSemicolon=false); inline int parse_Clause(VHDL_AST_Node **rootNode, QStack *openBlocksContext) { VHDL_AST_Node *currentNode=*rootNode; openBlocksContext->push(currentNode); do { walk_forward(¤tNode,-1); if(Q_UNLIKELY(currentNode->type!=identifier)) { qDebug()<<"Error expecting identifier, got "<< currentNode->a_value << " @line " <line <<" column "<column<<"\n"; *rootNode=currentNode; return -1; } walk_forward(¤tNode,-1); }while ((currentNode->type==comma) && currentNode->childs.count()); if(Q_UNLIKELY(currentNode->type!=semicolon)) { qDebug()<<"Error expecting \';\', got "<< currentNode->a_value << " @line " <line <<" column "<column<<"\n"; *rootNode=currentNode; return -1; } *rootNode=currentNode; closeAndMatchBlock(rootNode,openBlocksContext,QList()); return 0; } int parse_Alias(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_Architecture(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_Assignment(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_AssociationList(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_Attribute(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_body(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_Block(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_Case(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_Component(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_ConstrainedRange(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_DeclarativeBlock(VHDL_AST_Node **rootNode, QStack *openBlocksContext,bool mustHaveBegin=true); int parse_Entity(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_File(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_Function(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_InterfaceList(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_Package(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_Port_or_Generic(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_Procedure(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_Process(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_Record(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_Report(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_Signal_or_Constant(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_Subtype(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_Type(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_Units(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_Wait(VHDL_AST_Node **rootNode, QStack *openBlocksContext); int parse_When_case(VHDL_AST_Node **rootNode, QStack *openBlocksContext); } #endif // ELEMENTPARSER_H