etisserant@0: /* etisserant@0: * (c) 2003 Mario de Sousa etisserant@0: * etisserant@0: * Offered to the public under the terms of the GNU General Public License etisserant@0: * as published by the Free Software Foundation; either version 2 of the etisserant@0: * License, or (at your option) any later version. etisserant@0: * etisserant@0: * This program is distributed in the hope that it will be useful, but etisserant@0: * WITHOUT ANY WARRANTY; without even the implied warranty of etisserant@0: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General etisserant@0: * Public License for more details. etisserant@0: * etisserant@0: * This code is made available on the understanding that it will not be etisserant@0: * used in safety-critical situations without a full and competent review. etisserant@0: */ etisserant@0: etisserant@0: /* etisserant@0: * An IEC 61131-3 IL and ST compiler. etisserant@0: * etisserant@0: * Based on the etisserant@0: * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10) etisserant@0: * etisserant@0: */ etisserant@0: etisserant@0: etisserant@0: /* etisserant@0: * Conversion of basic abstract syntax constructs. etisserant@0: * etisserant@0: * This is part of the 4th stage that generates etisserant@0: * a c++ source program equivalent to the IL and ST etisserant@0: * code. etisserant@0: */ etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: //#include /* required for NULL */ etisserant@0: //#include etisserant@0: //#include etisserant@0: etisserant@0: //#include "../../util/symtable.hh" etisserant@0: etisserant@0: //#include "generate_cc.hh" etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: class generate_cc_base_c: public iterator_visitor_c { etisserant@0: etisserant@0: protected: etisserant@0: stage4out_c &s4o; etisserant@0: etisserant@0: private: etisserant@0: /* Unlike programs that are mapped onto C++ classes, Function Blocks are mapped onto a data structure type etisserant@0: * and a separate function conatining the code. This function is passed a pointer to an instance of the data etisserant@0: * structure. This means that the code inside the functions must insert a pointer to the data structure whenever etisserant@0: * it wishes to access a Function Block variable. etisserant@0: * The variable_prefix_ variable will contain the correct string which needs to be prefixed to all variable accesses. etisserant@0: * This string is set with the set_variable_prefix() member function. etisserant@0: */ etisserant@0: const char *variable_prefix_; etisserant@0: etisserant@0: etisserant@0: etisserant@0: public: etisserant@0: generate_cc_base_c(stage4out_c *s4o_ptr): s4o(*s4o_ptr) {variable_prefix_ = NULL;} etisserant@0: ~generate_cc_base_c(void) {} etisserant@0: etisserant@0: void set_variable_prefix(const char *variable_prefix) {variable_prefix_ = variable_prefix;} etisserant@0: void print_variable_prefix(void) { etisserant@0: if (variable_prefix_ != NULL) etisserant@0: s4o.print(variable_prefix_); etisserant@0: } etisserant@0: etisserant@0: void *print_token(token_c *token, int offset = 0) { etisserant@0: return s4o.printupper((token->value)+offset); etisserant@0: } etisserant@0: etisserant@0: void *print_literal(symbol_c *type, symbol_c *value) { etisserant@0: s4o.print("("); etisserant@0: type->accept(*this); etisserant@0: s4o.print(")"); etisserant@0: value->accept(*this); etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: void *print_striped_token(token_c *token, int offset = 0) { etisserant@0: std::string str = ""; etisserant@0: for (unsigned int i = offset; i < strlen(token->value); i++) etisserant@0: if (token->value[i] != '_') etisserant@0: str += token->value[i]; etisserant@0: return s4o.printupper(str); etisserant@0: } etisserant@0: etisserant@0: void *print_striped_binary_token(token_c *token, unsigned int offset = 0) { etisserant@0: /* convert the binary value to hexadecimal format... */ etisserant@0: unsigned char value, bit_mult; etisserant@0: unsigned int i; etisserant@0: int total_bits; etisserant@0: char str[2] = {'A', '\0'}; /* since the s4o object is not prepared to print out one character at a time... */ etisserant@0: etisserant@0: s4o.print("0x"); etisserant@0: etisserant@0: total_bits = 0; etisserant@0: for (i = offset; i < strlen(token->value); i++) etisserant@0: if (token->value[i] != '_') etisserant@0: total_bits++; etisserant@0: etisserant@0: value = 0; etisserant@0: bit_mult = (unsigned char)1 << (((total_bits+3)%4)+1); etisserant@0: for (i = offset; i < strlen(token->value); i++) { etisserant@0: if (token->value[i] != '_') { etisserant@0: bit_mult /= 2; etisserant@0: value += bit_mult * ((token->value[i] == '0')? 0:1); etisserant@0: if (bit_mult == 1) { etisserant@0: str[0] = (value <= 9)? (char)'0' + value : (char)'A' + value; etisserant@0: s4o.print(str); etisserant@0: bit_mult = 0x10; etisserant@0: value = 0; etisserant@0: } etisserant@0: } etisserant@0: } etisserant@0: etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: void *print_list(list_c *list, etisserant@0: std::string pre_elem_str = "", etisserant@0: std::string inter_elem_str = "", etisserant@0: std::string post_elem_str = "", etisserant@0: visitor_c *visitor = NULL) { etisserant@0: if (visitor == NULL) visitor = this; etisserant@0: etisserant@0: if (list->n > 0) { etisserant@0: //std::cout << "generate_cc_base_c::print_list(n = " << list->n << ") 000\n"; etisserant@0: s4o.print(pre_elem_str); etisserant@0: list->elements[0]->accept(*visitor); etisserant@0: } etisserant@0: etisserant@0: for(int i = 1; i < list->n; i++) { etisserant@0: //std::cout << "generate_cc_base_c::print_list " << i << "\n"; etisserant@0: s4o.print(inter_elem_str); etisserant@0: list->elements[i]->accept(*visitor); etisserant@0: } etisserant@0: etisserant@0: if (list->n > 0) etisserant@0: s4o.print(post_elem_str); etisserant@0: etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: etisserant@0: void *print_binary_expression(symbol_c *l_exp, etisserant@0: symbol_c *r_exp, etisserant@0: const char *operation) { etisserant@0: s4o.print("("); etisserant@0: l_exp->accept(*this); etisserant@0: s4o.print(operation); etisserant@0: r_exp->accept(*this); etisserant@0: s4o.print(")"); etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: etisserant@0: void *print_unary_expression(symbol_c *exp, etisserant@0: const char *operation) { etisserant@0: s4o.print(operation); etisserant@0: s4o.print("("); etisserant@0: exp->accept(*this); etisserant@0: s4o.print(")"); etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: etisserant@0: /***************************/ etisserant@0: /* 2.1.6 - Pragmas */ etisserant@0: /***************************/ etisserant@0: /* Do not use print_token() as it will change everything into uppercase */ etisserant@0: void *visit(pragma_c *symbol) {return s4o.print(symbol->value);} etisserant@0: etisserant@0: etisserant@0: /***************************/ etisserant@0: /* B 0 - Programming Model */ etisserant@0: /***************************/ etisserant@0: /* leave for derived classes... */ etisserant@0: etisserant@0: etisserant@0: etisserant@0: /*************************/ etisserant@0: /* B.1 - Common elements */ etisserant@0: /*************************/ etisserant@0: /*******************************************/ etisserant@0: /* B 1.1 - Letters, digits and identifiers */ etisserant@0: /*******************************************/ etisserant@0: void *visit(identifier_c *symbol) {return print_token(symbol);} etisserant@0: etisserant@0: /*********************/ etisserant@0: /* B 1.2 - Constants */ etisserant@0: /*********************/ etisserant@0: /* originally empty... */ etisserant@0: etisserant@0: /******************************/ etisserant@0: /* B 1.2.1 - Numeric Literals */ etisserant@0: /******************************/ etisserant@0: void *visit(real_c *symbol) {return print_striped_token(symbol);} etisserant@0: void *visit(integer_c *symbol) {return print_striped_token(symbol);} etisserant@0: void *visit(binary_integer_c *symbol) {return print_striped_binary_token(symbol, 2);} etisserant@0: void *visit(octal_integer_c *symbol) {s4o.print("0"); return print_striped_token(symbol, 2);} etisserant@0: void *visit(hex_integer_c *symbol) {s4o.print("0x"); return print_striped_token(symbol, 3);} etisserant@0: etisserant@0: void *visit(numeric_literal_c *symbol) {return print_literal(symbol->type, symbol->value);} etisserant@0: void *visit(integer_literal_c *symbol) {return print_literal(symbol->type, symbol->value);} etisserant@0: void *visit(real_literal_c *symbol) {return print_literal(symbol->type, symbol->value);} etisserant@0: void *visit(bit_string_literal_c *symbol) {return print_literal(symbol->type, symbol->value);} etisserant@0: void *visit(boolean_literal_c *symbol) {return print_literal(symbol->type, symbol->value);} etisserant@0: etisserant@0: /* helper class for boolean_literal_c */ etisserant@0: void *visit(boolean_true_c *symbol) {s4o.print("TRUE"); return NULL;} etisserant@0: void *visit(boolean_false_c *symbol) {s4o.print("FALSE"); return NULL;} etisserant@0: etisserant@0: /*******************************/ etisserant@0: /* B.1.2.2 Character Strings */ etisserant@0: /*******************************/ etisserant@0: void *visit(double_byte_character_string_c *symbol) { etisserant@0: // TO DO ... etisserant@0: ERROR; etisserant@0: return print_token(symbol); etisserant@0: } etisserant@0: etisserant@0: void *visit(single_byte_character_string_c *symbol) { etisserant@0: std::string str = ""; etisserant@0: etisserant@0: str += '"'; etisserant@0: /* we ignore the first and last bytes, they will be the character ' */ etisserant@0: for (unsigned int i = 1; i < strlen(symbol->value) - 1; i++) { etisserant@0: char c = symbol->value[i]; etisserant@0: if ((c == '\\') || (c == '"')) etisserant@0: {str += '\\'; str += c; continue;} etisserant@0: if (c != '$') etisserant@0: {str += c; continue;} etisserant@0: /* this should be safe, since the code has passed the syntax parser!! */ etisserant@0: c = symbol->value[++i]; etisserant@0: switch (c) { etisserant@0: case '$': etisserant@0: case '\'': etisserant@0: {str += c; continue;} etisserant@0: case 'L': etisserant@0: case 'l': etisserant@0: {str += "\x0A"; /* LF */; continue;} etisserant@0: case 'N': etisserant@0: case 'n': etisserant@0: {str += "\\x0A"; /* NL */; continue;} etisserant@0: case 'P': etisserant@0: case 'p': etisserant@0: {str += "\\f"; /* FF */; continue;} etisserant@0: case 'R': etisserant@0: case 'r': etisserant@0: {str += "\\r"; /* CR */; continue;} etisserant@0: case 'T': etisserant@0: case 't': etisserant@0: {str += "\\t"; /* tab */; continue;} etisserant@0: default: { etisserant@0: if (isxdigit(c)) { etisserant@0: /* this should be safe, since the code has passed the syntax parser!! */ etisserant@0: char c2 = symbol->value[++i]; etisserant@0: if (isxdigit(c2)) { etisserant@0: str += '\\'; str += 'x'; str += c; str += c2; etisserant@0: continue; etisserant@0: } etisserant@0: } etisserant@0: } etisserant@0: /* otherwise we have an invalid string!! */ etisserant@0: /* This should not have got through the syntax parser! */ etisserant@0: ERROR; etisserant@0: } /* switch() */ etisserant@0: } /* for() */ etisserant@0: etisserant@0: str += '"'; etisserant@0: etisserant@0: s4o.print(str); etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: etisserant@0: /***************************/ etisserant@0: /* B 1.2.3 - Time Literals */ etisserant@0: /***************************/ etisserant@0: etisserant@0: /************************/ etisserant@0: /* B 1.2.3.1 - Duration */ etisserant@0: /************************/ etisserant@0: /* The following output is actually the parameters to the constructor of the TIME class! */ etisserant@0: etisserant@0: /* SYM_REF0(neg_time_c) */ etisserant@0: void *visit(neg_time_c *symbol) {s4o.print("-1"); /* negative time value */; return NULL;} etisserant@0: etisserant@0: etisserant@0: /* SYM_REF2(duration_c, neg, interval) */ etisserant@0: void *visit(duration_c *symbol) { etisserant@0: TRACE("duration_c"); etisserant@0: s4o.print("TIME("); etisserant@0: if (NULL == symbol->neg) etisserant@0: s4o.print("1"); /* positive time value */ etisserant@0: else etisserant@0: symbol->neg->accept(*this); /* this will print '-1' :-) */ etisserant@0: etisserant@0: s4o.print(", "); etisserant@0: etisserant@0: symbol->interval->accept(*this); etisserant@0: s4o.print(")"); etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: etisserant@0: /* SYM_TOKEN(fixed_point_c) */ etisserant@0: void *visit(fixed_point_c *symbol) {return print_token(symbol);} etisserant@0: etisserant@0: etisserant@0: /* SYM_REF2(days_c, days, hours) */ etisserant@0: void *visit(days_c *symbol) { etisserant@0: TRACE("days_c"); etisserant@0: if (NULL == symbol->hours) etisserant@0: s4o.print("0, 0, 0, 0"); /* milliseconds, seconds, minutes, hours */ etisserant@0: else etisserant@0: symbol->hours->accept(*this); etisserant@0: etisserant@0: s4o.print(", "); etisserant@0: etisserant@0: symbol->days->accept(*this); etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: etisserant@0: /* SYM_REF2(hours_c, hours, minutes) */ etisserant@0: void *visit(hours_c *symbol) { etisserant@0: TRACE("hours_c"); etisserant@0: if (NULL == symbol->minutes) etisserant@0: s4o.print("0, 0, 0"); /* milliseconds, seconds, minutes */ etisserant@0: else etisserant@0: symbol->minutes->accept(*this); etisserant@0: etisserant@0: s4o.print(", "); etisserant@0: etisserant@0: symbol->hours->accept(*this); etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: etisserant@0: /* SYM_REF2(minutes_c, minutes, seconds) */ etisserant@0: void *visit(minutes_c *symbol) { etisserant@0: TRACE("minutes_c"); etisserant@0: if (NULL == symbol->seconds) etisserant@0: s4o.print("0, 0"); /* milliseconds, seconds */ etisserant@0: else etisserant@0: symbol->seconds->accept(*this); etisserant@0: etisserant@0: s4o.print(", "); etisserant@0: etisserant@0: symbol->minutes->accept(*this); etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: etisserant@0: /* SYM_REF2(seconds_c, seconds, milliseconds) */ etisserant@0: void *visit(seconds_c *symbol) { etisserant@0: TRACE("seconds_c"); etisserant@0: if (NULL == symbol->milliseconds) etisserant@0: s4o.print("0"); /* milliseconds */ etisserant@0: else etisserant@0: symbol->milliseconds->accept(*this); etisserant@0: etisserant@0: s4o.print(", "); etisserant@0: etisserant@0: symbol->seconds->accept(*this); etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: etisserant@0: /* SYM_REF2(milliseconds_c, milliseconds, unused) */ etisserant@0: void *visit(milliseconds_c *symbol) { etisserant@0: TRACE("milliseconds_c"); etisserant@0: symbol->milliseconds->accept(*this); etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: /************************************/ etisserant@0: /* B 1.2.3.2 - Time of day and Date */ etisserant@0: /************************************/ etisserant@0: etisserant@0: /* SYM_REF2(time_of_day_c, daytime, unused) */ etisserant@0: void *visit(time_of_day_c *symbol) { etisserant@0: TRACE("time_of_day_c"); etisserant@0: s4o.print("TOD("); etisserant@0: symbol->daytime->accept(*this); etisserant@0: s4o.print(")"); etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: etisserant@0: /* SYM_REF4(daytime_c, day_hour, day_minute, day_second, unused) */ etisserant@0: void *visit(daytime_c *symbol) { etisserant@0: TRACE("daytime_c"); etisserant@0: symbol->day_second->accept(*this); etisserant@0: s4o.print(", "); etisserant@0: symbol->day_minute->accept(*this); etisserant@0: s4o.print(", "); etisserant@0: symbol->day_hour->accept(*this); etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: etisserant@0: /* SYM_REF2(date_c, date_literal, unused) */ etisserant@0: void *visit(date_c *symbol) { etisserant@0: TRACE("date_c"); etisserant@0: s4o.print("DATE("); etisserant@0: symbol->date_literal->accept(*this); etisserant@0: s4o.print(")"); etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: etisserant@0: /* SYM_REF4(date_literal_c, year, month, day, unused) */ etisserant@0: void *visit(date_literal_c *symbol) { etisserant@0: TRACE("date_literal_c"); etisserant@0: symbol->day->accept(*this); etisserant@0: s4o.print(", "); etisserant@0: symbol->month->accept(*this); etisserant@0: s4o.print(", "); etisserant@0: symbol->year->accept(*this); etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: etisserant@0: /* SYM_REF2(date_and_time_c, date_literal, daytime) */ etisserant@0: void *visit(date_and_time_c *symbol) { etisserant@0: TRACE("date_and_time_c"); etisserant@0: s4o.print("DT("); etisserant@0: symbol->daytime->accept(*this); etisserant@0: s4o.print(", "); etisserant@0: symbol->date_literal->accept(*this); etisserant@0: s4o.print(")"); etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: etisserant@0: /**********************/ etisserant@0: /* B.1.3 - Data types */ etisserant@0: /**********************/ etisserant@0: /***********************************/ etisserant@0: /* B 1.3.1 - Elementary Data Types */ etisserant@0: /***********************************/ etisserant@0: void *visit(time_type_name_c *symbol) {s4o.print("TIME"); return NULL;} etisserant@0: void *visit(bool_type_name_c *symbol) {s4o.print("BOOL"); return NULL;} etisserant@0: void *visit(sint_type_name_c *symbol) {s4o.print("SINT"); return NULL;} etisserant@0: void *visit(int_type_name_c *symbol) {s4o.print("INT"); return NULL;} etisserant@0: void *visit(dint_type_name_c *symbol) {s4o.print("DINT"); return NULL;} etisserant@0: void *visit(lint_type_name_c *symbol) {s4o.print("LINT"); return NULL;} etisserant@0: void *visit(usint_type_name_c *symbol) {s4o.print("USINT"); return NULL;} etisserant@0: void *visit(uint_type_name_c *symbol) {s4o.print("UINT"); return NULL;} etisserant@0: void *visit(udint_type_name_c *symbol) {s4o.print("UDINT"); return NULL;} etisserant@0: void *visit(ulint_type_name_c *symbol) {s4o.print("ULINT"); return NULL;} etisserant@0: void *visit(real_type_name_c *symbol) {s4o.print("REAL"); return NULL;} etisserant@0: void *visit(lreal_type_name_c *symbol) {s4o.print("LREAL"); return NULL;} etisserant@0: void *visit(date_type_name_c *symbol) {s4o.print("DATE"); return NULL;} etisserant@0: void *visit(tod_type_name_c *symbol) {s4o.print("TOD"); return NULL;} etisserant@0: void *visit(dt_type_name_c *symbol) {s4o.print("DT"); return NULL;} etisserant@0: void *visit(byte_type_name_c *symbol) {s4o.print("BYTE"); return NULL;} etisserant@0: void *visit(word_type_name_c *symbol) {s4o.print("WORD"); return NULL;} etisserant@0: void *visit(lword_type_name_c *symbol) {s4o.print("LWORD"); return NULL;} etisserant@0: void *visit(dword_type_name_c *symbol) {s4o.print("DWORD"); return NULL;} etisserant@0: void *visit(string_type_name_c *symbol) {s4o.print("STRING"); return NULL;} etisserant@0: void *visit(wstring_type_name_c *symbol) {s4o.print("WSTRING"); return NULL;} etisserant@0: etisserant@0: /********************************/ etisserant@0: /* B.1.3.2 - Generic data types */ etisserant@0: /********************************/ etisserant@0: /* originally empty... */ etisserant@0: etisserant@0: /********************************/ etisserant@0: /* B 1.3.3 - Derived data types */ etisserant@0: /********************************/ etisserant@0: /* leave for derived classes... */ etisserant@0: etisserant@0: /*********************/ etisserant@0: /* B 1.4 - Variables */ etisserant@0: /*********************/ etisserant@0: void *visit(symbolic_variable_c *symbol) { etisserant@0: TRACE("symbolic_variable_c"); etisserant@0: this->print_variable_prefix(); etisserant@0: symbol->var_name->accept(*this); etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: /********************************************/ etisserant@0: /* B.1.4.1 Directly Represented Variables */ etisserant@0: /********************************************/ etisserant@0: void *visit(direct_variable_c *symbol) { etisserant@0: TRACE("direct_variable_c"); etisserant@0: /* Do not use print_token() as it will change everything into uppercase */ etisserant@0: return s4o.print(symbol->value); etisserant@0: } etisserant@0: etisserant@0: etisserant@0: etisserant@0: /*************************************/ etisserant@0: /* B.1.4.2 Multi-element Variables */ etisserant@0: /*************************************/ etisserant@0: #if 0 etisserant@0: /* subscripted_variable '[' subscript_list ']' */ etisserant@0: SYM_REF2(array_variable_c, subscripted_variable, subscript_list) etisserant@0: etisserant@0: /* subscript_list ',' subscript */ etisserant@0: SYM_LIST(subscript_list_c) etisserant@0: #endif etisserant@0: etisserant@0: /* record_variable '.' field_selector */ etisserant@0: /* WARNING: input and/or output variables of function blocks etisserant@0: * may be accessed as fields of a structured variable! etisserant@0: * Code handling a structured_variable_c must take etisserant@0: * this into account! etisserant@0: */ etisserant@0: // SYM_REF2(structured_variable_c, record_variable, field_selector) etisserant@0: void *visit(structured_variable_c *symbol) { etisserant@0: TRACE("structured_variable_c"); etisserant@0: etisserant@0: symbol->record_variable->accept(*this); etisserant@0: s4o.print("."); etisserant@0: symbol->field_selector->accept(*this); etisserant@0: return NULL; etisserant@0: } etisserant@0: etisserant@0: /******************************************/ etisserant@0: /* B 1.4.3 - Declaration & Initialisation */ etisserant@0: /******************************************/ etisserant@0: /* leave for derived classes... */ etisserant@0: etisserant@0: /**************************************/ etisserant@0: /* B.1.5 - Program organization units */ etisserant@0: /**************************************/ etisserant@0: /***********************/ etisserant@0: /* B 1.5.1 - Functions */ etisserant@0: /***********************/ etisserant@0: /* leave for derived classes... */ etisserant@0: etisserant@0: /*****************************/ etisserant@0: /* B 1.5.2 - Function Blocks */ etisserant@0: /*****************************/ etisserant@0: /* leave for derived classes... */ etisserant@0: etisserant@0: /**********************/ etisserant@0: /* B 1.5.3 - Programs */ etisserant@0: /**********************/ etisserant@0: /* leave for derived classes... */ etisserant@0: etisserant@0: /*********************************************/ etisserant@0: /* B.1.6 Sequential function chart elements */ etisserant@0: /*********************************************/ etisserant@0: etisserant@0: /********************************/ etisserant@0: /* B 1.7 Configuration elements */ etisserant@0: /********************************/ etisserant@0: /* leave for derived classes... */ etisserant@0: etisserant@0: /****************************************/ etisserant@0: /* B.2 - Language IL (Instruction List) */ etisserant@0: /****************************************/ etisserant@0: /***********************************/ etisserant@0: /* B 2.1 Instructions and Operands */ etisserant@0: /***********************************/ etisserant@0: /* leave for derived classes... */ etisserant@0: etisserant@0: /*******************/ etisserant@0: /* B 2.2 Operators */ etisserant@0: /*******************/ etisserant@0: /* leave for derived classes... */ etisserant@0: etisserant@0: etisserant@0: /***************************************/ etisserant@0: /* B.3 - Language ST (Structured Text) */ etisserant@0: /***************************************/ etisserant@0: /***********************/ etisserant@0: /* B 3.1 - Expressions */ etisserant@0: /***********************/ etisserant@0: /* leave for derived classes... */ etisserant@0: etisserant@0: /********************/ etisserant@0: /* B 3.2 Statements */ etisserant@0: /********************/ etisserant@0: /* leave for derived classes... */ etisserant@0: etisserant@0: /*********************************/ etisserant@0: /* B 3.2.1 Assignment Statements */ etisserant@0: /*********************************/ etisserant@0: /* leave for derived classes... */ etisserant@0: etisserant@0: /*****************************************/ etisserant@0: /* B 3.2.2 Subprogram Control Statements */ etisserant@0: /*****************************************/ etisserant@0: /* leave for derived classes... */ etisserant@0: etisserant@0: /********************************/ etisserant@0: /* B 3.2.3 Selection Statements */ etisserant@0: /********************************/ etisserant@0: /* leave for derived classes... */ etisserant@0: etisserant@0: /********************************/ etisserant@0: /* B 3.2.4 Iteration Statements */ etisserant@0: /********************************/ etisserant@0: /* leave for derived classes... */ etisserant@0: etisserant@0: }; /* class generate_cc_basic_c */ etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: