summaryrefslogtreecommitdiffstats
path: root/src/uscxml/plugins/datamodel/promela/PromelaParser.cpp
blob: 5bfc2a7bd792f532d1d75ae085673e16596e186a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include "PromelaParser.h"
#include "parser/promela.tab.hpp"

struct yy_buffer_state; \
typedef yy_buffer_state *YY_BUFFER_STATE; \
extern YY_BUFFER_STATE promela__scan_buffer(char *, size_t, void*); \
extern int promela_lex (PROMELA_STYPE* yylval_param, void* yyscanner); \
int promela_lex_init (void**); \
int promela_lex_destroy (void*); \

void promela_error (uscxml::PromelaParser* ctx, void* yyscanner, const char* err) {
	std::cout << err << std::endl;
}

namespace uscxml {

PromelaParser::PromelaParser(const std::string& expr) {
	input_length = expr.length() + 5;  // plus some zero terminators
	input = (char*) calloc(1, input_length);
	memcpy(input, expr.c_str(), expr.length());

	promela_lex_init(&scanner);
	//	promela_assign_set_extra(ast, &scanner);
	promela__scan_buffer(input, input_length, scanner);
	promela_parse(this, scanner);
}
PromelaParser::~PromelaParser() {
	free(input);
	promela_lex_destroy(scanner);
}

std::string PromelaParser::typeToDesc(int type) {
	switch(type) {
		case PLUS: return "PLUS";
		case MINUS: return "MINUS";
		case TIMES: return "TIMES";
		case DIVIDE: return "DIVIDE";
		case MODULO: return "MODULO";
		case BITAND: return "BITAND";
		case BITXOR: return "BITXOR";
		case BITOR: return "BITOR";
		case GT: return "GT";
		case LT: return "LT";
		case GE: return "GE";
		case LE: return "LE";
		case EQ: return "EQ";
		case NE: return "NE";
		case AND: return "AND";
		case OR: return "OR";
		case LSHIFT: return "LSHIFT";
		case RSHIFT: return "RSHIFT";
		case NEG: return "NEG";
		case ASGN: return "ASGN";
		default:
			return std::string("UNK(") + toStr(type) + ")";
	}
}

}