|
|
#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
|
|
|
|