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) + ")";
}
}
}
|