vhdl_element_parser.h
120 lines
| 5.2 KiB
| text/x-c
|
CLexer
/ vhdlparser / vhdl_element_parser.h
r2 | #ifndef ELEMENTPARSER_H | |||
#define ELEMENTPARSER_H | ||||
#include "scanner/vhdl_ast_node.h" | ||||
#include <QStack> | ||||
#include <QString> | ||||
#include <QDebug> | ||||
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<VHDL_Tools::VHDL_AST_Node *> openBlocksContext, VHDL_Tools::VHDL_AST_Node_type type); | ||||
int closeAndMatchBlock(VHDL_Tools::VHDL_AST_Node** currentNode,QStack<VHDL_Tools::VHDL_AST_Node*>* openBlocksContext,QList<VHDL_Tools::VHDL_AST_Node_type>skipTypes,bool skipOpenType=false,bool endWithSemicolon=false); | ||||
inline int parse_Clause(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *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 " <<currentNode->line <<" column "<<currentNode->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 " <<currentNode->line <<" column "<<currentNode->column<<"\n"; | ||||
*rootNode=currentNode; | ||||
return -1; | ||||
} | ||||
*rootNode=currentNode; | ||||
closeAndMatchBlock(rootNode,openBlocksContext,QList<VHDL_Tools::VHDL_AST_Node_type>()); | ||||
return 0; | ||||
} | ||||
int parse_Alias(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_Architecture(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_Assignment(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_AssociationList(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_Attribute(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_body(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_Block(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_Case(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_Component(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_ConstrainedRange(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_DeclarativeBlock(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext,bool mustHaveBegin=true); | ||||
int parse_Entity(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_File(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_Function(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_InterfaceList(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_Package(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_Port_or_Generic(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_Procedure(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_Process(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_Record(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_Report(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_Signal_or_Constant(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_Subtype(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_Type(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_Units(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_Wait(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
int parse_When_case(VHDL_AST_Node **rootNode, QStack<VHDL_AST_Node *> *openBlocksContext); | ||||
} | ||||
#endif // ELEMENTPARSER_H | ||||