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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
/**
* @file
* @author 2016 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de)
* @copyright Simplified BSD
*
* @cond
* This program is free software: you can redistribute it and/or modify
* it under the terms of the FreeBSD license as published by the FreeBSD
* project.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the FreeBSD license along with this
* program. If not, see <http://www.opensource.org/licenses/bsd-license>.
* @endcond
*/
// bison -v c89.ypp && flex c89.l
#ifndef C89PARSER_H_FE8E7C3E
#define C89PARSER_H_FE8E7C3E
#include <string>
#include <list>
#include <stdlib.h>
//#include <stdarg.h>
#include <cstdarg>
#include "uscxml/messages/Event.h"
namespace uscxml {
class C89Parser;
class C89ParserNode {
public:
struct Location {
int firstLine;
int firstCol;
int lastLine;
int lastCol;
};
C89ParserNode() : type(0), parent(NULL), loc(NULL) {}
virtual ~C89ParserNode();
void merge(C89ParserNode* node);
void push(C89ParserNode* node);
void dump(int indent = 0);
static std::string typeToDesc(int type);
int type;
std::string value;
std::list<C89ParserNode*> operands;
C89ParserNode* parent;
Location* loc;
};
class C89Parser {
public:
enum Type {
C89_EXPR,
C89_DECL,
C89_STMNT
};
static std::string typeToDesc(int type);
C89Parser() : ast(NULL) {}
C89Parser(const std::string& expr);
C89Parser(const std::string& expr, int nrArgs, ...);
virtual ~C89Parser();
virtual C89ParserNode* node(int type, int nrArgs, ...);
virtual C89ParserNode* value(int type, void* location, const char* value);
void dump();
int parseInCompound;
C89ParserNode* ast;
Type type;
Event pendingException;
operator bool() const {
return ast != NULL;
}
protected:
void init(const std::string& expr);
void destroy();
void* buffer;
void* scanner;
char* input;
size_t input_length;
};
}
void c89_error (void* yylloc_param, uscxml::C89Parser* ctx, void* yyscanner, const char* err);
#endif /* end of include guard: C89PARSER_H_FE8E7C3E */
|