author | Manuele Conti <conti.ma@alice.it> |
Thu, 16 Aug 2012 22:44:38 +0200 | |
changeset 641 | 5681f600ac18 |
parent 596 | 4efb11e44065 |
child 746 | c7219a37cc39 |
permissions | -rwxr-xr-x |
0
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
1 |
/* |
261
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
2 |
* matiec - a compiler for the programming languages defined in IEC 61131-3 |
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
3 |
* Copyright (C) 2003-2011 Mario de Sousa (msousa@fe.up.pt) |
279
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
261
diff
changeset
|
4 |
* Copyright (C) 2007-2011 Laurent Bessard and Edouard Tisserant |
261
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
5 |
* |
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
6 |
* This program is free software: you can redistribute it and/or modify |
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
7 |
* it under the terms of the GNU General Public License as published by |
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
8 |
* the Free Software Foundation, either version 3 of the License, or |
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
9 |
* (at your option) any later version. |
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
10 |
* |
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
11 |
* This program is distributed in the hope that it will be useful, |
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
12 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
13 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
14 |
* GNU General Public License for more details. |
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
15 |
* |
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
16 |
* You should have received a copy of the GNU General Public License |
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
17 |
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
18 |
* |
0
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
19 |
* |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
20 |
* This code is made available on the understanding that it will not be |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
21 |
* used in safety-critical situations without a full and competent review. |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
22 |
*/ |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
23 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
24 |
/* |
261
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
25 |
* An IEC 61131-3 compiler. |
0
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
26 |
* |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
27 |
* Based on the |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
28 |
* FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10) |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
29 |
* |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
30 |
*/ |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
31 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
32 |
/* |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
33 |
**************************************************************** |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
34 |
**************************************************************** |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
35 |
**************************************************************** |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
36 |
********* ********* |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
37 |
********* ********* |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
38 |
********* O V E R A L L A R C H I T E C T U R E ********* |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
39 |
********* ********* |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
40 |
********* ********* |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
41 |
**************************************************************** |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
42 |
**************************************************************** |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
43 |
**************************************************************** |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
44 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
45 |
The compiler works in 4(+1) stages: |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
46 |
Stage 1 - Lexical analyser - implemented with flex (iec.flex) |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
47 |
Stage 2 - Syntax parser - implemented with bison (iec.y) |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
48 |
Stage 3 - Semantics analyser - not yet implemented |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
49 |
Stage 4 - Code generator - implemented in C++ |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
50 |
Stage 4+1 - Binary code generator - gcc, javac, etc... |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
51 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
52 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
53 |
Data structures passed between stages, in global variables: |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
54 |
1->2 : tokens (int), and token values (char *) |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
55 |
2->1 : symbol tables (defined in symtable.hh) |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
56 |
2->3 : abstract syntax tree (tree of C++ classes, in absyntax.hh file) |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
57 |
3->4 : Same as 2->3 |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
58 |
4->4+1 : file with program in c, java, etc... |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
59 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
60 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
61 |
The compiler works in several passes: |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
62 |
Pass 1: executes stages 1 and 2 simultaneously |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
63 |
Pass 2: executes stage 3 |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
64 |
Pass 3: executes stage 4 |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
65 |
Pass 4: executes stage 4+1 |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
66 |
*/ |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
67 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
68 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
69 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
70 |
//#include <stdio.h> // printf() |
186
f0a41f731cea
bug when compiling for windows (missing getopt.h) fixed
greg
parents:
181
diff
changeset
|
71 |
#include <getopt.h> |
139
668a54686827
added missing includes on some platform (gentoo/gcc-4.3.1)
etisserant
parents:
136
diff
changeset
|
72 |
#include <string.h> |
0
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
73 |
#include <stdlib.h> // EXIT_FAILURE |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
74 |
#include "absyntax/absyntax.hh" // symbol_c type |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
75 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
76 |
/* A macro for printing out internal parser errors... */ |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
77 |
#include <iostream> // required for std::cerr |
350
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
315
diff
changeset
|
78 |
|
374
01068ccb73b2
Fix make on system without mercurial installed.
Manuele Conti <conti.ma@alice.it>
parents:
370
diff
changeset
|
79 |
#ifndef HGVERSION |
01068ccb73b2
Fix make on system without mercurial installed.
Manuele Conti <conti.ma@alice.it>
parents:
370
diff
changeset
|
80 |
#define HGVERSION "" |
01068ccb73b2
Fix make on system without mercurial installed.
Manuele Conti <conti.ma@alice.it>
parents:
370
diff
changeset
|
81 |
#endif |
350
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
315
diff
changeset
|
82 |
|
596
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
521
diff
changeset
|
83 |
#include "main.hh" // symbol_c type |
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
521
diff
changeset
|
84 |
#include <stdarg.h> // required for va_start(), va_list |
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
521
diff
changeset
|
85 |
|
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
521
diff
changeset
|
86 |
void error_exit(const char *file_name, int line_no, const char *errmsg, ...) { |
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
521
diff
changeset
|
87 |
va_list argptr; |
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
521
diff
changeset
|
88 |
va_start(argptr, errmsg); /* second argument is last fixed pamater of error_exit() */ |
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
521
diff
changeset
|
89 |
|
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
521
diff
changeset
|
90 |
fprintf(stderr, "\nInternal compiler error in file %s at line %d", file_name, line_no); |
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
521
diff
changeset
|
91 |
if (errmsg != NULL) { |
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
521
diff
changeset
|
92 |
fprintf(stderr, ": "); |
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
521
diff
changeset
|
93 |
vfprintf(stderr, errmsg, argptr); |
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
521
diff
changeset
|
94 |
} else { |
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
521
diff
changeset
|
95 |
fprintf(stderr, "."); |
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
521
diff
changeset
|
96 |
} |
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
521
diff
changeset
|
97 |
fprintf(stderr, "\n"); |
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
521
diff
changeset
|
98 |
va_end(argptr); |
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
521
diff
changeset
|
99 |
|
0
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
100 |
exit(EXIT_FAILURE); |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
101 |
} |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
102 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
103 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
104 |
|
362
6482d83fadee
Add print version command line option.
Mario de Sousa <msousa@fe.up.pt>
parents:
350
diff
changeset
|
105 |
#include "config/config.h" |
177
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
106 |
#include "stage1_2/stage1_2.hh" |
181
38d6eb056260
Moving absyntax utility files out from stage4/generate_c
mario
parents:
179
diff
changeset
|
107 |
#include "absyntax_utils/absyntax_utils.hh" |
177
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
108 |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
186
diff
changeset
|
109 |
int stage3(symbol_c *tree_root); |
46
fc1b78ea6d84
Adding support for generating files into an user-defined folder
lbessard
parents:
0
diff
changeset
|
110 |
int stage4(symbol_c *tree_root, const char *builddir); |
0
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
111 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
112 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
113 |
static void printusage(const char *cmd) { |
362
6482d83fadee
Add print version command line option.
Mario de Sousa <msousa@fe.up.pt>
parents:
350
diff
changeset
|
114 |
printf("syntax: %s [-h] [-v] [-f] [-s] [-I <include_directory>] [-T <target_directory>] <input_file>\n", cmd); |
177
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
115 |
printf(" h : show this help message\n"); |
362
6482d83fadee
Add print version command line option.
Mario de Sousa <msousa@fe.up.pt>
parents:
350
diff
changeset
|
116 |
printf(" v : print version number\n"); |
6482d83fadee
Add print version command line option.
Mario de Sousa <msousa@fe.up.pt>
parents:
350
diff
changeset
|
117 |
printf(" f : display full token location on error messages\n"); |
177
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
118 |
/******************************************************/ |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
119 |
/* whether we are suporting safe extensions */ |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
120 |
/* as defined in PLCopen - Technical Committee 5 */ |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
121 |
/* Safety Software Technical Specification, */ |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
122 |
/* Part 1: Concepts and Function Blocks, */ |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
123 |
/* Version 1.0 – Official Release */ |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
124 |
/******************************************************/ |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
125 |
printf(" s : allow use of safe extensions\n"); |
261
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
126 |
printf("\n"); |
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
127 |
printf("%s - Copyright (C) 2003-2011 \n" |
db2ad6541d92
Updating licensing information.
Mario de Sousa <msousa@fe.up.pt>
parents:
202
diff
changeset
|
128 |
"This program comes with ABSOLUTELY NO WARRANTY!\n" |
362
6482d83fadee
Add print version command line option.
Mario de Sousa <msousa@fe.up.pt>
parents:
350
diff
changeset
|
129 |
"This is free software licensed under GPL v3, and you are welcome to redistribute it under the conditions specified by this license.\n", PACKAGE_NAME); |
0
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
130 |
} |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
131 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
132 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
133 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
134 |
int main(int argc, char **argv) { |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
135 |
symbol_c *tree_root; |
46
fc1b78ea6d84
Adding support for generating files into an user-defined folder
lbessard
parents:
0
diff
changeset
|
136 |
char * builddir = NULL; |
177
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
137 |
stage1_2_options_t stage1_2_options = {false, false, NULL}; |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
138 |
int optres, errflg = 0; |
521
3127ddda2be2
Improve usability command line under windows.
Conti Manuele <conti.ma@alice.it>
parents:
516
diff
changeset
|
139 |
int path_len; |
177
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
140 |
/* |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
141 |
extern char *optarg; |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
142 |
extern int optind, optopt; |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
143 |
*/ |
46
fc1b78ea6d84
Adding support for generating files into an user-defined folder
lbessard
parents:
0
diff
changeset
|
144 |
|
181
38d6eb056260
Moving absyntax utility files out from stage4/generate_c
mario
parents:
179
diff
changeset
|
145 |
/******************************************/ |
38d6eb056260
Moving absyntax utility files out from stage4/generate_c
mario
parents:
179
diff
changeset
|
146 |
/* Parse command line options... */ |
38d6eb056260
Moving absyntax utility files out from stage4/generate_c
mario
parents:
179
diff
changeset
|
147 |
/******************************************/ |
362
6482d83fadee
Add print version command line option.
Mario de Sousa <msousa@fe.up.pt>
parents:
350
diff
changeset
|
148 |
while ((optres = getopt(argc, argv, ":hvfsI:T:")) != -1) { |
177
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
149 |
switch(optres) { |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
150 |
case 'h': |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
151 |
printusage(argv[0]); |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
152 |
return 0; |
362
6482d83fadee
Add print version command line option.
Mario de Sousa <msousa@fe.up.pt>
parents:
350
diff
changeset
|
153 |
case 'v': |
370
f3cec8694f65
Add automatic HG changeset id information in "-v" param
Matteo Facchinetti
parents:
362
diff
changeset
|
154 |
fprintf(stdout, "%s version %s\n" |
f3cec8694f65
Add automatic HG changeset id information in "-v" param
Matteo Facchinetti
parents:
362
diff
changeset
|
155 |
"changeset id: %s\n", PACKAGE_NAME, PACKAGE_VERSION, HGVERSION); |
362
6482d83fadee
Add print version command line option.
Mario de Sousa <msousa@fe.up.pt>
parents:
350
diff
changeset
|
156 |
return 0; |
177
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
157 |
case 'f': |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
158 |
stage1_2_options.full_token_loc = true; |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
159 |
break; |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
160 |
case 's': |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
161 |
stage1_2_options.safe_extensions = true; |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
162 |
break; |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
163 |
case 'I': |
521
3127ddda2be2
Improve usability command line under windows.
Conti Manuele <conti.ma@alice.it>
parents:
516
diff
changeset
|
164 |
/* NOTE: To improve the usability under windows: |
3127ddda2be2
Improve usability command line under windows.
Conti Manuele <conti.ma@alice.it>
parents:
516
diff
changeset
|
165 |
* We delete last char's path if it ends with "\". |
3127ddda2be2
Improve usability command line under windows.
Conti Manuele <conti.ma@alice.it>
parents:
516
diff
changeset
|
166 |
* In this way compiler front-end accepts paths with or without |
3127ddda2be2
Improve usability command line under windows.
Conti Manuele <conti.ma@alice.it>
parents:
516
diff
changeset
|
167 |
* slash terminator. |
3127ddda2be2
Improve usability command line under windows.
Conti Manuele <conti.ma@alice.it>
parents:
516
diff
changeset
|
168 |
*/ |
3127ddda2be2
Improve usability command line under windows.
Conti Manuele <conti.ma@alice.it>
parents:
516
diff
changeset
|
169 |
path_len = strlen(optarg) - 1; |
3127ddda2be2
Improve usability command line under windows.
Conti Manuele <conti.ma@alice.it>
parents:
516
diff
changeset
|
170 |
if (optarg[path_len] == '\\') optarg[path_len]= '\0'; |
177
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
171 |
stage1_2_options.includedir = optarg; |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
172 |
break; |
179 | 173 |
case 'T': |
521
3127ddda2be2
Improve usability command line under windows.
Conti Manuele <conti.ma@alice.it>
parents:
516
diff
changeset
|
174 |
/* NOTE: see note above */ |
3127ddda2be2
Improve usability command line under windows.
Conti Manuele <conti.ma@alice.it>
parents:
516
diff
changeset
|
175 |
path_len = strlen(optarg) - 1; |
3127ddda2be2
Improve usability command line under windows.
Conti Manuele <conti.ma@alice.it>
parents:
516
diff
changeset
|
176 |
if (optarg[path_len] == '\\') optarg[path_len]= '\0'; |
179 | 177 |
builddir = optarg; |
178 |
break; |
|
177
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
179 |
case ':': /* -I or -T without operand */ |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
180 |
fprintf(stderr, "Option -%c requires an operand\n", optopt); |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
181 |
errflg++; |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
182 |
break; |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
183 |
case '?': |
181
38d6eb056260
Moving absyntax utility files out from stage4/generate_c
mario
parents:
179
diff
changeset
|
184 |
fprintf(stderr, "Unrecognized option: -%c\n", optopt); |
38d6eb056260
Moving absyntax utility files out from stage4/generate_c
mario
parents:
179
diff
changeset
|
185 |
errflg++; |
38d6eb056260
Moving absyntax utility files out from stage4/generate_c
mario
parents:
179
diff
changeset
|
186 |
break; |
177
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
187 |
default: |
181
38d6eb056260
Moving absyntax utility files out from stage4/generate_c
mario
parents:
179
diff
changeset
|
188 |
fprintf(stderr, "Unknown error while parsing command line options."); |
177
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
189 |
errflg++; |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
190 |
break; |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
191 |
} |
0
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
192 |
} |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
193 |
|
177
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
194 |
if (optind == argc) { |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
195 |
fprintf(stderr, "Missing input file\n"); |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
196 |
errflg++; |
136 | 197 |
} |
198 |
||
177
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
199 |
if (optind > argc) { |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
200 |
fprintf(stderr, "Too many input files\n"); |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
201 |
errflg++; |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
202 |
} |
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
203 |
|
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
204 |
if (errflg) { |
362
6482d83fadee
Add print version command line option.
Mario de Sousa <msousa@fe.up.pt>
parents:
350
diff
changeset
|
205 |
printf("\n"); |
136 | 206 |
printusage(argv[0]); |
207 |
return EXIT_FAILURE; |
|
208 |
} |
|
209 |
||
210 |
||
181
38d6eb056260
Moving absyntax utility files out from stage4/generate_c
mario
parents:
179
diff
changeset
|
211 |
/***************************/ |
38d6eb056260
Moving absyntax utility files out from stage4/generate_c
mario
parents:
179
diff
changeset
|
212 |
/* Run the compiler... */ |
38d6eb056260
Moving absyntax utility files out from stage4/generate_c
mario
parents:
179
diff
changeset
|
213 |
/***************************/ |
0
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
214 |
/* 1st Pass */ |
177
697562a5da7c
Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents:
139
diff
changeset
|
215 |
if (stage1_2(argv[optind], &tree_root, stage1_2_options) < 0) |
0
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
216 |
return EXIT_FAILURE; |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
217 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
218 |
/* 2nd Pass */ |
315
c62a4078f269
Allow use of ENO keyword in structured variable field selector.
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
219 |
/* basically loads some symbol tables to speed up look ups later on */ |
c62a4078f269
Allow use of ENO keyword in structured variable field selector.
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
220 |
absyntax_utils_init(tree_root); |
c62a4078f269
Allow use of ENO keyword in structured variable field selector.
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
221 |
/* moved to bison, although it could perfectly well still be here instead of in bison code. */ |
c62a4078f269
Allow use of ENO keyword in structured variable field selector.
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
222 |
//add_en_eno_param_decl_c::add_to(tree_root); |
c62a4078f269
Allow use of ENO keyword in structured variable field selector.
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
223 |
|
516
8591746fa134
Produce similar error messages in stage2 and stage3.
Mario de Sousa <msousa@fe.up.pt>
parents:
374
diff
changeset
|
224 |
/* Do semantic verification of code (data type and lvalue checking currently implemented) */ |
0
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
225 |
if (stage3(tree_root) < 0) |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
226 |
return EXIT_FAILURE; |
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
186
diff
changeset
|
227 |
|
0
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
228 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
229 |
/* 3rd Pass */ |
46
fc1b78ea6d84
Adding support for generating files into an user-defined folder
lbessard
parents:
0
diff
changeset
|
230 |
if (stage4(tree_root, builddir) < 0) |
0
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
231 |
return EXIT_FAILURE; |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
232 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
233 |
/* 4th Pass */ |
315
c62a4078f269
Allow use of ENO keyword in structured variable field selector.
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
234 |
/* Call gcc, g++, or whatever... */ |
0
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
235 |
/* Currently implemented in the Makefile! */ |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
236 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
237 |
return 0; |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
238 |
} |
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
239 |
|
fb772792efd1
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff
changeset
|
240 |