etisserant@0: /* msousa@261: * matiec - a compiler for the programming languages defined in IEC 61131-3 msousa@261: * Copyright (C) 2003-2011 Mario de Sousa (msousa@fe.up.pt) msousa@261: * msousa@261: * This program is free software: you can redistribute it and/or modify msousa@261: * it under the terms of the GNU General Public License as published by msousa@261: * the Free Software Foundation, either version 3 of the License, or msousa@261: * (at your option) any later version. msousa@261: * msousa@261: * This program is distributed in the hope that it will be useful, msousa@261: * but WITHOUT ANY WARRANTY; without even the implied warranty of msousa@261: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the msousa@261: * GNU General Public License for more details. msousa@261: * msousa@261: * You should have received a copy of the GNU General Public License msousa@261: * along with this program. If not, see . msousa@261: * 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: /* msousa@261: * An IEC 61131-3 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: * Declaration of the Abstract Syntax data structure components etisserant@0: */ etisserant@0: etisserant@0: /* etisserant@0: * ABSYNTAX.H etisserant@0: * etisserant@0: * This generates the parse tree structure used to bind the components etisserant@0: * identified by Bison in the correct syntax order. At the end of the etisserant@0: * Bison analysis the tree is walked in a sequential fashion generating etisserant@0: * the relavent code. etisserant@0: */ etisserant@0: etisserant@0: #ifndef _ABSYNTAX_HH etisserant@0: #define _ABSYNTAX_HH etisserant@0: etisserant@0: etisserant@0: #include // required for NULL etisserant@0: etisserant@0: /* Forward declaration of the visitor interface etisserant@0: * dclared in the visitor.hh file etisserant@0: * We cannot include the visitor.hh file, as it will etisserant@0: * include this same file first, as it too requires references etisserant@0: * to the abstract syntax classes defined here. etisserant@0: */ etisserant@0: class visitor_c; // forward declaration etisserant@0: etisserant@0: etisserant@0: class symbol_c; // forward declaration etisserant@0: etisserant@0: etisserant@0: etisserant@0: /* The base class of all symbols */ etisserant@0: class symbol_c { etisserant@0: etisserant@0: public: etisserant@0: /* etisserant@0: * Line number for the purposes of error checking etisserant@0: */ mario@69: int first_line; mario@69: int first_column; mario@69: int last_line; mario@69: int last_column; etisserant@0: etisserant@0: public: etisserant@0: /* default constructor */ etisserant@0: symbol_c(void); mario@69: symbol_c(int fl /* first_line */, mario@69: int fc /* first_column */, mario@69: int ll = 0 /* last_line */, mario@69: int lc = 0 /* last_column */ mario@69: ); etisserant@0: etisserant@0: /* default destructor */ etisserant@0: /* must be virtual so compiler does not complain... */ etisserant@0: virtual ~symbol_c(void) {return;}; etisserant@0: etisserant@0: virtual void *accept(visitor_c &visitor) {return NULL;}; etisserant@0: }; etisserant@0: etisserant@0: etisserant@0: class token_c: public symbol_c { etisserant@0: public: etisserant@0: /* the value of the symbol. */ etisserant@0: const char *value; etisserant@0: etisserant@0: public: mario@69: token_c(const char *value, int fl = 0, int fc = 0, int ll = 0, int lc = 0); etisserant@0: }; etisserant@0: etisserant@0: etisserant@0: /* a list of symbols... */ etisserant@0: class list_c: public symbol_c { etisserant@0: public: etisserant@0: int n; etisserant@0: symbol_c **elements; etisserant@0: etisserant@0: public: mario@69: list_c(int fl = 0, int fc = 0, int ll = 0, int lc = 0); mario@69: list_c(symbol_c *elem, int fl = 0, int fc = 0, int ll = 0, int lc = 0); etisserant@0: /* insert a new element */ etisserant@0: virtual void add_element(symbol_c *elem); etisserant@0: }; etisserant@0: etisserant@0: etisserant@0: etisserant@0: mario@69: #define SYM_LIST(class_name_c) \ mario@69: class class_name_c: public list_c { \ mario@69: public: \ mario@69: class_name_c(int fl = 0, int fc = 0, int ll = 0, int lc = 0); \ mario@69: class_name_c(symbol_c *elem, int fl = 0, int fc = 0, int ll = 0, int lc = 0); \ mario@69: virtual void *accept(visitor_c &visitor); \ mario@69: }; mario@69: mario@69: mario@69: #define SYM_TOKEN(class_name_c) \ mario@69: class class_name_c: public token_c { \ mario@69: public: \ mario@69: class_name_c(const char *value, int fl = 0, int fc = 0, int ll = 0, int lc = 0); \ mario@69: virtual void *accept(visitor_c &visitor); \ etisserant@0: }; etisserant@0: etisserant@0: etisserant@0: #define SYM_REF0(class_name_c) \ etisserant@0: class class_name_c: public symbol_c { \ etisserant@0: public: \ mario@69: class_name_c(int fl = 0, int fc = 0, \ mario@69: int ll = 0, int lc = 0); \ etisserant@0: virtual void *accept(visitor_c &visitor); \ etisserant@0: }; etisserant@0: etisserant@0: mario@69: #define SYM_REF1(class_name_c, ref1) \ mario@69: class class_name_c: public symbol_c { \ mario@69: public: \ mario@69: symbol_c *ref1; \ mario@69: public: \ mario@69: class_name_c(symbol_c *ref1, \ mario@69: int fl = 0, int fc = 0, \ mario@69: int ll = 0, int lc = 0); \ mario@69: virtual void *accept(visitor_c &visitor); \ mario@69: }; mario@69: mario@69: mario@69: #define SYM_REF2(class_name_c, ref1, ref2) \ mario@69: class class_name_c: public symbol_c { \ mario@69: public: \ mario@69: symbol_c *ref1; \ mario@69: symbol_c *ref2; \ mario@69: public: \ mario@69: class_name_c(symbol_c *ref1, \ mario@69: symbol_c *ref2 = NULL, \ mario@69: int fl = 0, int fc = 0, \ mario@69: int ll = 0, int lc = 0); \ mario@69: virtual void *accept(visitor_c &visitor); \ mario@69: }; mario@69: mario@69: mario@69: #define SYM_REF3(class_name_c, ref1, ref2, ref3) \ mario@69: class class_name_c: public symbol_c { \ mario@69: public: \ mario@69: symbol_c *ref1; \ mario@69: symbol_c *ref2; \ mario@69: symbol_c *ref3; \ mario@69: public: \ mario@69: class_name_c(symbol_c *ref1, \ mario@69: symbol_c *ref2, \ mario@69: symbol_c *ref3, \ mario@69: int fl = 0, int fc = 0, \ mario@69: int ll = 0, int lc = 0); \ mario@69: virtual void *accept(visitor_c &visitor); \ etisserant@0: }; etisserant@0: etisserant@0: etisserant@0: #define SYM_REF4(class_name_c, ref1, ref2, ref3, ref4) \ etisserant@0: class class_name_c: public symbol_c { \ etisserant@0: public: \ etisserant@0: symbol_c *ref1; \ etisserant@0: symbol_c *ref2; \ etisserant@0: symbol_c *ref3; \ etisserant@0: symbol_c *ref4; \ etisserant@0: public: \ etisserant@0: class_name_c(symbol_c *ref1, \ etisserant@0: symbol_c *ref2, \ etisserant@0: symbol_c *ref3, \ mario@69: symbol_c *ref4 = NULL, \ mario@69: int fl = 0, int fc = 0, \ mario@69: int ll = 0, int lc = 0); \ mario@69: virtual void *accept(visitor_c &visitor); \ mario@69: }; mario@69: mario@69: mario@69: #define SYM_REF5(class_name_c, ref1, ref2, ref3, ref4, ref5) \ mario@69: class class_name_c: public symbol_c { \ mario@69: public: \ mario@69: symbol_c *ref1; \ mario@69: symbol_c *ref2; \ mario@69: symbol_c *ref3; \ mario@69: symbol_c *ref4; \ mario@69: symbol_c *ref5; \ mario@69: public: \ mario@69: class_name_c(symbol_c *ref1, \ mario@69: symbol_c *ref2, \ mario@69: symbol_c *ref3, \ mario@69: symbol_c *ref4, \ mario@69: symbol_c *ref5, \ mario@69: int fl = 0, int fc = 0, \ mario@69: int ll = 0, int lc = 0); \ mario@69: virtual void *accept(visitor_c &visitor); \ etisserant@0: }; etisserant@0: etisserant@0: etisserant@0: #define SYM_REF6(class_name_c, ref1, ref2, ref3, ref4, ref5, ref6) \ etisserant@0: class class_name_c: public symbol_c { \ etisserant@0: public: \ etisserant@0: symbol_c *ref1; \ etisserant@0: symbol_c *ref2; \ etisserant@0: symbol_c *ref3; \ etisserant@0: symbol_c *ref4; \ etisserant@0: symbol_c *ref5; \ etisserant@0: symbol_c *ref6; \ etisserant@0: public: \ etisserant@0: class_name_c(symbol_c *ref1, \ etisserant@0: symbol_c *ref2, \ etisserant@0: symbol_c *ref3, \ etisserant@0: symbol_c *ref4, \ etisserant@0: symbol_c *ref5, \ mario@69: symbol_c *ref6 = NULL, \ mario@69: int fl = 0, int fc = 0, \ mario@69: int ll = 0, int lc = 0); \ etisserant@0: virtual void *accept(visitor_c &visitor); \ etisserant@0: }; etisserant@0: etisserant@0: etisserant@0: #include "absyntax.def" etisserant@0: etisserant@0: etisserant@0: etisserant@0: #undef SYM_LIST etisserant@0: #undef SYM_TOKEN etisserant@0: #undef SYM_REF0 mario@69: #undef SYM_REF1 etisserant@0: #undef SYM_REF2 mario@69: #undef SYM_REF3 etisserant@0: #undef SYM_REF4 mario@69: #undef SYM_REF5 etisserant@0: #undef SYM_REF6 etisserant@0: etisserant@0: etisserant@0: etisserant@0: #endif /* _ABSYNTAX_HH */