author | mjsousa |
Fri, 04 Apr 2014 16:21:55 +0100 | |
changeset 888 | 4893e6b11b25 |
parent 886 | 111414d79ecd |
child 919 | 8da635655f37 |
permissions | -rw-r--r-- |
70 | 1 |
/* |
279
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
267
diff
changeset
|
2 |
* matiec - a compiler for the programming languages defined in IEC 61131-3 |
70 | 3 |
* |
279
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
267
diff
changeset
|
4 |
* Copyright (C) 2003-2011 Mario de Sousa (msousa@fe.up.pt) |
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
267
diff
changeset
|
5 |
* Copyright (C) 2007-2011 Laurent Bessard and Edouard Tisserant |
70 | 6 |
* |
279
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
267
diff
changeset
|
7 |
* This program is free software: you can redistribute it and/or modify |
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
267
diff
changeset
|
8 |
* it under the terms of the GNU General Public License as published by |
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
267
diff
changeset
|
9 |
* the Free Software Foundation, either version 3 of the License, or |
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
267
diff
changeset
|
10 |
* (at your option) any later version. |
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
267
diff
changeset
|
11 |
* |
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
267
diff
changeset
|
12 |
* This program is distributed in the hope that it will be useful, |
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
267
diff
changeset
|
13 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
267
diff
changeset
|
14 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
267
diff
changeset
|
15 |
* GNU General Public License for more details. |
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
267
diff
changeset
|
16 |
* |
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
267
diff
changeset
|
17 |
* You should have received a copy of the GNU General Public License |
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
267
diff
changeset
|
18 |
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
267
diff
changeset
|
19 |
* |
70 | 20 |
* |
21 |
* This code is made available on the understanding that it will not be |
|
22 |
* used in safety-critical situations without a full and competent review. |
|
23 |
*/ |
|
24 |
||
139
668a54686827
added missing includes on some platform (gentoo/gcc-4.3.1)
etisserant
parents:
118
diff
changeset
|
25 |
#include <string.h> |
70 | 26 |
|
27 |
||
28 |
||
29 |
||
149 | 30 |
typedef struct |
31 |
{ |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
32 |
symbol_c *param_name; |
149 | 33 |
symbol_c *param_value; |
34 |
symbol_c *param_type; |
|
35 |
function_param_iterator_c::param_direction_t param_direction; |
|
36 |
} FUNCTION_PARAM; |
|
37 |
||
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
38 |
#define DECLARE_PARAM_LIST()\ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
39 |
std::list<FUNCTION_PARAM*> param_list;\ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
40 |
std::list<FUNCTION_PARAM*>::iterator pt;\ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
41 |
FUNCTION_PARAM *param; |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
42 |
|
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
43 |
#define ADD_PARAM_LIST(name, value, type, direction)\ |
149 | 44 |
param = new FUNCTION_PARAM;\ |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
45 |
param->param_name = name;\ |
149 | 46 |
param->param_value = value;\ |
47 |
param->param_type = type;\ |
|
48 |
param->param_direction = direction;\ |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
49 |
param_list.push_back(param); |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
50 |
|
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
51 |
#define PARAM_LIST_ITERATOR() for(pt = param_list.begin(); pt != param_list.end(); pt++) |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
52 |
|
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
53 |
#define PARAM_NAME (*pt)->param_name |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
54 |
#define PARAM_VALUE (*pt)->param_value |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
55 |
#define PARAM_TYPE (*pt)->param_type |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
56 |
#define PARAM_DIRECTION (*pt)->param_direction |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
57 |
|
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
58 |
#define CLEAR_PARAM_LIST()\ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
59 |
PARAM_LIST_ITERATOR()\ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
60 |
delete *pt;\ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
61 |
param_list.clear(); |
70 | 62 |
|
63 |
||
64 |
class generate_c_base_c: public iterator_visitor_c { |
|
65 |
||
66 |
protected: |
|
67 |
stage4out_c &s4o; |
|
68 |
||
69 |
private: |
|
70 |
/* Unlike programs that are mapped onto C++ classes, Function Blocks are mapped onto a data structure type |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
71 |
* and a separate function containing the code. This function is passed a pointer to an instance of the data |
70 | 72 |
* structure. This means that the code inside the functions must insert a pointer to the data structure whenever |
73 |
* it wishes to access a Function Block variable. |
|
74 |
* The variable_prefix_ variable will contain the correct string which needs to be prefixed to all variable accesses. |
|
75 |
* This string is set with the set_variable_prefix() member function. |
|
76 |
*/ |
|
77 |
const char *variable_prefix_; |
|
78 |
||
79 |
public: |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
80 |
generate_c_base_c(stage4out_c *s4o_ptr): s4o(*s4o_ptr) { |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
81 |
variable_prefix_ = NULL; |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
82 |
} |
70 | 83 |
~generate_c_base_c(void) {} |
84 |
||
85 |
void set_variable_prefix(const char *variable_prefix) {variable_prefix_ = variable_prefix;} |
|
160 | 86 |
const char *get_variable_prefix(void) {return variable_prefix_;} |
146
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
139
diff
changeset
|
87 |
bool is_variable_prefix_null(void) {return variable_prefix_ == NULL;} |
70 | 88 |
void print_variable_prefix(void) { |
89 |
if (variable_prefix_ != NULL) |
|
90 |
s4o.print(variable_prefix_); |
|
91 |
} |
|
92 |
||
877 | 93 |
void print_line_directive(symbol_c *symbol) { |
878 | 94 |
if (!generate_line_directives__) return; /* global variable generate_line_directives__ is defined in generate_c.cc */ |
877 | 95 |
s4o.print("#line "); |
96 |
s4o.print(symbol->first_line); |
|
97 |
s4o.print(" \""); |
|
98 |
s4o.print(symbol->first_file); |
|
99 |
s4o.print("\"\n"); |
|
100 |
} |
|
101 |
||
70 | 102 |
void *print_token(token_c *token, int offset = 0) { |
103 |
return s4o.printupper((token->value)+offset); |
|
104 |
} |
|
105 |
||
106 |
void *print_literal(symbol_c *type, symbol_c *value) { |
|
107 |
s4o.print("__"); |
|
108 |
type->accept(*this); |
|
109 |
s4o.print("_LITERAL("); |
|
110 |
value->accept(*this); |
|
111 |
s4o.print(")"); |
|
112 |
return NULL; |
|
113 |
} |
|
114 |
||
115 |
void *print_striped_token(token_c *token, int offset = 0) { |
|
116 |
std::string str = ""; |
|
312
29add821207d
Fix bug when generating integer with leading zero (octal value for C compiler)
laurent
parents:
308
diff
changeset
|
117 |
bool leading_zero = true; |
29add821207d
Fix bug when generating integer with leading zero (octal value for C compiler)
laurent
parents:
308
diff
changeset
|
118 |
for (unsigned int i = offset; i < strlen(token->value); i++) { |
29add821207d
Fix bug when generating integer with leading zero (octal value for C compiler)
laurent
parents:
308
diff
changeset
|
119 |
if (leading_zero && |
29add821207d
Fix bug when generating integer with leading zero (octal value for C compiler)
laurent
parents:
308
diff
changeset
|
120 |
(token->value[i] != '0' || |
29add821207d
Fix bug when generating integer with leading zero (octal value for C compiler)
laurent
parents:
308
diff
changeset
|
121 |
i == strlen(token->value) - 1 || |
29add821207d
Fix bug when generating integer with leading zero (octal value for C compiler)
laurent
parents:
308
diff
changeset
|
122 |
token->value[i + 1] == '.' |
29add821207d
Fix bug when generating integer with leading zero (octal value for C compiler)
laurent
parents:
308
diff
changeset
|
123 |
)) |
29add821207d
Fix bug when generating integer with leading zero (octal value for C compiler)
laurent
parents:
308
diff
changeset
|
124 |
leading_zero = false; |
29add821207d
Fix bug when generating integer with leading zero (octal value for C compiler)
laurent
parents:
308
diff
changeset
|
125 |
if (!leading_zero && token->value[i] != '_') |
70 | 126 |
str += token->value[i]; |
312
29add821207d
Fix bug when generating integer with leading zero (octal value for C compiler)
laurent
parents:
308
diff
changeset
|
127 |
} |
70 | 128 |
return s4o.printupper(str); |
129 |
} |
|
130 |
||
131 |
void *print_striped_binary_token(token_c *token, unsigned int offset = 0) { |
|
132 |
/* convert the binary value to hexadecimal format... */ |
|
133 |
unsigned char value, bit_mult; |
|
134 |
unsigned int i; |
|
135 |
int total_bits; |
|
136 |
char str[2] = {'A', '\0'}; /* since the s4o object is not prepared to print out one character at a time... */ |
|
137 |
||
138 |
s4o.print("0x"); |
|
139 |
||
140 |
total_bits = 0; |
|
141 |
for (i = offset; i < strlen(token->value); i++) |
|
142 |
if (token->value[i] != '_') |
|
143 |
total_bits++; |
|
144 |
||
145 |
value = 0; |
|
146 |
bit_mult = (unsigned char)1 << (((total_bits+3)%4)+1); |
|
147 |
for (i = offset; i < strlen(token->value); i++) { |
|
148 |
if (token->value[i] != '_') { |
|
149 |
bit_mult /= 2; |
|
150 |
value += bit_mult * ((token->value[i] == '0')? 0:1); |
|
151 |
if (bit_mult == 1) { |
|
308
833cb2eba36f
Fix conversion of binary digits to hex, when generating code.
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
152 |
str[0] = (value <= 9)? (char)'0' + value : (char)'A' + value - 10; |
70 | 153 |
s4o.print(str); |
154 |
bit_mult = 0x10; |
|
155 |
value = 0; |
|
156 |
} |
|
157 |
} |
|
158 |
} |
|
159 |
||
160 |
return NULL; |
|
161 |
} |
|
162 |
||
163 |
void *print_list(list_c *list, |
|
164 |
std::string pre_elem_str = "", |
|
165 |
std::string inter_elem_str = "", |
|
166 |
std::string post_elem_str = "", |
|
167 |
visitor_c *visitor = NULL) { |
|
168 |
if (visitor == NULL) visitor = this; |
|
169 |
||
170 |
if (list->n > 0) { |
|
171 |
//std::cout << "generate_c_base_c::print_list(n = " << list->n << ") 000\n"; |
|
172 |
s4o.print(pre_elem_str); |
|
173 |
list->elements[0]->accept(*visitor); |
|
174 |
} |
|
175 |
||
176 |
for(int i = 1; i < list->n; i++) { |
|
177 |
//std::cout << "generate_c_base_c::print_list " << i << "\n"; |
|
178 |
s4o.print(inter_elem_str); |
|
179 |
list->elements[i]->accept(*visitor); |
|
180 |
} |
|
181 |
||
182 |
if (list->n > 0) |
|
183 |
s4o.print(post_elem_str); |
|
184 |
||
185 |
return NULL; |
|
186 |
} |
|
187 |
||
188 |
||
189 |
void *print_binary_expression(symbol_c *l_exp, |
|
190 |
symbol_c *r_exp, |
|
191 |
const char *operation) { |
|
192 |
s4o.print("("); |
|
193 |
l_exp->accept(*this); |
|
194 |
s4o.print(operation); |
|
195 |
r_exp->accept(*this); |
|
196 |
s4o.print(")"); |
|
197 |
return NULL; |
|
198 |
} |
|
199 |
||
200 |
void *print_unary_expression(symbol_c *exp, |
|
201 |
const char *operation) { |
|
202 |
s4o.print(operation); |
|
203 |
s4o.print("("); |
|
204 |
exp->accept(*this); |
|
205 |
s4o.print(")"); |
|
206 |
return NULL; |
|
207 |
} |
|
208 |
||
209 |
void *print_binary_function(const char *function, |
|
210 |
symbol_c *l_exp, |
|
211 |
symbol_c *r_exp) { |
|
212 |
s4o.print(function); |
|
213 |
s4o.print("("); |
|
214 |
l_exp->accept(*this); |
|
215 |
s4o.print(", "); |
|
216 |
r_exp->accept(*this); |
|
217 |
s4o.print(")"); |
|
218 |
return NULL; |
|
219 |
} |
|
220 |
||
221 |
void *print_compare_function(const char *function, |
|
222 |
symbol_c *compare_type, |
|
223 |
symbol_c *l_exp, |
|
224 |
symbol_c *r_exp) { |
|
225 |
s4o.print(function); |
|
226 |
compare_type->accept(*this); |
|
149 | 227 |
s4o.print("(__BOOL_LITERAL(TRUE), NULL, 2, "); |
70 | 228 |
l_exp->accept(*this); |
229 |
s4o.print(", "); |
|
230 |
r_exp->accept(*this); |
|
231 |
s4o.print(")"); |
|
232 |
return NULL; |
|
233 |
} |
|
234 |
||
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
235 |
void *print_check_function(symbol_c *type, |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
236 |
symbol_c *value, |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
237 |
symbol_c *fb_name = NULL, |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
238 |
bool temp = false) { |
854
13d0b67de111
Code cleanup: move datatype analysis to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
793
diff
changeset
|
239 |
if (!get_datatype_info_c::is_type_valid(type)) ERROR; |
13d0b67de111
Code cleanup: move datatype analysis to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
793
diff
changeset
|
240 |
bool is_subrange = get_datatype_info_c::is_subrange(type); |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
241 |
if (is_subrange) { |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
242 |
s4o.print("__CHECK_"); |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
243 |
type->accept(*this); |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
244 |
s4o.print("("); |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
245 |
} |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
246 |
if (fb_name != NULL) { |
240 | 247 |
s4o.print(GET_VAR); |
248 |
s4o.print("("); |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
249 |
print_variable_prefix(); |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
250 |
fb_name->accept(*this); |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
251 |
s4o.print("."); |
240 | 252 |
value->accept(*this); |
253 |
s4o.print(")"); |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
254 |
} |
240 | 255 |
else { |
256 |
if (temp) |
|
257 |
s4o.print(TEMP_VAR); |
|
258 |
value->accept(*this); |
|
259 |
} |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
260 |
if (is_subrange) |
240 | 261 |
s4o.print(")"); |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
262 |
return NULL; |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
263 |
} |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
264 |
|
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
258
diff
changeset
|
265 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
258
diff
changeset
|
266 |
/* 2.1.6 - Pragmas */ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
258
diff
changeset
|
267 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
258
diff
changeset
|
268 |
void *visit(enable_code_generation_pragma_c * symbol) {s4o.enable_output(); return NULL;} |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
258
diff
changeset
|
269 |
void *visit(disable_code_generation_pragma_c * symbol) {s4o.disable_output(); return NULL;} |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
258
diff
changeset
|
270 |
|
70 | 271 |
/* Do not use print_token() as it will change everything into uppercase */ |
634
736b36a83548
Added double curly braces for pragma (kept single curly braces for compatibility). Added macro def and undef surrounding pragma to simplify user code. Moved useless comment from generated code back to code generator.
Edouard Tisserant
parents:
594
diff
changeset
|
272 |
void *visit(pragma_c *symbol) { |
736b36a83548
Added double curly braces for pragma (kept single curly braces for compatibility). Added macro def and undef surrounding pragma to simplify user code. Moved useless comment from generated code back to code generator.
Edouard Tisserant
parents:
594
diff
changeset
|
273 |
s4o.print("#define GetFbVar(var,...) __GET_VAR(data__->var,__VA_ARGS__)\n"); |
736b36a83548
Added double curly braces for pragma (kept single curly braces for compatibility). Added macro def and undef surrounding pragma to simplify user code. Moved useless comment from generated code back to code generator.
Edouard Tisserant
parents:
594
diff
changeset
|
274 |
s4o.print(s4o.indent_spaces); |
886
111414d79ecd
Finish: Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents:
878
diff
changeset
|
275 |
s4o.print("#define SetFbVar(var,val,...) __SET_VAR(data__->,var,__VA_ARGS__,val)\n"); |
634
736b36a83548
Added double curly braces for pragma (kept single curly braces for compatibility). Added macro def and undef surrounding pragma to simplify user code. Moved useless comment from generated code back to code generator.
Edouard Tisserant
parents:
594
diff
changeset
|
276 |
s4o.print(symbol->value); |
736b36a83548
Added double curly braces for pragma (kept single curly braces for compatibility). Added macro def and undef surrounding pragma to simplify user code. Moved useless comment from generated code back to code generator.
Edouard Tisserant
parents:
594
diff
changeset
|
277 |
s4o.print("\n"); |
736b36a83548
Added double curly braces for pragma (kept single curly braces for compatibility). Added macro def and undef surrounding pragma to simplify user code. Moved useless comment from generated code back to code generator.
Edouard Tisserant
parents:
594
diff
changeset
|
278 |
s4o.print(s4o.indent_spaces); |
736b36a83548
Added double curly braces for pragma (kept single curly braces for compatibility). Added macro def and undef surrounding pragma to simplify user code. Moved useless comment from generated code back to code generator.
Edouard Tisserant
parents:
594
diff
changeset
|
279 |
s4o.print("#undef GetFbVar\n"); |
736b36a83548
Added double curly braces for pragma (kept single curly braces for compatibility). Added macro def and undef surrounding pragma to simplify user code. Moved useless comment from generated code back to code generator.
Edouard Tisserant
parents:
594
diff
changeset
|
280 |
s4o.print(s4o.indent_spaces); |
736b36a83548
Added double curly braces for pragma (kept single curly braces for compatibility). Added macro def and undef surrounding pragma to simplify user code. Moved useless comment from generated code back to code generator.
Edouard Tisserant
parents:
594
diff
changeset
|
281 |
s4o.print("#undef SetFbVar\n"); |
736b36a83548
Added double curly braces for pragma (kept single curly braces for compatibility). Added macro def and undef surrounding pragma to simplify user code. Moved useless comment from generated code back to code generator.
Edouard Tisserant
parents:
594
diff
changeset
|
282 |
return NULL; |
736b36a83548
Added double curly braces for pragma (kept single curly braces for compatibility). Added macro def and undef surrounding pragma to simplify user code. Moved useless comment from generated code back to code generator.
Edouard Tisserant
parents:
594
diff
changeset
|
283 |
} |
70 | 284 |
|
285 |
||
286 |
/***************************/ |
|
287 |
/* B 0 - Programming Model */ |
|
288 |
/***************************/ |
|
289 |
/* leave for derived classes... */ |
|
290 |
||
291 |
||
292 |
||
293 |
/*************************/ |
|
294 |
/* B.1 - Common elements */ |
|
295 |
/*************************/ |
|
296 |
/*******************************************/ |
|
297 |
/* B 1.1 - Letters, digits and identifiers */ |
|
298 |
/*******************************************/ |
|
299 |
void *visit(identifier_c *symbol) {return print_token(symbol);} |
|
300 |
||
301 |
/*********************/ |
|
302 |
/* B 1.2 - Constants */ |
|
303 |
/*********************/ |
|
304 |
/* originally empty... */ |
|
305 |
||
306 |
/******************************/ |
|
307 |
/* B 1.2.1 - Numeric Literals */ |
|
308 |
/******************************/ |
|
309 |
void *visit(real_c *symbol) {return print_striped_token(symbol);} |
|
310 |
void *visit(integer_c *symbol) {return print_striped_token(symbol);} |
|
311 |
void *visit(binary_integer_c *symbol) {return print_striped_binary_token(symbol, 2);} |
|
312 |
void *visit(octal_integer_c *symbol) {s4o.print("0"); return print_striped_token(symbol, 2);} |
|
313 |
void *visit(hex_integer_c *symbol) {s4o.print("0x"); return print_striped_token(symbol, 3);} |
|
314 |
||
257 | 315 |
void *visit(neg_real_c *symbol) { |
316 |
s4o.print("-"); |
|
317 |
symbol->exp->accept(*this); |
|
318 |
return NULL; |
|
319 |
} |
|
320 |
||
321 |
void *visit(neg_integer_c *symbol) { |
|
322 |
s4o.print("-"); |
|
323 |
symbol->exp->accept(*this); |
|
324 |
return NULL; |
|
325 |
} |
|
326 |
||
70 | 327 |
void *visit(integer_literal_c *symbol) {return print_literal(symbol->type, symbol->value);} |
328 |
void *visit(real_literal_c *symbol) {return print_literal(symbol->type, symbol->value);} |
|
329 |
void *visit(bit_string_literal_c *symbol) {return print_literal(symbol->type, symbol->value);} |
|
257 | 330 |
void *visit(boolean_literal_c *symbol) { |
331 |
if (NULL != symbol->type) |
|
332 |
return print_literal(symbol->type, symbol->value); |
|
333 |
else { |
|
334 |
bool_type_name_c bool_type; |
|
335 |
return print_literal(&bool_type, symbol->value); |
|
336 |
} |
|
337 |
} |
|
70 | 338 |
|
339 |
/* helper class for boolean_literal_c */ |
|
340 |
void *visit(boolean_true_c *symbol) {s4o.print("TRUE"); return NULL;} |
|
341 |
void *visit(boolean_false_c *symbol) {s4o.print("FALSE"); return NULL;} |
|
342 |
||
98 | 343 |
void *visit(neg_expression_c *symbol) { |
344 |
s4o.print("-"); |
|
345 |
symbol->exp->accept(*this); |
|
346 |
return NULL; |
|
347 |
} |
|
348 |
||
70 | 349 |
/*******************************/ |
350 |
/* B.1.2.2 Character Strings */ |
|
351 |
/*******************************/ |
|
352 |
void *visit(double_byte_character_string_c *symbol) { |
|
353 |
// TO DO ... |
|
354 |
ERROR; |
|
355 |
return print_token(symbol); |
|
356 |
} |
|
357 |
||
358 |
void *visit(single_byte_character_string_c *symbol) { |
|
359 |
std::string str = ""; |
|
360 |
unsigned int count = 0; |
|
361 |
str += '"'; |
|
362 |
/* we ignore the first and last bytes, they will be the character ' */ |
|
363 |
for (unsigned int i = 1; i < strlen(symbol->value) - 1; i++) { |
|
364 |
char c = symbol->value[i]; |
|
365 |
if ((c == '\\') || (c == '"')) |
|
366 |
{str += '\\'; str += c; count ++; continue;} |
|
367 |
if (c != '$') |
|
368 |
{str += c; count++; continue;} |
|
369 |
/* this should be safe, since the code has passed the syntax parser!! */ |
|
370 |
c = symbol->value[++i]; |
|
371 |
switch (c) { |
|
372 |
case '$': |
|
373 |
case '\'': |
|
374 |
{str += c; count++; continue;} |
|
375 |
case 'L': |
|
376 |
case 'l': |
|
377 |
{str += "\x0A"; /* LF */; count++; continue;} |
|
378 |
case 'N': |
|
379 |
case 'n': |
|
380 |
{str += "\\x0A"; /* NL */; count++; continue;} |
|
381 |
case 'P': |
|
382 |
case 'p': |
|
383 |
{str += "\\f"; /* FF */; count++; continue;} |
|
384 |
case 'R': |
|
385 |
case 'r': |
|
386 |
{str += "\\r"; /* CR */; count++; continue;} |
|
387 |
case 'T': |
|
388 |
case 't': |
|
389 |
{str += "\\t"; /* tab */; count++; continue;} |
|
390 |
default: { |
|
391 |
if (isxdigit(c)) { |
|
392 |
/* this should be safe, since the code has passed the syntax parser!! */ |
|
393 |
char c2 = symbol->value[++i]; |
|
394 |
if (isxdigit(c2)) { |
|
395 |
str += '\\'; str += 'x'; str += c; str += c2; |
|
396 |
count++; continue; |
|
397 |
} |
|
398 |
} |
|
399 |
} |
|
400 |
/* otherwise we have an invalid string!! */ |
|
401 |
/* This should not have got through the syntax parser! */ |
|
402 |
ERROR; |
|
403 |
} /* switch() */ |
|
404 |
} /* for() */ |
|
405 |
||
406 |
str += '"'; |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
407 |
s4o.print("__STRING_LITERAL("); |
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
547
diff
changeset
|
408 |
s4o.print(count); |
70 | 409 |
s4o.print(","); |
410 |
s4o.print(str); |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
202
diff
changeset
|
411 |
s4o.print(")"); |
70 | 412 |
return NULL; |
413 |
} |
|
414 |
||
415 |
||
416 |
/***************************/ |
|
417 |
/* B 1.2.3 - Time Literals */ |
|
418 |
/***************************/ |
|
419 |
||
420 |
/************************/ |
|
421 |
/* B 1.2.3.1 - Duration */ |
|
422 |
/************************/ |
|
423 |
/* The following output is actually the parameters to the constructor of the TIME class! */ |
|
424 |
||
425 |
/* SYM_REF0(neg_time_c) */ |
|
426 |
void *visit(neg_time_c *symbol) {s4o.print("-1"); /* negative time value */; return NULL;} |
|
427 |
||
428 |
||
429 |
/* SYM_REF2(duration_c, neg, interval) */ |
|
430 |
void *visit(duration_c *symbol) { |
|
431 |
TRACE("duration_c"); |
|
432 |
s4o.print("__time_to_timespec("); |
|
547
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
433 |
|
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
434 |
if (NULL == symbol->neg) s4o.print("1"); /* positive time value */ |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
435 |
else symbol->neg->accept(*this); /* this will print '-1' :-) */ |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
436 |
|
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
437 |
s4o.print(", "); |
70 | 438 |
symbol->interval->accept(*this); |
439 |
s4o.print(")"); |
|
440 |
return NULL; |
|
441 |
} |
|
442 |
||
443 |
||
444 |
/* SYM_TOKEN(fixed_point_c) */ |
|
312
29add821207d
Fix bug when generating integer with leading zero (octal value for C compiler)
laurent
parents:
308
diff
changeset
|
445 |
void *visit(fixed_point_c *symbol) {return print_striped_token(symbol);} |
70 | 446 |
|
547
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
447 |
/* SYM_REF5(interval_c, days, hours, minutes, seconds, milliseconds) */ |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
448 |
void *visit(interval_c *symbol) { |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
449 |
TRACE("interval_c"); |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
450 |
/* s4o.print("0, 0, 0, 0, 0"); // milliseconds, seconds, minutes, hours, days */ |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
451 |
if (NULL == symbol->milliseconds) s4o.print("0"); /* milliseconds */ |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
452 |
else symbol->milliseconds->accept(*this); |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
453 |
s4o.print(", "); |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
454 |
|
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
455 |
if (NULL == symbol->seconds) s4o.print("0"); /* seconds */ |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
456 |
else symbol->seconds->accept(*this); |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
457 |
s4o.print(", "); |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
458 |
|
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
459 |
if (NULL == symbol->minutes) s4o.print("0"); /* minutes */ |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
460 |
else symbol->minutes->accept(*this); |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
461 |
s4o.print(", "); |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
462 |
|
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
463 |
if (NULL == symbol->hours) s4o.print("0"); /* hours */ |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
464 |
else symbol->hours->accept(*this); |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
465 |
s4o.print(", "); |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
466 |
|
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
467 |
if (NULL == symbol->days) s4o.print("0"); /* days */ |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
468 |
else symbol->days->accept(*this); |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
469 |
|
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
470 |
return NULL; |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
471 |
} |
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
312
diff
changeset
|
472 |
|
70 | 473 |
|
474 |
/************************************/ |
|
475 |
/* B 1.2.3.2 - Time of day and Date */ |
|
476 |
/************************************/ |
|
477 |
||
478 |
/* SYM_REF2(time_of_day_c, daytime, unused) */ |
|
479 |
void *visit(time_of_day_c *symbol) { |
|
480 |
TRACE("time_of_day_c"); |
|
481 |
s4o.print("__tod_to_timespec("); |
|
482 |
symbol->daytime->accept(*this); |
|
483 |
s4o.print(")"); |
|
484 |
return NULL; |
|
485 |
} |
|
486 |
||
487 |
||
488 |
/* SYM_REF4(daytime_c, day_hour, day_minute, day_second, unused) */ |
|
489 |
void *visit(daytime_c *symbol) { |
|
490 |
TRACE("daytime_c"); |
|
491 |
symbol->day_second->accept(*this); |
|
492 |
s4o.print(", "); |
|
493 |
symbol->day_minute->accept(*this); |
|
494 |
s4o.print(", "); |
|
495 |
symbol->day_hour->accept(*this); |
|
496 |
return NULL; |
|
497 |
} |
|
498 |
||
499 |
||
500 |
/* SYM_REF2(date_c, date_literal, unused) */ |
|
501 |
void *visit(date_c *symbol) { |
|
502 |
TRACE("date_c"); |
|
503 |
s4o.print("__date_to_timespec("); |
|
504 |
symbol->date_literal->accept(*this); |
|
505 |
s4o.print(")"); |
|
506 |
return NULL; |
|
507 |
} |
|
508 |
||
509 |
||
510 |
/* SYM_REF4(date_literal_c, year, month, day, unused) */ |
|
511 |
void *visit(date_literal_c *symbol) { |
|
512 |
TRACE("date_literal_c"); |
|
513 |
symbol->day->accept(*this); |
|
514 |
s4o.print(", "); |
|
515 |
symbol->month->accept(*this); |
|
516 |
s4o.print(", "); |
|
517 |
symbol->year->accept(*this); |
|
518 |
return NULL; |
|
519 |
} |
|
520 |
||
521 |
||
522 |
/* SYM_REF2(date_and_time_c, date_literal, daytime) */ |
|
523 |
void *visit(date_and_time_c *symbol) { |
|
524 |
TRACE("date_and_time_c"); |
|
525 |
s4o.print("__dt_to_timespec("); |
|
526 |
symbol->daytime->accept(*this); |
|
527 |
s4o.print(", "); |
|
528 |
symbol->date_literal->accept(*this); |
|
529 |
s4o.print(")"); |
|
530 |
return NULL; |
|
531 |
} |
|
532 |
||
533 |
||
534 |
/**********************/ |
|
535 |
/* B.1.3 - Data types */ |
|
536 |
/**********************/ |
|
537 |
/***********************************/ |
|
538 |
/* B 1.3.1 - Elementary Data Types */ |
|
539 |
/***********************************/ |
|
257 | 540 |
void *visit(time_type_name_c *symbol) {s4o.print("TIME"); return NULL;} |
541 |
void *visit(bool_type_name_c *symbol) {s4o.print("BOOL"); return NULL;} |
|
542 |
void *visit(sint_type_name_c *symbol) {s4o.print("SINT"); return NULL;} |
|
543 |
void *visit(int_type_name_c *symbol) {s4o.print("INT"); return NULL;} |
|
544 |
void *visit(dint_type_name_c *symbol) {s4o.print("DINT"); return NULL;} |
|
545 |
void *visit(lint_type_name_c *symbol) {s4o.print("LINT"); return NULL;} |
|
546 |
void *visit(usint_type_name_c *symbol) {s4o.print("USINT"); return NULL;} |
|
547 |
void *visit(uint_type_name_c *symbol) {s4o.print("UINT"); return NULL;} |
|
548 |
void *visit(udint_type_name_c *symbol) {s4o.print("UDINT"); return NULL;} |
|
549 |
void *visit(ulint_type_name_c *symbol) {s4o.print("ULINT"); return NULL;} |
|
550 |
void *visit(real_type_name_c *symbol) {s4o.print("REAL"); return NULL;} |
|
551 |
void *visit(lreal_type_name_c *symbol) {s4o.print("LREAL"); return NULL;} |
|
552 |
void *visit(date_type_name_c *symbol) {s4o.print("DATE"); return NULL;} |
|
553 |
void *visit(tod_type_name_c *symbol) {s4o.print("TOD"); return NULL;} |
|
554 |
void *visit(dt_type_name_c *symbol) {s4o.print("DT"); return NULL;} |
|
555 |
void *visit(byte_type_name_c *symbol) {s4o.print("BYTE"); return NULL;} |
|
556 |
void *visit(word_type_name_c *symbol) {s4o.print("WORD"); return NULL;} |
|
557 |
void *visit(lword_type_name_c *symbol) {s4o.print("LWORD"); return NULL;} |
|
558 |
void *visit(dword_type_name_c *symbol) {s4o.print("DWORD"); return NULL;} |
|
559 |
void *visit(string_type_name_c *symbol) {s4o.print("STRING"); return NULL;} |
|
560 |
void *visit(wstring_type_name_c *symbol) {s4o.print("WSTRING"); return NULL;} |
|
561 |
||
562 |
void *visit(safetime_type_name_c *symbol) {s4o.print("TIME"); return NULL;} |
|
563 |
void *visit(safebool_type_name_c *symbol) {s4o.print("BOOL"); return NULL;} |
|
564 |
void *visit(safesint_type_name_c *symbol) {s4o.print("SINT"); return NULL;} |
|
565 |
void *visit(safeint_type_name_c *symbol) {s4o.print("INT"); return NULL;} |
|
566 |
void *visit(safedint_type_name_c *symbol) {s4o.print("DINT"); return NULL;} |
|
567 |
void *visit(safelint_type_name_c *symbol) {s4o.print("LINT"); return NULL;} |
|
568 |
void *visit(safeusint_type_name_c *symbol) {s4o.print("USINT"); return NULL;} |
|
569 |
void *visit(safeuint_type_name_c *symbol) {s4o.print("UINT"); return NULL;} |
|
570 |
void *visit(safeudint_type_name_c *symbol) {s4o.print("UDINT"); return NULL;} |
|
571 |
void *visit(safeulint_type_name_c *symbol) {s4o.print("ULINT"); return NULL;} |
|
572 |
void *visit(safereal_type_name_c *symbol) {s4o.print("REAL"); return NULL;} |
|
573 |
void *visit(safelreal_type_name_c *symbol) {s4o.print("LREAL"); return NULL;} |
|
574 |
void *visit(safedate_type_name_c *symbol) {s4o.print("DATE"); return NULL;} |
|
575 |
void *visit(safetod_type_name_c *symbol) {s4o.print("TOD"); return NULL;} |
|
576 |
void *visit(safedt_type_name_c *symbol) {s4o.print("DT"); return NULL;} |
|
577 |
void *visit(safebyte_type_name_c *symbol) {s4o.print("BYTE"); return NULL;} |
|
578 |
void *visit(safeword_type_name_c *symbol) {s4o.print("WORD"); return NULL;} |
|
579 |
void *visit(safelword_type_name_c *symbol) {s4o.print("LWORD"); return NULL;} |
|
580 |
void *visit(safedword_type_name_c *symbol) {s4o.print("DWORD"); return NULL;} |
|
581 |
void *visit(safestring_type_name_c *symbol) {s4o.print("STRING"); return NULL;} |
|
582 |
void *visit(safewstring_type_name_c *symbol) {s4o.print("WSTRING"); return NULL;} |
|
70 | 583 |
|
584 |
/********************************/ |
|
585 |
/* B.1.3.2 - Generic data types */ |
|
586 |
/********************************/ |
|
587 |
/* originally empty... */ |
|
588 |
||
589 |
/********************************/ |
|
590 |
/* B 1.3.3 - Derived data types */ |
|
591 |
/********************************/ |
|
592 |
/* leave for derived classes... */ |
|
593 |
||
860
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
594 |
|
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
595 |
/* enumerated_type_name '#' identifier */ |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
596 |
void *visit(enumerated_value_c *symbol) { |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
597 |
if (NULL == symbol->datatype) { |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
598 |
debug_c::print(symbol); |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
599 |
ERROR; |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
600 |
} |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
601 |
|
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
602 |
symbol_c *type_name = get_datatype_info_c::get_id(symbol->datatype); |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
603 |
if (NULL == type_name) { |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
604 |
ERROR_MSG("C code generator does not currently support anonymous enumerated data types."); |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
605 |
} |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
606 |
|
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
607 |
type_name->accept(*this); |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
608 |
s4o.print("__"); |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
609 |
symbol->value->accept(*this); |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
610 |
return NULL; |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
611 |
} |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
612 |
|
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
613 |
|
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
614 |
|
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
615 |
/* NOTE: visit(subrange_spec_init_c *) |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
616 |
* and visit(subrange_specification_c *) |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
617 |
* together simply print out the integer datatype |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
618 |
* on which the subrange is based. |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
619 |
* |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
620 |
* Future code clean-ups should delete these two |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
621 |
* visit mehotds, and make sure whoever calls them |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
622 |
* uses symbol->datatype instead! |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
623 |
*/ |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
624 |
/* subrange_specification ASSIGN signed_integer */ |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
625 |
void *visit(subrange_spec_init_c *symbol) { |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
626 |
TRACE("subrange_spec_init_c"); |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
627 |
symbol->subrange_specification->accept(*this); |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
628 |
return NULL; |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
629 |
} |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
630 |
|
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
631 |
/* integer_type_name '(' subrange')' */ |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
632 |
void *visit(subrange_specification_c *symbol) { |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
633 |
TRACE("subrange_specification_c"); |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
634 |
symbol->integer_type_name->accept(*this); |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
635 |
return NULL; |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
636 |
} |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
637 |
|
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
638 |
|
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
639 |
/* helper symbol for array_specification */ |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
640 |
/* array_subrange_list ',' subrange */ |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
641 |
void *visit(array_subrange_list_c *symbol) { |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
642 |
TRACE("array_subrange_list_c"); |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
643 |
print_list(symbol); |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
644 |
return NULL; |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
645 |
} |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
646 |
|
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
854
diff
changeset
|
647 |
|
70 | 648 |
/*********************/ |
649 |
/* B 1.4 - Variables */ |
|
650 |
/*********************/ |
|
651 |
void *visit(symbolic_variable_c *symbol) { |
|
652 |
TRACE("symbolic_variable_c"); |
|
653 |
this->print_variable_prefix(); |
|
654 |
symbol->var_name->accept(*this); |
|
655 |
return NULL; |
|
656 |
} |
|
657 |
||
658 |
/********************************************/ |
|
659 |
/* B.1.4.1 Directly Represented Variables */ |
|
660 |
/********************************************/ |
|
661 |
void *visit(direct_variable_c *symbol) { |
|
662 |
TRACE("direct_variable_c"); |
|
663 |
/* Do not use print_token() as it will change everything into uppercase */ |
|
664 |
return s4o.printlocation(symbol->value); |
|
665 |
} |
|
666 |
||
667 |
||
668 |
||
669 |
/*************************************/ |
|
670 |
/* B.1.4.2 Multi-element Variables */ |
|
671 |
/*************************************/ |
|
672 |
#if 0 |
|
673 |
/* subscripted_variable '[' subscript_list ']' */ |
|
674 |
SYM_REF2(array_variable_c, subscripted_variable, subscript_list) |
|
675 |
||
676 |
#endif |
|
677 |
||
678 |
/* record_variable '.' field_selector */ |
|
679 |
/* WARNING: input and/or output variables of function blocks |
|
680 |
* may be accessed as fields of a structured variable! |
|
681 |
* Code handling a structured_variable_c must take |
|
682 |
* this into account! |
|
683 |
*/ |
|
684 |
// SYM_REF2(structured_variable_c, record_variable, field_selector) |
|
685 |
void *visit(structured_variable_c *symbol) { |
|
686 |
TRACE("structured_variable_c"); |
|
687 |
||
688 |
symbol->record_variable->accept(*this); |
|
689 |
s4o.print("."); |
|
690 |
symbol->field_selector->accept(*this); |
|
691 |
return NULL; |
|
692 |
} |
|
693 |
||
694 |
/******************************************/ |
|
695 |
/* B 1.4.3 - Declaration & Initialisation */ |
|
696 |
/******************************************/ |
|
697 |
/* leave for derived classes... */ |
|
698 |
||
699 |
/**************************************/ |
|
700 |
/* B.1.5 - Program organization units */ |
|
701 |
/**************************************/ |
|
702 |
/***********************/ |
|
703 |
/* B 1.5.1 - Functions */ |
|
704 |
/***********************/ |
|
705 |
/* leave for derived classes... */ |
|
706 |
||
707 |
/*****************************/ |
|
708 |
/* B 1.5.2 - Function Blocks */ |
|
709 |
/*****************************/ |
|
710 |
/* leave for derived classes... */ |
|
711 |
||
712 |
/**********************/ |
|
713 |
/* B 1.5.3 - Programs */ |
|
714 |
/**********************/ |
|
715 |
/* leave for derived classes... */ |
|
716 |
||
717 |
/*********************************************/ |
|
718 |
/* B.1.6 Sequential function chart elements */ |
|
719 |
/*********************************************/ |
|
720 |
||
721 |
/********************************/ |
|
722 |
/* B 1.7 Configuration elements */ |
|
723 |
/********************************/ |
|
724 |
/* leave for derived classes... */ |
|
725 |
||
726 |
/****************************************/ |
|
727 |
/* B.2 - Language IL (Instruction List) */ |
|
728 |
/****************************************/ |
|
729 |
/***********************************/ |
|
730 |
/* B 2.1 Instructions and Operands */ |
|
731 |
/***********************************/ |
|
732 |
/* leave for derived classes... */ |
|
733 |
||
734 |
/*******************/ |
|
735 |
/* B 2.2 Operators */ |
|
736 |
/*******************/ |
|
737 |
/* leave for derived classes... */ |
|
738 |
||
739 |
||
740 |
/***************************************/ |
|
741 |
/* B.3 - Language ST (Structured Text) */ |
|
742 |
/***************************************/ |
|
743 |
/***********************/ |
|
744 |
/* B 3.1 - Expressions */ |
|
745 |
/***********************/ |
|
746 |
/* leave for derived classes... */ |
|
747 |
||
748 |
/********************/ |
|
749 |
/* B 3.2 Statements */ |
|
750 |
/********************/ |
|
751 |
/* leave for derived classes... */ |
|
752 |
||
753 |
/*********************************/ |
|
754 |
/* B 3.2.1 Assignment Statements */ |
|
755 |
/*********************************/ |
|
756 |
/* leave for derived classes... */ |
|
757 |
||
758 |
/*****************************************/ |
|
759 |
/* B 3.2.2 Subprogram Control Statements */ |
|
760 |
/*****************************************/ |
|
761 |
/* leave for derived classes... */ |
|
762 |
||
763 |
/********************************/ |
|
764 |
/* B 3.2.3 Selection Statements */ |
|
765 |
/********************************/ |
|
766 |
/* leave for derived classes... */ |
|
767 |
||
768 |
/********************************/ |
|
769 |
/* B 3.2.4 Iteration Statements */ |
|
770 |
/********************************/ |
|
771 |
/* leave for derived classes... */ |
|
772 |
||
177
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
160
diff
changeset
|
773 |
|
70 | 774 |
}; /* class generate_c_basic_c */ |
775 |
||
776 |
||
777 |
||
778 |
||
779 |
||
780 |
||
781 |
||
782 |
||
783 |
||
784 |
||
785 |
||
786 |
||
787 |
||
788 |