diff options
author | Stefan Radomski <radomski@tk.informatik.tu-darmstadt.de> | 2014-12-01 11:02:40 (GMT) |
---|---|---|
committer | Stefan Radomski <radomski@tk.informatik.tu-darmstadt.de> | 2014-12-01 11:02:40 (GMT) |
commit | af6609592298c5e047e37e5ae2b47e6a8edbb677 (patch) | |
tree | e6e7da1cd34dccf3fb4f389e684b7c899b12987a /src/uscxml/plugins/datamodel/promela/PromelaParser.cpp | |
parent | d2e90c02e5ad19a5857e7c7fb87f248182fdb32d (diff) | |
download | uscxml-af6609592298c5e047e37e5ae2b47e6a8edbb677.zip uscxml-af6609592298c5e047e37e5ae2b47e6a8edbb677.tar.gz uscxml-af6609592298c5e047e37e5ae2b47e6a8edbb677.tar.bz2 |
Nested invokers and delayed events for PROMELA model checking
Diffstat (limited to 'src/uscxml/plugins/datamodel/promela/PromelaParser.cpp')
-rw-r--r-- | src/uscxml/plugins/datamodel/promela/PromelaParser.cpp | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/src/uscxml/plugins/datamodel/promela/PromelaParser.cpp b/src/uscxml/plugins/datamodel/promela/PromelaParser.cpp index 9fed02c..ada2c48 100644 --- a/src/uscxml/plugins/datamodel/promela/PromelaParser.cpp +++ b/src/uscxml/plugins/datamodel/promela/PromelaParser.cpp @@ -30,11 +30,12 @@ void promela__delete_buffer(YY_BUFFER_STATE, void*); YY_BUFFER_STATE promela__scan_string (const char * yystr , void*); -extern int promela_lex (PROMELA_STYPE* yylval_param, void* yyscanner); +extern int promela_lex (PROMELA_STYPE* yylval_param, PROMELA_LTYPE* yylloc_param, void* yyscanner); int promela_lex_init (void**); int promela_lex_destroy (void*); -void promela_error (uscxml::PromelaParser* ctx, void* yyscanner, const char* err) { +void promela_error (void* yylloc_param, uscxml::PromelaParser* ctx, void* yyscanner, const char* err) { + PROMELA_LTYPE* yylloc = (PROMELA_LTYPE*)yylloc_param; // mark as pending exception as we cannot throw from constructor and have the destructor called ERROR_EXECUTION(excEvent, err); ctx->pendingException = excEvent; @@ -120,26 +121,41 @@ PromelaParserNode::~PromelaParserNode() { delete operands.front(); operands.pop_front(); } + if (loc) + free(loc); } PromelaParserNode* PromelaParser::node(int type, int nrArgs, ...) { PromelaParserNode* newNode = new PromelaParserNode(); + newNode->type = type; va_list ap; va_start(ap, nrArgs); for(int i = 1; i <= nrArgs; i++) { newNode->operands.push_back(va_arg(ap, PromelaParserNode*)); + newNode->operands.back()->parent = newNode; } return newNode; } -PromelaParserNode* PromelaParser::value(int type, const char* value) { +PromelaParserNode* PromelaParser::value(int type, void* location, const char* value) { PromelaParserNode* newNode = new PromelaParserNode(); + + if (location) { + PROMELA_LTYPE* location_param = (PROMELA_LTYPE*)location; + newNode->loc = (PromelaParserNode::Location*)malloc(sizeof(PromelaParserNode::Location)); + newNode->loc->firstCol = location_param->first_column; + newNode->loc->firstLine = location_param->first_line; + newNode->loc->lastCol = location_param->last_column; + newNode->loc->lastLine = location_param->last_line; + } + newNode->value = value; newNode->type = type; return newNode; } + void PromelaParser::dump() { switch (type) { case PROMELA_EXPR: @@ -160,11 +176,13 @@ void PromelaParserNode::merge(PromelaParserNode* node) { for (std::list<PromelaParserNode*>::iterator iter = node->operands.begin(); iter != node->operands.end(); iter++) { operands.push_back(*iter); + (*iter)->parent = this; } node->operands.clear(); } void PromelaParserNode::push(PromelaParserNode* node) { + node->parent = this; operands.push_back(node); } @@ -173,7 +191,11 @@ void PromelaParserNode::dump(int indent) { for (int i = 0; i < indent; i++) { padding += " "; } - std::cout << padding << typeToDesc(type) << ": " << value << std::endl; + std::cout << padding << typeToDesc(type) << ": " << value; + if (loc != NULL) { + std::cout << " (" << loc->firstLine << ":" << loc->firstCol << ")-(" << loc->lastLine << ":" << loc->lastCol << ")"; + } + std::cout << std::endl; for (std::list<PromelaParserNode*>::iterator iter = operands.begin(); iter != operands.end(); iter++) { (*iter)->dump(indent + 1); |