stage1_2/iec_flex.ll
author Mario de Sousa <msousa@fe.up.pt>
Thu, 03 Aug 2017 22:32:03 +0100
changeset 1056 a47dc03f0e53
parent 1055 ce7b65e24676
child 1057 2b25052fadca
permissions -rw-r--r--
fix bug introduced in previous commit (matiec was unable to parse SFC code)
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
/*
264
6facabd9c2cd Updating License info (with Edoaurd's permission for relevant files).
Mario de Sousa <msousa@fe.up.pt>
parents: 257
diff changeset
     2
 *  matiec - a compiler for the programming languages defined in IEC 61131-3
6facabd9c2cd Updating License info (with Edoaurd's permission for relevant files).
Mario de Sousa <msousa@fe.up.pt>
parents: 257
diff changeset
     3
 *
6facabd9c2cd Updating License info (with Edoaurd's permission for relevant files).
Mario de Sousa <msousa@fe.up.pt>
parents: 257
diff changeset
     4
 *  Copyright (C) 2003-2011  Mario de Sousa (msousa@fe.up.pt)
6facabd9c2cd Updating License info (with Edoaurd's permission for relevant files).
Mario de Sousa <msousa@fe.up.pt>
parents: 257
diff changeset
     5
 *
6facabd9c2cd Updating License info (with Edoaurd's permission for relevant files).
Mario de Sousa <msousa@fe.up.pt>
parents: 257
diff changeset
     6
 *  This program is free software: you can redistribute it and/or modify
6facabd9c2cd Updating License info (with Edoaurd's permission for relevant files).
Mario de Sousa <msousa@fe.up.pt>
parents: 257
diff changeset
     7
 *  it under the terms of the GNU General Public License as published by
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
     8
 *  the Free Software Foundation, either version 3 of thest_whitespaceLicense, or
264
6facabd9c2cd Updating License info (with Edoaurd's permission for relevant files).
Mario de Sousa <msousa@fe.up.pt>
parents: 257
diff changeset
     9
 *  (at your option) any later version.
6facabd9c2cd Updating License info (with Edoaurd's permission for relevant files).
Mario de Sousa <msousa@fe.up.pt>
parents: 257
diff changeset
    10
 *
6facabd9c2cd Updating License info (with Edoaurd's permission for relevant files).
Mario de Sousa <msousa@fe.up.pt>
parents: 257
diff changeset
    11
 *  This program is distributed in the hope that it will be useful,
6facabd9c2cd Updating License info (with Edoaurd's permission for relevant files).
Mario de Sousa <msousa@fe.up.pt>
parents: 257
diff changeset
    12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
6facabd9c2cd Updating License info (with Edoaurd's permission for relevant files).
Mario de Sousa <msousa@fe.up.pt>
parents: 257
diff changeset
    13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6facabd9c2cd Updating License info (with Edoaurd's permission for relevant files).
Mario de Sousa <msousa@fe.up.pt>
parents: 257
diff changeset
    14
 *  GNU General Public License for more details.
6facabd9c2cd Updating License info (with Edoaurd's permission for relevant files).
Mario de Sousa <msousa@fe.up.pt>
parents: 257
diff changeset
    15
 *
6facabd9c2cd Updating License info (with Edoaurd's permission for relevant files).
Mario de Sousa <msousa@fe.up.pt>
parents: 257
diff changeset
    16
 *  You should have received a copy of the GNU General Public License
6facabd9c2cd Updating License info (with Edoaurd's permission for relevant files).
Mario de Sousa <msousa@fe.up.pt>
parents: 257
diff changeset
    17
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
6facabd9c2cd Updating License info (with Edoaurd's permission for relevant files).
Mario de Sousa <msousa@fe.up.pt>
parents: 257
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
/*
264
6facabd9c2cd Updating License info (with Edoaurd's permission for relevant files).
Mario de Sousa <msousa@fe.up.pt>
parents: 257
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
 * Stage 1
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
 * This file contains the lexical tokens definitions, from which
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    37
 * the flex utility will generate a lexical parser function.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    38
 */
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
/* Lexical Parser Options... */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    45
/*****************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    46
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    47
/* The lexical analyser will never work in interactive mode,
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    48
 * i.e., it will only process programs saved to files, and never
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    49
 * programs being written inter-actively by the user.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    50
 * This option saves the resulting parser from calling the
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    51
 * isatty() function, that seems to be generating some compile
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    52
 * errors under some (older?) versions of flex.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    53
 */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    54
%option never-interactive
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    55
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    56
/* Have the lexical analyser use a 'char *yytext' instead of an
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    57
 * array of char 'char yytext[??]' to store the lexical token.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    58
 */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    59
%pointer
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
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    62
/* Have the lexical analyser ignore the case of letters.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    63
 * This will occur for all the tokens and keywords, but
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    64
 * the resulting text handed up to the syntax parser
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    65
 * will not be changed, and keep the original case
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    66
 * of the letters in the input file.
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
%option case-insensitive
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
/* Have the generated lexical analyser keep track of the
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    71
 * line number it is currently analysing.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    72
 * This is used to pass up to the syntax parser
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    73
 * the number of the line on which the current
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    74
 * token was found. It will enable the syntax parser
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    75
 * to generate more informatve error messages...
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    76
 */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    77
%option yylineno
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    78
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    79
/* required for the use of the yy_pop_state() and
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    80
 * yy_push_state() functions
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    81
 */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    82
%option stack
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    83
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    84
/* The '%option stack' also requests the inclusion of 
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    85
 * the yy_top_state(), however this function is not
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    86
 * currently being used. This means that the compiler
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    87
 * is complaining about the existance of this function.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    88
 * The following option removes the yy_top_state()
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    89
 * function from the resulting c code, so the compiler 
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    90
 * no longer complains.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    91
 */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    92
%option noyy_top_state
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
    93
547
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
    94
/* We will be using unput() in our flex code, so we cannot set the following option!... */
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
    95
/*
267
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
    96
%option nounput
547
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
    97
*/
267
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
    98
1050
bdc21971f95d Add comment stating how to enable debug option in flex.
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1031
diff changeset
    99
/* The '%option debug' makes the generated scanner run in
bdc21971f95d Add comment stating how to enable debug option in flex.
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1031
diff changeset
   100
 * debug mode.
bdc21971f95d Add comment stating how to enable debug option in flex.
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1031
diff changeset
   101
%option debug
bdc21971f95d Add comment stating how to enable debug option in flex.
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1031
diff changeset
   102
 */
bdc21971f95d Add comment stating how to enable debug option in flex.
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1031
diff changeset
   103
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   104
/**************************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   105
/* External Variable and Function declarations... */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   106
/**************************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   107
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   108
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   109
%{
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   110
/* Define TEST_MAIN to include a main() function.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   111
 * Useful for testing the parser generated by flex.
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
/*
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   114
#define TEST_MAIN
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   115
*/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   116
/* If lexical parser is compiled by itself, we need to define the following
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   117
 * constant to some string. Under normal circumstances LIBDIRECTORY is set
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   118
 * in the syntax parser header file...
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   119
 */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   120
#ifdef TEST_MAIN
40
873a5b60a7ea Fixed -I library include path behavior + removed old lib implementation + added generated lib func names to stage 1_2 + added Makefile.Linux
etisserant
parents: 15
diff changeset
   121
#define DEFAULT_LIBDIR "just_testing"
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   122
#endif
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   123
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   124
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   125
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   126
/* Required for strdup() */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   127
#include <string.h>
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   128
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   129
/* Required only for the declaration of abstract syntax classes
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   130
 * (class symbol_c; class token_c; class list_c;)
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   131
 * These will not be used in flex, but the token type union defined
822
a7d9e0b8636b Fix build on Ubuntu 13.10
Edouard Tisserant
parents: 793
diff changeset
   132
 * in iec_bison.hh contains pointers to these classes, so we must include
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   133
 * it here.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   134
 */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   135
#include "../absyntax/absyntax.hh"
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   136
15
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents: 13
diff changeset
   137
822
a7d9e0b8636b Fix build on Ubuntu 13.10
Edouard Tisserant
parents: 793
diff changeset
   138
/* iec_bison.hh is generated by bison.
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   139
 * Contains the definition of the token constants, and the
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   140
 * token value type YYSTYPE (in our case, a 'const char *')
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   141
 */
822
a7d9e0b8636b Fix build on Ubuntu 13.10
Edouard Tisserant
parents: 793
diff changeset
   142
#include "iec_bison.hh"
15
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents: 13
diff changeset
   143
#include "stage1_2_priv.hh"
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents: 13
diff changeset
   144
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   145
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   146
/* Variable defined by the bison parser,
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   147
 * where the value of the tokens will be stored
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   148
 */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   149
extern YYSTYPE yylval;
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   150
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   151
/* The name of the file currently being parsed...
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   152
 * Note that flex accesses and updates this global variable
757
f1fc4aa6f0e3 Code cleanup: move tracking functions to flex.
Mario de Sousa <msousa@fe.up.pt>
parents: 756
diff changeset
   153
 * apropriately whenever it comes across an (*#include <filename> *) directive...
f1fc4aa6f0e3 Code cleanup: move tracking functions to flex.
Mario de Sousa <msousa@fe.up.pt>
parents: 756
diff changeset
   154
 */
f1fc4aa6f0e3 Code cleanup: move tracking functions to flex.
Mario de Sousa <msousa@fe.up.pt>
parents: 756
diff changeset
   155
const char *current_filename = NULL;
f1fc4aa6f0e3 Code cleanup: move tracking functions to flex.
Mario de Sousa <msousa@fe.up.pt>
parents: 756
diff changeset
   156
15
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents: 13
diff changeset
   157
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   158
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   159
/* Variable defined by the bison parser.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   160
 * It must be initialised with the location
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   161
 * of the token being parsed.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   162
 * This is only needed if we want to keep
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   163
 * track of the locations, in order to give
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   164
 * more meaningful error messages!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   165
 */
415
5c115720149c Fix YYLTYPE declaration.
Manuele Conti <conti.ma@alice.it>
parents: 354
diff changeset
   166
/*
5c115720149c Fix YYLTYPE declaration.
Manuele Conti <conti.ma@alice.it>
parents: 354
diff changeset
   167
 *extern YYLTYPE yylloc;
5c115720149c Fix YYLTYPE declaration.
Manuele Conti <conti.ma@alice.it>
parents: 354
diff changeset
   168
b*/
136
32bd7ef40897 Adding some improvements:
lbessard
parents: 131
diff changeset
   169
#define YY_INPUT(buf,result,max_size)  {\
32bd7ef40897 Adding some improvements:
lbessard
parents: 131
diff changeset
   170
    result = GetNextChar(buf, max_size);\
32bd7ef40897 Adding some improvements:
lbessard
parents: 131
diff changeset
   171
    if (  result <= 0  )\
32bd7ef40897 Adding some improvements:
lbessard
parents: 131
diff changeset
   172
      result = YY_NULL;\
32bd7ef40897 Adding some improvements:
lbessard
parents: 131
diff changeset
   173
    }
32bd7ef40897 Adding some improvements:
lbessard
parents: 131
diff changeset
   174
287
9df7fcb9bde5 Added tracking of order by which tokens are processed by lexical analyser.
Mario de Sousa <msousa@fe.up.pt>
parents: 286
diff changeset
   175
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   176
/* Macro that is executed for every action.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   177
 * We use it to pass the location of the token
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   178
 * back to the bison parser...
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   179
 */
136
32bd7ef40897 Adding some improvements:
lbessard
parents: 131
diff changeset
   180
#define YY_USER_ACTION {\
1055
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   181
	previous_tracking   =*current_tracking;					\
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   182
	yylloc.first_line   = current_tracking->lineNumber;			\
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   183
	yylloc.first_column = current_tracking->currentChar;			\
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   184
	yylloc.first_file   = current_filename;					\
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   185
	yylloc.first_order  = current_order;					\
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   186
	\
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   187
	UpdateTracking(yytext);							\
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   188
	\
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   189
	yylloc.last_line    = current_tracking->lineNumber;			\
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   190
	yylloc.last_column  = current_tracking->currentChar - 1;		\
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   191
	yylloc.last_file    = current_filename;					\
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   192
	yylloc.last_order   = current_order;					\
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   193
	\
287
9df7fcb9bde5 Added tracking of order by which tokens are processed by lexical analyser.
Mario de Sousa <msousa@fe.up.pt>
parents: 286
diff changeset
   194
	current_tracking->currentTokenStart = current_tracking->currentChar;	\
9df7fcb9bde5 Added tracking of order by which tokens are processed by lexical analyser.
Mario de Sousa <msousa@fe.up.pt>
parents: 286
diff changeset
   195
	current_order++;							\
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   196
	}
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   197
879
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
   198
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   199
/* Since this lexical parser we defined only works in ASCII based
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   200
 * systems, we might as well make sure it is being compiled on
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   201
 * one...
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   202
 * Lets check a few random characters...
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   203
 */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   204
#if (('a' != 0x61) || ('A' != 0x41) || ('z' != 0x7A) || ('Z' != 0x5A) || \
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   205
     ('0' != 0x30) || ('9' != 0x39) || ('(' != 0x28) || ('[' != 0x5B))
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   206
#error This lexical analyser is not portable to a non ASCII based system.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   207
#endif
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   208
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   209
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   210
/* Function only called from within flex, but defined
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   211
 * in iec.y!
3
38850ee685e6 ST and IL parsing added into flex-bison analyser
lbessard
parents: 1
diff changeset
   212
 * We declare it here...
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   213
 *
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   214
 * Search for a symbol in either of the two symbol tables
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   215
 * and return the token id of the first symbol found.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   216
 * Searches first in the variables, and only if not found
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   217
 * does it continue searching in the library elements
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   218
 */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   219
//token_id_t get_identifier_token(const char *identifier_str);
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   220
int get_identifier_token(const char *identifier_str);
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   221
%}
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   222
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   223
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   224
/***************************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   225
/* Forward Declaration of functions defined later. */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   226
/***************************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   227
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   228
%{
1055
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   229
void UpdateTracking(const char *text);
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   230
/* return the character back to the input stream. */
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   231
void unput_char(const char c);
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   232
/* return all the text in the current token back to the input stream. */
1055
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   233
void unput_text(int n);
547
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   234
/* return all the text in the current token back to the input stream, 
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   235
 * but first return to the stream an additional character to mark the end of the token. 
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   236
 */
1055
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   237
void unput_and_mark(const char mark_char);
756
634f476cb60f Insert the auto generated enum datatype conversion functions after the TYPE...END_TYPE, instead of at the end of input file.
Mario de Sousa <msousa@fe.up.pt>
parents: 737
diff changeset
   238
634f476cb60f Insert the auto generated enum datatype conversion functions after the TYPE...END_TYPE, instead of at the end of input file.
Mario de Sousa <msousa@fe.up.pt>
parents: 737
diff changeset
   239
void include_file(const char *include_filename);
757
f1fc4aa6f0e3 Code cleanup: move tracking functions to flex.
Mario de Sousa <msousa@fe.up.pt>
parents: 756
diff changeset
   240
1016
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   241
/* The body_state tries to find a ';' before a END_PROGRAM, END_FUNCTION or END_FUNCTION_BLOCK or END_ACTION
1055
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   242
 * and ignores ';' inside comments and pragmas. This means that we cannot do this in a signle lex rule.
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   243
 * Body_state therefore stores ALL text we consume in every rule, so we can push it back into the buffer
1016
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   244
 * once we have decided if we are parsing ST or IL code. The following functions manage that buffer used by
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   245
 * the body_state.
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   246
 */
1056
a47dc03f0e53 fix bug introduced in previous commit (matiec was unable to parse SFC code)
Mario de Sousa <msousa@fe.up.pt>
parents: 1055
diff changeset
   247
void  append_bodystate_buffer(const char *text, int is_whitespace = 0);
1016
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   248
void   unput_bodystate_buffer(void);
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   249
int  isempty_bodystate_buffer(void);
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   250
757
f1fc4aa6f0e3 Code cleanup: move tracking functions to flex.
Mario de Sousa <msousa@fe.up.pt>
parents: 756
diff changeset
   251
int GetNextChar(char *b, int maxBuffer);
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   252
%}
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   253
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   254
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   255
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   256
/****************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   257
/* Lexical Parser States... */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   258
/****************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   259
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   260
/* NOTE: Our psrser can parse st or il code, intermixed
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   261
 *       within the same file.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   262
 *       With IL we come across the issue of the EOL (end of line) token.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   263
 *       ST, and the declaration parts of IL do not use this token!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   264
 *       If the lexical analyser were to issue this token during ST
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   265
 *       language parsing, or during the declaration of data types,
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   266
 *       function headers, etc. in IL, the syntax parser would crash.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   267
 *
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   268
 *       We can solve this issue using one of three methods:
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   269
 *        (1) Augment all the syntax that does not accept the EOL
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   270
 *            token to simply ignore it. This makes the syntax
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   271
 *            definition (in iec.y) very cluttered!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   272
 *        (2) Let the lexical parser figure out which language
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   273
 *            it is parsing, and decide whether or not to issue
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   274
 *            the EOL token. This requires the lexical parser
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   275
 *            to have knowledge of the syntax!, making for a poor
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   276
 *            overall organisation of the code. It would also make it
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   277
 *            very difficult to understand the lexical parser as it
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   278
 *            would use several states, and a state machine to transition
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   279
 *            between the states. The state transitions would be
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   280
 *            intermingled with the lexical parser defintion!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   281
 *        (3) Use a mixture of (1) and (2). The lexical analyser
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   282
 *            merely distinguishes between function headers and function
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   283
 *            bodies, but no longer makes a distinction between il and
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   284
 *            st language bodies. When parsing a body, it will return
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   285
 *            the EOL token. In other states '\n' will be ignored as
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   286
 *            whitespace.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   287
 *            The ST language syntax has been augmented in the syntax
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   288
 *            parser configuration to ignore any EOL tokens that it may
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   289
 *            come across!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   290
 *            This option has both drawbacks of option (1) and (2), but
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   291
 *            much less intensely.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   292
 *            The syntax that gets cluttered is limited to the ST statements
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   293
 *            (which is rather limited, compared to the function headers and
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   294
 *            data type declarations, etc...), while the state machine in
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   295
 *            the lexical parser becomes very simple. All state transitions
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   296
 *            can be handled within the lexical parser by itself, and can be
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   297
 *            easily identified. Thus knowledge of the syntax required by
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   298
 *            the lexical parser is very limited!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   299
 *
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   300
 * Amazingly enough, I (Mario) got to implement option (3)
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   301
 * at first, requiring two basic states, decl and body.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   302
 * The lexical parser will enter the body state when
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   303
 * it is parsing the body of a function/program/function block. The
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   304
 * state transition is done when we find a VAR_END that is not followed
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   305
 * by a VAR! This is the syntax knowledge that gets included in the
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   306
 * lexical analyser with this option!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   307
 * Unfortunately, getting the st syntax parser to ignore EOL anywhere
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   308
 * where they might appear leads to conflicts. This is due to the fact
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   309
 * that the syntax parser uses the single look-ahead token to remove
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   310
 * possible conflicts. When we insert a possible EOL, the single
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   311
 * look ahead token becomes the EOL, which means the potential conflicts
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   312
 * could no longer be resolved.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   313
 * Removing these conflicts would make the st syntax parser very convoluted,
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   314
 * and adding the extraneous EOL would make it very cluttered.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   315
 * This option was therefore dropped in favour of another!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   316
 *
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   317
 * I ended up implementing (2). Unfortunately the lexical analyser can
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   318
 * not easily distinguish between il and st code, since function
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   319
 * calls in il are very similar to function block calls in st.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   320
 * We therefore use an extra 'body' state. When the lexical parser
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   321
 * finds that last END_VAR, it enters the body state. This state
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   322
 * must figure out what language is being parsed from the first few
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   323
 * tokens, and switch to the correct state (st, il or sfc) according to the
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   324
 * language. This means that we insert quite a bit of knowledge of the
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   325
 * syntax of the languages into the lexical parser. This is ugly, but it
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   326
 * works, and at least it is possible to keep all the state changes together
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   327
 * to make it easier to remove them later on if need be.
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   328
 * Once the language being parsed has been identified, 
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   329
 * the body state returns any matched text back to the buffer with unput(),
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   330
 * to be later matched correctly by the apropriate language parser (st, il or sfc).
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   331
 *
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   332
 * Aditionally, in sfc state it may further recursively enter the body state
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   333
 * once again. This is because an sfc body may contain ACTIONS, which are then
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   334
 * written in one of the three languages (ST, IL or SFC), so once again we need
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   335
 * to figure out which language the ACTION in the SFC was written in. We already
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   336
 * ahve all that done in the body state, so we recursively transition to the body 
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   337
 * state once again.
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   338
 * Note that in this case, when coming out of the st/il state (whichever language
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   339
 * the action was written in) the sfc state will become active again. This is done by
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   340
 * pushing and poping the previously active state!
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   341
 *
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   342
 * The sfc_qualifier_state is required because when parsing actions within an
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   343
 * sfc, we will be expecting action qualifiers (N, P, R, S, DS, SD, ...). In order
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   344
 * to bison to work correctly, these qualifiers must be returned as tokens. However,
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   345
 * these tokens are not reserved keywords, which means it should be possible to
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   346
 * define variables/functions/FBs with any of these names (including 
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   347
 * S and R which are special because they are also IL operators). So, when we are not
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   348
 * expecting any action qualifiers, flex does not return these tokens, and is free
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   349
 * to interpret them as previously defined variables/functions/... as the case may be.
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   350
 *
547
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   351
 * The time_literal_state is required because TIME# literals are decomposed into 
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   352
 * portions, and wewant to send these portions one by one to bison. Each poertion will 
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   353
 * represent the value in days/hours/minutes/seconds/ms.
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   354
 * Unfortunately, some of these portions may also be lexically analysed as an identifier. So,
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   355
 * we need to disable lexical identification of identifiers while parsing TIME# literals!
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   356
 * e.g.:  TIME#55d_4h_56m
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   357
 *       We would like to return to bison the tokens 'TIME' '#' '55d' '_' '4h' '_' '56m'
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   358
 *       Unfortunately, flex will join '_' and '4h' to create a legal {identifier} '_4h',
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   359
 *       and return that identifier instead! So, we added this state!
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   360
 *
952
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   361
 * The ignore_pou_state state is only used when bison says it is doing the pre-parsing.
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   362
 * During pre-parsing, the main state machine will only transition between
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   363
 * INITIAL and ignore_pou_state, and from here back to INITIAL. All other
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   364
 * transitions are inhibited. This inhibition is actually just enforced by making
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   365
 * sure that the INITIAL ---> ignore_pou_state transition is tested before all other
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   366
 * transitions coming out of INITIAL state. All other transitions are unaffected, as they
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   367
 * never get a chance to be evaluated when bison is doing pre-parsing.
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   368
 * Pre-parsing is a first quick scan through the whole input source code simply
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   369
 * to determine the list of POUs and datatypes that will be defined in that
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   370
 * code. Basically, the objective is to fill up the previously_declared_xxxxx
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   371
 * maps, without processing the code itself. Once these maps have been filled up,
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   372
 * bison will throw away the AST (abstract syntax tree) created up to that point, 
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   373
 * and scan through the same source code again, but this time creating a correct AST.
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   374
 * This pre-scan allows the source code to reference POUs and datatypes that are
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   375
 * only declared after they are used!
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   376
 * 
952
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   377
 *
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   378
 * Here is a main state machine...
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   379
 *                                                                         --+  
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   380
 *                                                                           |  these states are
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   381
 *              +------------> get_pou_name_state  ----> ignore_pou_state    |  only active 
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   382
 *              |                                            |               |  when bison is 
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   383
 *              |  ------------------------------------------+               |  doing the 
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   384
 *              |  |                                                         |  pre-parsing!!
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   385
 *              |  v                                                       --+
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   386
 *       +---> INITIAL <-------> config
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   387
 *       |        \
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   388
 *       |        V
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   389
 *       |   header_state
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   390
 *       |        |
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   391
 *       |        V
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   392
 *     vardecl_list_state <------> var_decl
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   393
 *       ^        | 
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   394
 *       |        | [using push()]
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   395
 *       |        |
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   396
 *       |        V
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   397
 *       |       body, 
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   398
 *       |        |
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   399
 *       |        | 
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   400
 *       |   -------------------
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   401
 *       |   |       |         |
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   402
 *       |   v       v         v
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   403
 *       |  st      il        sfc
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   404
 *       |   |       |         |  [using pop() when leaving st/il/sfc => goes to vardecl_list_state]
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   405
 *       |   |       |         |
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   406
 *       -----------------------
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   407
 *
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   408
 * NOTE:- When inside sfc, and an action or transition in ST/IL is found, then 
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   409
 *        we also push() to the body state. This means that sometimes, when pop()ing
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   410
 *        from st and il, the state machine may return to the sfc state!
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   411
 *      - The transitions form sfc to body will be decided by bison, which will
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   412
 *        tell flex to do the transition by calling cmd_goto_body_state().
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   413
 *   
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   414
 * 
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   415
 * Possible state changes are:
952
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   416
 *   INITIAL -> goto(ignore_pou_state)
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   417
 *               (This transition state is only used when bison says it is doing the pre-parsing.)
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   418
 *               (This transition takes precedence over all other transitions!)
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   419
 *               (when a FUNCTION, FUNCTION_BLOCK, PROGRAM or CONFIGURATION is found)
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   420
 * 
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   421
 *   INITIAL -> goto(config_state)
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   422
 *                (when a CONFIGURATION is found)
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   423
 * 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   424
 *   INITIAL -> goto(header_state)
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   425
 *               (when a FUNCTION, FUNCTION_BLOCK, or PROGRAM is found)
952
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   426
 * 
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   427
 *   header_state -> goto(vardecl_list_state)
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   428
 *               (When the first VAR token is found, i.e. at begining of first VAR .. END_VAR declaration)
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   429
 * 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   430
 *  vardecl_list_state -> push current state (vardecl_list_state), and goto(vardecl_state) 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   431
 *                (when a VAR token is found)
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   432
 *   vardecl_state -> pop() to (vardecl_list_state) 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   433
 *                (when a END_VAR token is found)
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   434
 * 
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   435
 *   vardecl_list_state -> push current state (vardecl_list_state), and goto(body_state) 
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   436
 *                (when the last END_VAR is found!)
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   437
 *
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   438
 *   body_state    -> goto(sfc_state)
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   439
 *                     (when it figures out it is parsing sfc language)
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   440
 *   body_state    -> goto(st_state)
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   441
 *                     (when it figures out it is parsing st language)
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   442
 *   body_state    -> goto(il_state)
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   443
 *                     (when it figures out it is parsing il language)
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   444
 *   st_state      -> pop() to vardecl_list_state
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   445
 *                     (when a END_FUNCTION, END_FUNCTION_BLOCK, END_PROGRAM,
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   446
 *                      END_ACTION or END_TRANSITION is found)
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   447
 *   il_state      -> pop() to vardecl_list_state
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   448
 *                     (when a END_FUNCTION, END_FUNCTION_BLOCK, END_PROGRAM,
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   449
 *                      END_ACTION or END_TRANSITION is found)
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   450
 *   sfc_state     -> pop() to vardecl_list_state
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   451
 *                     (when a END_FUNCTION, END_FUNCTION_BLOCK, or END_PROGRAM is found)
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   452
 * 
952
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   453
 *   ignore_pou_state   -> goto(INITIAL)
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   454
 *                         (when a END_FUNCTION, END_FUNCTION_BLOCK, END_PROGRAM or END_CONFIGURATION is found)
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   455
 *   vardecl_list_state -> goto(INITIAL)
952
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   456
 *                         (when a END_FUNCTION, END_FUNCTION_BLOCK, or END_PROGRAM is found)
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   457
 *   config_state       -> goto(INITIAL)
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   458
 *                         (when a END_CONFIGURATION is found)
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   459
 * 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   460
 *  
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   461
 *   sfc_state     -> push current state(sfc_state); goto(body_state)
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   462
 *                     (when parsing an action. This transition is requested by bison)
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   463
 *   sfc_state     -> push current state(sfc_state); goto(sfc_qualifier_state)
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   464
 *                     (when expecting an action qualifier. This transition is requested by bison)
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   465
 *   sfc_qualifier_state -> pop() to sfc_state
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   466
 *                     (when no longer expecting an action qualifier. This transition is requested by bison)
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   467
 *
74
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 73
diff changeset
   468
 *   config_state  -> push(config_state); goto(task_init_state)
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 73
diff changeset
   469
 *                     (when parsing a task initialisation. This transition is requested by bison)
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 73
diff changeset
   470
 *   task_init_state -> pop()
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 73
diff changeset
   471
 *                     (when no longer parsing task initialisation parameters. This transition is requested by bison)
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 73
diff changeset
   472
 *
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   473
 * 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   474
 * There is another secondary state machine for parsing comments, another for file_includes, 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   475
 * and yet another for time literals.
74
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 73
diff changeset
   476
 */
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   477
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   478
952
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   479
/* Bison is in the pre-parsing stage, and we are parsing a POU. Ignore everything up to the end of the POU! */
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   480
%x ignore_pou_state
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   481
%x get_pou_name_state
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
   482
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   483
/* we are parsing a configuration. */
3
38850ee685e6 ST and IL parsing added into flex-bison analyser
lbessard
parents: 1
diff changeset
   484
%s config_state
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   485
74
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 73
diff changeset
   486
/* Inside a configuration, we are parsing a task initialisation parameters */
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 73
diff changeset
   487
/* This means that PRIORITY, SINGLE and INTERVAL must be handled as
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 73
diff changeset
   488
 * tokens, and not as possible identifiers. Note that the above words
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 73
diff changeset
   489
 * are not keywords.
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 73
diff changeset
   490
 */
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 73
diff changeset
   491
%s task_init_state
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 73
diff changeset
   492
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   493
/* we are looking for the first VAR inside a function's, program's or function block's declaration */
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   494
/* This is not exclusive (%x) as we must be able to parse the identifier and data types of a function/FB */
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   495
%s header_state
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   496
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   497
/* we are parsing a function, program or function block sequence of VAR..END_VAR delcarations */
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   498
%x vardecl_list_state 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   499
/* a substate of the vardecl_list_state: we are inside a specific VAR .. END_VAR */
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   500
%s vardecl_state
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   501
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   502
/* we will be parsing a function body/action/transition. Whether il/st/sfc remains to be determined */
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   503
%x body_state
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   504
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   505
/* we are parsing il code -> flex must return the EOL tokens!       */
3
38850ee685e6 ST and IL parsing added into flex-bison analyser
lbessard
parents: 1
diff changeset
   506
%s il_state
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   507
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   508
/* we are parsing st code -> flex must not return the EOL tokens!   */
3
38850ee685e6 ST and IL parsing added into flex-bison analyser
lbessard
parents: 1
diff changeset
   509
%s st_state
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   510
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   511
/* we are parsing sfc code -> flex must not return the EOL tokens!  */
3
38850ee685e6 ST and IL parsing added into flex-bison analyser
lbessard
parents: 1
diff changeset
   512
%s sfc_state
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   513
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   514
/* we are parsing sfc code, and expecting an action qualifier.      */
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   515
%s sfc_qualifier_state
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   516
86
1988bf1634da Adding support for use of PRIORITY as identifier inside SFC.
mario
parents: 84
diff changeset
   517
/* we are parsing sfc code, and expecting the priority token.       */
1988bf1634da Adding support for use of PRIORITY as identifier inside SFC.
mario
parents: 84
diff changeset
   518
%s sfc_priority_state
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   519
547
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   520
/* we are parsing a TIME# literal. We must not return any {identifier} tokens. */
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   521
%x time_literal_state
75
0e381bdb8888 Fixing handling of task initialisation.
mario
parents: 74
diff changeset
   522
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   523
/* we are parsing a comment. */
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   524
%x comment_state
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   525
75
0e381bdb8888 Fixing handling of task initialisation.
mario
parents: 74
diff changeset
   526
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   527
/*******************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   528
/* File #include's */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   529
/*******************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   530
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   531
/* We extend the IEC 61131-3 standard syntax to allow inclusion
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   532
 * of other files, using the IEC 61131-3 pragma directive...
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   533
 * The accepted syntax is:
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   534
 *  {#include "<filename>"}
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   535
 */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   536
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   537
/* the "include" states are used for picking up the name of an include file */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   538
%x include_beg
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   539
%x include_filename
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   540
%x include_end
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   541
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   542
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   543
file_include_pragma_filename	[^\"]*
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   544
file_include_pragma_beg		"{#include"{st_whitespace}\"
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   545
file_include_pragma_end		\"{st_whitespace}"}"
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   546
file_include_pragma			{file_include_pragma_beg}{file_include_pragma_filename}{file_include_pragma_end}
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   547
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   548
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   549
%{
879
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
   550
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
   551
/* A counter to track the order by which each token is processed.
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
   552
 * NOTE: This counter is not exactly linear (i.e., it does not get incremented by 1 for each token).
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
   553
 *       i.e.. it may get incremented by more than one between two consecutive tokens.
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
   554
 *       This is due to the fact that the counter gets incremented every 'user action' in flex,
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
   555
 *       however not every user action will result in a token being passed to bison.
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
   556
 *       Nevertheless this is still OK, as we are only interested in the relative
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
   557
 *       ordering of tokens...
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
   558
 */
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
   559
static long int current_order = 0;
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
   560
  
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   561
typedef struct {
757
f1fc4aa6f0e3 Code cleanup: move tracking functions to flex.
Mario de Sousa <msousa@fe.up.pt>
parents: 756
diff changeset
   562
    int eof;
f1fc4aa6f0e3 Code cleanup: move tracking functions to flex.
Mario de Sousa <msousa@fe.up.pt>
parents: 756
diff changeset
   563
    int lineNumber;
f1fc4aa6f0e3 Code cleanup: move tracking functions to flex.
Mario de Sousa <msousa@fe.up.pt>
parents: 756
diff changeset
   564
    int currentChar;
f1fc4aa6f0e3 Code cleanup: move tracking functions to flex.
Mario de Sousa <msousa@fe.up.pt>
parents: 756
diff changeset
   565
    int lineLength;
f1fc4aa6f0e3 Code cleanup: move tracking functions to flex.
Mario de Sousa <msousa@fe.up.pt>
parents: 756
diff changeset
   566
    int currentTokenStart;
f1fc4aa6f0e3 Code cleanup: move tracking functions to flex.
Mario de Sousa <msousa@fe.up.pt>
parents: 756
diff changeset
   567
    FILE *in_file;
f1fc4aa6f0e3 Code cleanup: move tracking functions to flex.
Mario de Sousa <msousa@fe.up.pt>
parents: 756
diff changeset
   568
  } tracking_t;
f1fc4aa6f0e3 Code cleanup: move tracking functions to flex.
Mario de Sousa <msousa@fe.up.pt>
parents: 756
diff changeset
   569
879
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
   570
/* A forward declaration of a function defined at the end of this file. */
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
   571
void FreeTracking(tracking_t *tracking);
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
   572
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
   573
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
   574
#define MAX_INCLUDE_DEPTH 16
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
   575
757
f1fc4aa6f0e3 Code cleanup: move tracking functions to flex.
Mario de Sousa <msousa@fe.up.pt>
parents: 756
diff changeset
   576
typedef struct {
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   577
	  YY_BUFFER_STATE buffer_state;
757
f1fc4aa6f0e3 Code cleanup: move tracking functions to flex.
Mario de Sousa <msousa@fe.up.pt>
parents: 756
diff changeset
   578
	  tracking_t *env;
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   579
	  const char *filename;
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   580
	} include_stack_t;
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   581
1055
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   582
tracking_t * current_tracking = NULL;
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
   583
tracking_t  previous_tracking;
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   584
include_stack_t include_stack[MAX_INCLUDE_DEPTH];
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   585
int include_stack_ptr = 0;
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   586
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   587
const char *INCLUDE_DIRECTORIES[] = {
40
873a5b60a7ea Fixed -I library include path behavior + removed old lib implementation + added generated lib func names to stage 1_2 + added Makefile.Linux
etisserant
parents: 15
diff changeset
   588
	DEFAULT_LIBDIR,
873a5b60a7ea Fixed -I library include path behavior + removed old lib implementation + added generated lib func names to stage 1_2 + added Makefile.Linux
etisserant
parents: 15
diff changeset
   589
	".",
873a5b60a7ea Fixed -I library include path behavior + removed old lib implementation + added generated lib func names to stage 1_2 + added Makefile.Linux
etisserant
parents: 15
diff changeset
   590
	"/lib",
873a5b60a7ea Fixed -I library include path behavior + removed old lib implementation + added generated lib func names to stage 1_2 + added Makefile.Linux
etisserant
parents: 15
diff changeset
   591
	"/usr/lib",
873a5b60a7ea Fixed -I library include path behavior + removed old lib implementation + added generated lib func names to stage 1_2 + added Makefile.Linux
etisserant
parents: 15
diff changeset
   592
	"/usr/lib/iec",
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   593
	NULL /* must end with NULL!! */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   594
	};
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   595
%}
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   596
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   597
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   598
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   599
/*****************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   600
/* Prelimenary constructs... */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   601
/*****************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   602
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   603
/* PRAGMAS */
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   604
/* ======= */
267
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   605
/* In order to allow the declaration of POU prototypes (Function, FB, Program, ...),
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   606
 * especially the prototypes of Functions and FBs defined in the standard
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   607
 * (i.e. standard functions and FBs), we extend the IEC 61131-3 standard syntax 
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   608
 * with two pragmas to indicate that the code is to be parsed (going through the 
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   609
 * lexical, syntactical, and semantic analysers), but no code is to be generated.
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   610
 * 
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   611
 * The accepted syntax is:
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   612
 *  {no_code_generation begin}
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   613
 *    ... prototypes ...
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   614
 *  {no_code_generation end}
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   615
 * 
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   616
 * When parsing these prototypes the abstract syntax tree will be populated as usual,
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   617
 * allowing the semantic analyser to correctly analyse the semantics of calls to these
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   618
 * functions/FBs. However, stage4 will simply ignore all IEC61131-3 code
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   619
 * between the above two pragmas.
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   620
 */
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   621
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   622
disable_code_generation_pragma	"{disable code generation}"
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   623
enable_code_generation_pragma	"{enable code generation}"
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   624
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   625
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   626
/* Any other pragma... */
869
d88f47549408 fix definition of pragma.
mjsousa
parents: 868
diff changeset
   627
pragma ("{"[^}]*"}")|("{{"([^}]|"}"[^}])*"}}")
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   628
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
   629
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   630
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   631
/* COMMENTS */
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   632
/* ======== */
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   633
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   634
/* In order to allow nested comments, comments are handled by a specific comment_state state */
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   635
/* Whenever a "(*" is found, we push the current state onto the stack, and enter a new instance of the comment_state state.
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   636
 * Whenever a "*)" is found, we pop a state off the stack
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   637
 */
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   638
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   639
/* comments... */
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   640
comment_beg  "(*"
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   641
comment_end  "*)"
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   642
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   643
/* However, bison has a shift/reduce conflict in bison, when parsing formal function/FB
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   644
 * invocations with the 'NOT <variable_name> =>' syntax (which needs two look ahead 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   645
 * tokens to be parsed correctly - and bison being LALR(1) only supports one).
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   646
 * The current work around requires flex to completely parse the '<variable_name> =>'
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   647
 * sequence. This sequence includes whitespace and/or comments between the 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   648
 * <variable_name> and the "=>" token.
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   649
 * 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   650
 * This flex rule (sendto_identifier_token) uses the whitespace/comment as trailing context,
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   651
 * which means we can not use the comment_state method of specifying/finding and ignoring 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   652
 * comments.
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   653
 * 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   654
 * For this reason only, we must also define what a complete comment looks like, so
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   655
 * it may be used in this rule. Since the rule uses the whitespace_or_comment
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   656
 * construct as trailing context, this definition of comment must not use any
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   657
 * trailing context either.
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   658
 * 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   659
 * Aditionally, it is not possible to define nested comments in flex without the use of
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   660
 * states, so for this particular location, we do NOT support nested comments.
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   661
 */
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   662
/* NOTE: this seemingly unnecessary complex definition is required
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   663
 *       to be able to eat up comments such as:
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   664
 *          '(* Testing... ! ***** ******)'
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   665
 *       without using the trailing context command in flex (/{context})
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   666
 *       since {comment} itself will later be used with
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   667
 *       trailing context ({comment}/{context})
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   668
 */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   669
not_asterisk				[^*]
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   670
not_close_parenthesis_nor_asterisk	[^*)]
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   671
asterisk				"*"
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   672
comment_text	({not_asterisk})|(({asterisk}+){not_close_parenthesis_nor_asterisk})
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   673
comment		"(*"({comment_text}*)({asterisk}+)")"
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   674
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   675
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   676
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   677
/* 3.1 Whitespace */
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   678
/* ============== */
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   679
/*
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   680
 * Whitespace is clearly defined (see IEC 61131-3 v2, section 2.1.4)
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   681
 * 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   682
 * Whitespace definition includes the newline character.
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   683
 * 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   684
 * However, the standard is inconsistent in that in IL the newline character 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   685
 * is considered a token (EOL - end of line). 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   686
 * In our implementation we therefore have two definitions of whitespace
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   687
 *   - one for ST, that includes the newline character
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   688
 *   - one for IL without the newline character.
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   689
 * Additionally, when parsing IL, the newline character is treated as the EOL token.
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   690
 * This requires the use of a state machine in the lexical parser that needs at least 
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   691
 * some knowledge of the syntax itself.
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   692
 *
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   693
 * NOTE: Our definition of whitespace will only work in ASCII!
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   694
 *
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   695
 * NOTE: we cannot use
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   696
 *         st_whitespace	[:space:]*
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   697
 *       since we use {st_whitespace} as trailing context. In our case
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   698
 *       this would not constitute "dangerous trailing context", but the
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   699
 *       lexical generator (i.e. flex) does not know this (since it does
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   700
 *       not know which characters belong to the set [:space:]), and will
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   701
 *       generate a "dangerous trailing context" warning!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   702
 *       We use this alternative just to stop the flex utility from
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   703
 *       generating the invalid (in this case) warning...
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   704
 */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   705
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   706
st_whitespace			[ \f\n\r\t\v]*
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   707
il_whitespace			[ \f\r\t\v]*
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   708
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   709
st_whitespace_or_pragma_or_commentX	({st_whitespace})|({pragma})|({comment})
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   710
il_whitespace_or_pragma_or_commentX	({il_whitespace})|({pragma})|({comment})
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   711
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   712
st_whitespace_or_pragma_or_comment	{st_whitespace_or_pragma_or_commentX}*
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   713
il_whitespace_or_pragma_or_comment	{il_whitespace_or_pragma_or_commentX}*
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   714
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   715
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   716
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
   717
qualified_identifier	{identifier}(\.{identifier})+
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   718
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   719
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   720
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   721
/*****************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   722
/* B.1.1 Letters, digits and identifiers */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   723
/*****************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   724
/* NOTE: The following definitions only work if the host computer
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   725
 *       is using the ASCII maping. For e.g., with EBCDIC [A-Z]
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   726
 *       contains non-alphabetic characters!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   727
 *       The correct way of doing it would be to use
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   728
 *       the [:upper:] etc... definitions.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   729
 *
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   730
 *       Unfortunately, further on we need all printable
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   731
 *       characters (i.e. [:print:]), but excluding '$'.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   732
 *       Flex does not allow sets to be composed by excluding
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   733
 *       elements. Sets may only be constructed by adding new
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   734
 *       elements, which means that we have to revert to
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   735
 *       [\x20\x21\x23\x25\x26\x28-x7E] for the definition
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   736
 *       of the printable characters with the required exceptions.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   737
 *       The above also implies the use of ASCII, but now we have
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   738
 *       no way to work around it|
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   739
 *
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   740
 *       The conclusion is that our parser is limited to ASCII
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   741
 *       based host computers!!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   742
 */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   743
letter		[A-Za-z]
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   744
digit		[0-9]
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   745
octal_digit	[0-7]
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   746
hex_digit	{digit}|[A-F]
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   747
identifier	({letter}|(_({letter}|{digit})))((_?({letter}|{digit}))*)
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   748
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   749
/*******************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   750
/* B.1.2 Constants */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   751
/*******************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   752
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   753
/******************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   754
/* B.1.2.1   Numeric literals */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   755
/******************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   756
integer         {digit}((_?{digit})*)
547
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   757
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   758
/* Some helper symbols for parsing TIME literals... */
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   759
integer_0_59    (0(_?))*([0-5](_?))?{digit}
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   760
integer_0_19    (0(_?))*([0-1](_?))?{digit}
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   761
integer_20_23   (0(_?))*2(_?)[0-3]
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   762
integer_0_23    {integer_0_19}|{integer_20_23}
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   763
integer_0_999   {digit}((_?{digit})?)((_?{digit})?)
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   764
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   765
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   766
binary_integer  2#{bit}((_?{bit})*)
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   767
bit		[0-1]
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   768
octal_integer   8#{octal_digit}((_?{octal_digit})*)
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   769
hex_integer     16#{hex_digit}((_?{hex_digit})*)
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   770
exponent        [Ee]([+-]?){integer}
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   771
/* The correct definition for real would be:
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   772
 * real		{integer}\.{integer}({exponent}?)
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   773
 *
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   774
 * Unfortunately, the spec also defines fixed_point (B 1.2.3.1) as:
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   775
 * fixed_point		{integer}\.{integer}
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   776
 *
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   777
 * This means that {integer}\.{integer} could be interpreted
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   778
 * as either a fixed_point or a real.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   779
 * I have opted to interpret {integer}\.{integer} as a fixed_point.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   780
 * In order to do this, the definition of real has been changed to:
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   781
 * real		{integer}\.{integer}{exponent}
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   782
 *
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   783
 * This means that the syntax parser now needs to define a real to be
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   784
 * either a real_token or a fixed_point_token!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   785
 */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   786
real		{integer}\.{integer}{exponent}
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   787
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   788
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   789
/*******************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   790
/* B.1.2.2   Character Strings */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   791
/*******************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   792
/*
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   793
common_character_representation :=
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   794
<any printable character except '$', '"' or "'">
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   795
|'$$'
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   796
|'$L'|'$N'|'$P'|'$R'|'$T'
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   797
|'$l'|'$n'|'$p'|'$r'|'$t'
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   798
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   799
NOTE: 	$ = 0x24
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   800
	" = 0x22
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   801
	' = 0x27
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   802
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   803
	printable chars in ASCII: 0x20-0x7E
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   804
*/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   805
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   806
esc_char_u		$L|$N|$P|$R|$T
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   807
esc_char_l		$l|$n|$p|$r|$t
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   808
esc_char		$$|{esc_char_u}|{esc_char_l}
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   809
double_byte_char	(${hex_digit}{hex_digit}{hex_digit}{hex_digit})
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   810
single_byte_char	(${hex_digit}{hex_digit})
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   811
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   812
/* WARNING:
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   813
 * This definition is only valid in ASCII...
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   814
 *
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   815
 * Flex includes the function print_char() that defines
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   816
 * all printable characters portably (i.e. whatever character
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   817
 * encoding is currently being used , ASCII, EBCDIC, etc...)
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   818
 * Unfortunately, we cannot generate the definition of
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   819
 * common_character_representation portably, since flex
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   820
 * does not allow definition of sets by subtracting
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   821
 * elements in one set from another set.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   822
 * This means we must build up the defintion of
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   823
 * common_character_representation using only set addition,
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   824
 * which leaves us with the only choice of defining the
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   825
 * characters non-portably...
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   826
 */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   827
common_character_representation		[\x20\x21\x23\x25\x26\x28-\x7E]|{esc_char}
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   828
double_byte_character_representation 	$\"|'|{double_byte_char}|{common_character_representation}
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   829
single_byte_character_representation 	$'|\"|{single_byte_char}|{common_character_representation}
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   830
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   831
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   832
double_byte_character_string	\"({double_byte_character_representation}*)\"
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   833
single_byte_character_string	'({single_byte_character_representation}*)'
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   834
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   835
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   836
/************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   837
/* B 1.2.3.1 - Duration */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   838
/************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   839
fixed_point		{integer}\.{integer}
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   840
547
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   841
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   842
/* NOTE: The IEC 61131-3 v2 standard has an incorrect formal syntax definition of duration,
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   843
 *       as its definition does not match the standard's text.
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   844
 *       IEC 61131-3 v3 (committee draft) seems to have this fixed, so we use that
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   845
 *       definition instead!
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   846
 *
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   847
 *       duration::= ('T' | 'TIME') '#' ['+'|'-'] interval
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   848
 *       interval::= days | hours | minutes | seconds | milliseconds
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   849
 *       fixed_point  ::= integer [ '.' integer]
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   850
 *       days         ::= fixed_point 'd' | integer 'd' ['_'] [ hours ]
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   851
 *       hours        ::= fixed_point 'h' | integer 'h' ['_'] [ minutes ]
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   852
 *       minutes      ::= fixed_point 'm' | integer 'm' ['_'] [ seconds ]
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   853
 *       seconds      ::= fixed_point 's' | integer 's' ['_'] [ milliseconds ]
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   854
 *       milliseconds ::= fixed_point 'ms'
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   855
 * 
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   856
 * 
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   857
 *  The original IEC 61131-3 v2 definition is:
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   858
 *       duration ::= ('T' | 'TIME') '#' ['-'] interval
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   859
 *       interval ::= days | hours | minutes | seconds | milliseconds
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   860
 *       fixed_point  ::= integer [ '.' integer]
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   861
 *       days         ::= fixed_point 'd' | integer 'd' ['_'] hours
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   862
 *       hours        ::= fixed_point 'h' | integer 'h' ['_'] minutes
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   863
 *       minutes      ::= fixed_point 'm' | integer 'm' ['_'] seconds
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   864
 *       seconds      ::= fixed_point 's' | integer 's' ['_'] milliseconds
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   865
 *       milliseconds ::= fixed_point 'ms'
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   866
 */
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   867
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   868
interval_ms_X		({integer_0_999}(\.{integer})?)ms
686
9b87606d4c07 Fix processing of TIME literals (submited by Andreas)
Mario de Sousa <msousa@fe.up.pt>
parents: 627
diff changeset
   869
interval_s_X		{integer_0_59}s(_?{interval_ms_X})?|({integer_0_59}(\.{integer})?s)
9b87606d4c07 Fix processing of TIME literals (submited by Andreas)
Mario de Sousa <msousa@fe.up.pt>
parents: 627
diff changeset
   870
interval_m_X		{integer_0_59}m(_?{interval_s_X})?|({integer_0_59}(\.{integer})?m)
9b87606d4c07 Fix processing of TIME literals (submited by Andreas)
Mario de Sousa <msousa@fe.up.pt>
parents: 627
diff changeset
   871
interval_h_X		{integer_0_23}h(_?{interval_m_X})?|({integer_0_23}(\.{integer})?h)
547
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   872
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   873
interval_ms		{integer}ms|({fixed_point}ms)
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   874
interval_s		{integer}s(_?{interval_ms_X})?|({fixed_point}s)
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   875
interval_m		{integer}m(_?{interval_s_X})?|({fixed_point}m)
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   876
interval_h		{integer}h(_?{interval_m_X})?|({fixed_point}h)
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   877
interval_d		{integer}d(_?{interval_h_X})?|({fixed_point}d)
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   878
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   879
interval		{interval_ms}|{interval_s}|{interval_m}|{interval_h}|{interval_d}
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   880
686
9b87606d4c07 Fix processing of TIME literals (submited by Andreas)
Mario de Sousa <msousa@fe.up.pt>
parents: 627
diff changeset
   881
547
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   882
/* to help provide nice error messages, we also parse an incorrect but plausible interval... */
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   883
/* NOTE that this erroneous interval will be parsed outside the time_literal_state, so must not 
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   884
 *      be able to parse any other legal lexcial construct (besides a legal interval, but that
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   885
 *      is OK as this rule will appear _after_ the rule to parse legal intervals!).
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   886
 */
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   887
fixed_point_or_integer  {fixed_point}|{integer}
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   888
erroneous_interval	({fixed_point_or_integer}d_?)?({fixed_point_or_integer}h_?)?({fixed_point_or_integer}m_?)?({fixed_point_or_integer}s_?)?({fixed_point_or_integer}ms)?
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   889
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   890
/********************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   891
/* B.1.4.1   Directly Represented Variables */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   892
/********************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   893
/* The correct definition, if the standard were to be followed... */
11
8ce37f36d744 Add support for correct syntax of direct variables.
mario
parents: 9
diff changeset
   894
8ce37f36d744 Add support for correct syntax of direct variables.
mario
parents: 9
diff changeset
   895
location_prefix			[IQM]
8ce37f36d744 Add support for correct syntax of direct variables.
mario
parents: 9
diff changeset
   896
size_prefix			[XBWDL]
8ce37f36d744 Add support for correct syntax of direct variables.
mario
parents: 9
diff changeset
   897
direct_variable_standard	%{location_prefix}({size_prefix}?){integer}((.{integer})*)
8ce37f36d744 Add support for correct syntax of direct variables.
mario
parents: 9
diff changeset
   898
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   899
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   900
/* For the MatPLC, we will accept %<identifier>
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   901
 * as a direct variable, this being mapped onto the MatPLC point
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   902
 * named <identifier>
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   903
 */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   904
/* TODO: we should not restrict it to only the accepted syntax
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   905
 * of <identifier> as specified by the standard. MatPLC point names
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   906
 * have a more permissive syntax.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   907
 *
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   908
 * e.g. "P__234"
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   909
 *    Is a valid MatPLC point name, but not a valid <identifier> !!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   910
 *    The same happens with names such as "333", "349+23", etc...
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   911
 *    How can we handle these more expressive names in our case?
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   912
 *    Remember that some direct variable may remain anonymous, with
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   913
 *    declarations such as:
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   914
 *    VAR
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   915
 *       AT %I3 : BYTE := 255;
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   916
 *    END_VAR
11
8ce37f36d744 Add support for correct syntax of direct variables.
mario
parents: 9
diff changeset
   917
 *    in which case we are currently using "%I3" as the variable
8ce37f36d744 Add support for correct syntax of direct variables.
mario
parents: 9
diff changeset
   918
 *    name.
8ce37f36d744 Add support for correct syntax of direct variables.
mario
parents: 9
diff changeset
   919
 */
547
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   920
/* direct_variable_matplc		%{identifier} */
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   921
/* direct_variable			{direct_variable_standard}|{direct_variable_matplc} */
dab341e80664 Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents: 415
diff changeset
   922
direct_variable			{direct_variable_standard}
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   923
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   924
/******************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   925
/* B 1.4.3 - Declaration & Initialisation */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   926
/******************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   927
incompl_location	%[IQM]\*
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   928
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   929
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   930
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   931
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   932
%%
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   933
	/* fprintf(stderr, "flex: state %d\n", YY_START); */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   934
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   935
	/*****************************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   936
	/*****************************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   937
	/*****************************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   938
	/*****                                           *****/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   939
	/*****                                           *****/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   940
	/*****   F I R S T    T H I N G S    F I R S T   *****/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   941
	/*****                                           *****/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   942
	/*****                                           *****/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   943
	/*****************************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   944
	/*****************************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   945
	/*****************************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   946
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   947
	/***********************************************************/
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   948
	/* Handle requests sent by bison for flex to change state. */
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   949
	/***********************************************************/
13
77174ccc5471 Many major changes to support SFC!
mario
parents: 11
diff changeset
   950
	if (get_goto_body_state()) {
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   951
	  yy_push_state(body_state);
13
77174ccc5471 Many major changes to support SFC!
mario
parents: 11
diff changeset
   952
	  rst_goto_body_state();
6
94741aa26423 Changing from decl_state directly to sfc_state
mario
parents: 4
diff changeset
   953
	}
3
38850ee685e6 ST and IL parsing added into flex-bison analyser
lbessard
parents: 1
diff changeset
   954
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   955
	if (get_goto_sfc_qualifier_state()) {
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   956
	  yy_push_state(sfc_qualifier_state);
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   957
	  rst_goto_sfc_qualifier_state();
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   958
	}
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   959
86
1988bf1634da Adding support for use of PRIORITY as identifier inside SFC.
mario
parents: 84
diff changeset
   960
	if (get_goto_sfc_priority_state()) {
1988bf1634da Adding support for use of PRIORITY as identifier inside SFC.
mario
parents: 84
diff changeset
   961
	  yy_push_state(sfc_priority_state);
1988bf1634da Adding support for use of PRIORITY as identifier inside SFC.
mario
parents: 84
diff changeset
   962
	  rst_goto_sfc_priority_state();
1988bf1634da Adding support for use of PRIORITY as identifier inside SFC.
mario
parents: 84
diff changeset
   963
	}
1988bf1634da Adding support for use of PRIORITY as identifier inside SFC.
mario
parents: 84
diff changeset
   964
74
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 73
diff changeset
   965
	if (get_goto_task_init_state()) {
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 73
diff changeset
   966
	  yy_push_state(task_init_state);
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 73
diff changeset
   967
	  rst_goto_task_init_state();
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 73
diff changeset
   968
	}
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 73
diff changeset
   969
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   970
	if (get_pop_state()) {
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   971
	  yy_pop_state();
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   972
	  rst_pop_state();
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   973
	}
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   974
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   975
	/***************************/
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   976
	/* Handle the pragmas!     */
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   977
	/***************************/
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   978
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   979
	/* We start off by searching for the pragmas we handle in the lexical parser. */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   980
<INITIAL>{file_include_pragma}	unput_text(0); yy_push_state(include_beg);
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   981
267
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
   982
	/* Pragmas sent to syntax analyser (bison) */
1016
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   983
	/* NOTE: In the vardecl_list_state we only process the pragmas between two consecutive VAR .. END_VAR blocks.
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   984
	 *       We do not process any pragmas trailing after the last END_VAR. We leave that to the body_state.
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   985
	 *       This is because the pragmas are stored in a statement_list or instruction_list (in bison),
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   986
	 *       but these lists must start with the special tokens start_IL_body_token/start_ST_body_token.
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   987
	 *       This means that these special tokens must be generated (by the body_state) before processing
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   988
	 *       the pragme => we cannot process the trailing pragmas in the vardecl_list_state state.
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   989
	 */
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   990
{disable_code_generation_pragma}				return disable_code_generation_pragma_token;
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   991
{enable_code_generation_pragma}					return enable_code_generation_pragma_token;
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   992
<vardecl_list_state>{disable_code_generation_pragma}/(VAR)	return disable_code_generation_pragma_token; 
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   993
<vardecl_list_state>{enable_code_generation_pragma}/(VAR)	return enable_code_generation_pragma_token;  
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   994
<body_state>{disable_code_generation_pragma}			append_bodystate_buffer(yytext); /* in body state we do not process any tokens, we simply store them for later processing! */
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   995
<body_state>{enable_code_generation_pragma}			append_bodystate_buffer(yytext); /* in body state we do not process any tokens, we simply store them for later processing! */
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   996
	/* Any other pragma we find, we just pass it up to the syntax parser...   */
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
   997
	/* Note that the <body_state> state is exclusive, so we have to include it here too. */
1016
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
   998
<body_state>{pragma}					append_bodystate_buffer(yytext); /* in body state we do not process any tokens, we simply store them for later processing! */
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
   999
{pragma}	{/* return the pragmma without the enclosing '{' and '}' */
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1000
		 int cut = yytext[1]=='{'?2:1;
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: 627
diff changeset
  1001
		 yytext[strlen(yytext)-cut] = '\0';
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: 627
diff changeset
  1002
		 yylval.ID=strdup(yytext+cut);
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1003
		 return pragma_token;
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1004
		}
1016
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1005
<vardecl_list_state>{pragma}/(VAR) {/* return the pragmma without the enclosing '{' and '}' */
701
562c01f82afb Fix pragma with double bracket token stripping
Laurent Bessard
parents: 637
diff changeset
  1006
		 int cut = yytext[1]=='{'?2:1;
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
  1007
		 yytext[strlen(yytext)-cut] = '\0';
701
562c01f82afb Fix pragma with double bracket token stripping
Laurent Bessard
parents: 637
diff changeset
  1008
		 yylval.ID=strdup(yytext+cut);
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1009
		 return pragma_token;
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1010
		}
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1011
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1012
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1013
	/*********************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1014
	/* Handle the file includes!     */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1015
	/*********************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1016
<include_beg>{file_include_pragma_beg}	BEGIN(include_filename);
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1017
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1018
<include_filename>{file_include_pragma_filename}	{
756
634f476cb60f Insert the auto generated enum datatype conversion functions after the TYPE...END_TYPE, instead of at the end of input file.
Mario de Sousa <msousa@fe.up.pt>
parents: 737
diff changeset
  1019
			  /* set the internal state variables of lexical analyser to process a new include file */
634f476cb60f Insert the auto generated enum datatype conversion functions after the TYPE...END_TYPE, instead of at the end of input file.
Mario de Sousa <msousa@fe.up.pt>
parents: 737
diff changeset
  1020
			  include_file(yytext);
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1021
			  /* switch to whatever state was active before the include file */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1022
			  yy_pop_state();
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1023
			  /* now process the new file... */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1024
			}
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1025
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1026
761
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1027
<<EOF>>			{     /* NOTE: Currently bison is incorrectly using END_OF_INPUT in many rules
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1028
			       *       when checking for syntax errors in the input source code.
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1029
			       *       This means that in reality flex will be asked to carry on reading the input
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1030
			       *       even after it has reached the end of all (including the main) input files.
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1031
			       *       In other owrds, we will be called to return more tokens, even after we have
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1032
			       *       already returned an END_OF_INPUT token. In this case, we must carry on returning
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1033
			       *       more END_OF_INPUT tokens.
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1034
			       * 
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1035
			       *       However, in the above case we will be asked to carry on reading more tokens 
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1036
			       *       from the main input file, after we have reached the end. For this to work
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1037
			       *       correctly, we cannot close the main input file!
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1038
			       * 
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1039
			       *       This is why we WILL be called with include_stack_ptr == 0 multiple times,
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1040
			       *       and why we must handle it as a special case
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1041
			       *       that leaves the include_stack_ptr unchanged, and returns END_OF_INPUT once again.
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1042
			       * 
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1043
			       *       As a corollory, flex can never safely close the main input file, and we must ask
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1044
			       *       bison to close it!
76
ec7799ec929b fixing include bug (only ocured for includes in main program file).
mario
parents: 75
diff changeset
  1045
			       */
ec7799ec929b fixing include bug (only ocured for includes in main program file).
mario
parents: 75
diff changeset
  1046
			  if (include_stack_ptr == 0) {
761
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1047
			      // fclose(yyin);           // Must not do this!!
879
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
  1048
			      // FreeTracking(current_tracking); // Must not do this!!
73
0e623bbdee95 fixing infinite error loops at library level, and ...
mario
parents: 72
diff changeset
  1049
			      /* yyterminate() terminates the scanner and returns a 0 to the 
0e623bbdee95 fixing infinite error loops at library level, and ...
mario
parents: 72
diff changeset
  1050
			       * scanner's  caller, indicating "all done".
0e623bbdee95 fixing infinite error loops at library level, and ...
mario
parents: 72
diff changeset
  1051
			       *	
0e623bbdee95 fixing infinite error loops at library level, and ...
mario
parents: 72
diff changeset
  1052
			       * Our syntax parser (written with bison) has the token	
0e623bbdee95 fixing infinite error loops at library level, and ...
mario
parents: 72
diff changeset
  1053
			       * END_OF_INPUT associated to the value 0, so even though
0e623bbdee95 fixing infinite error loops at library level, and ...
mario
parents: 72
diff changeset
  1054
			       * we don't explicitly return the token END_OF_INPUT
0e623bbdee95 fixing infinite error loops at library level, and ...
mario
parents: 72
diff changeset
  1055
			       * calling yyterminate() is equivalent to doing that. 
0e623bbdee95 fixing infinite error loops at library level, and ...
mario
parents: 72
diff changeset
  1056
			       */ 	
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1057
			    yyterminate();
737
f6bc5230aadd Fix comments and code alignment
Mario de Sousa <msousa@fe.up.pt>
parents: 686
diff changeset
  1058
			  } else {
761
7b52623a2f37 Allow bison to ask for an END_OF_INPUT token multiple times!
mjsousa
parents: 757
diff changeset
  1059
			    fclose(yyin);
879
c61b2e370181 Fix memory leak in lexical parser.
mjsousa
parents: 876
diff changeset
  1060
			    FreeTracking(current_tracking);
136
32bd7ef40897 Adding some improvements:
lbessard
parents: 131
diff changeset
  1061
			    --include_stack_ptr;
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1062
			    yy_delete_buffer(YY_CURRENT_BUFFER);
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1063
			    yy_switch_to_buffer((include_stack[include_stack_ptr]).buffer_state);
136
32bd7ef40897 Adding some improvements:
lbessard
parents: 131
diff changeset
  1064
			    current_tracking = include_stack[include_stack_ptr].env;
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1065
			      /* removing constness of char *. This is safe actually,
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1066
			       * since the only real const char * that is stored on the stack is
1
5d893a68be6e Changes made since Mario visit at LOLITECH. Thanks again !
etisserant
parents: 0
diff changeset
  1067
			       * the first one (i.e. the one that gets stored in include_stack[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
  1068
			       * which is never free'd!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1069
			       */
286
a4f4990d5c66 Adding tracking of filename in which token is located.
Mario de Sousa <msousa@fe.up.pt>
parents: 267
diff changeset
  1070
			    /* NOTE: We do __NOT__ free the malloc()'d memory since 
a4f4990d5c66 Adding tracking of filename in which token is located.
Mario de Sousa <msousa@fe.up.pt>
parents: 267
diff changeset
  1071
			     *       pointers to this filename will be kept by many objects
a4f4990d5c66 Adding tracking of filename in which token is located.
Mario de Sousa <msousa@fe.up.pt>
parents: 267
diff changeset
  1072
			     *       in the abstract syntax tree.
a4f4990d5c66 Adding tracking of filename in which token is located.
Mario de Sousa <msousa@fe.up.pt>
parents: 267
diff changeset
  1073
			     *       This will later be used to provide correct error
a4f4990d5c66 Adding tracking of filename in which token is located.
Mario de Sousa <msousa@fe.up.pt>
parents: 267
diff changeset
  1074
			     *       messages during semantic analysis (stage 3)
a4f4990d5c66 Adding tracking of filename in which token is located.
Mario de Sousa <msousa@fe.up.pt>
parents: 267
diff changeset
  1075
			     */
a4f4990d5c66 Adding tracking of filename in which token is located.
Mario de Sousa <msousa@fe.up.pt>
parents: 267
diff changeset
  1076
			    /* free((char *)current_filename); */
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1077
			    current_filename = include_stack[include_stack_ptr].filename;
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1078
			    yy_push_state(include_end);
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1079
			  }
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1080
			}
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1081
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1082
<include_end>{file_include_pragma_end}	yy_pop_state();
756
634f476cb60f Insert the auto generated enum datatype conversion functions after the TYPE...END_TYPE, instead of at the end of input file.
Mario de Sousa <msousa@fe.up.pt>
parents: 737
diff changeset
  1083
	/* handle the artificial file includes created by include_string(), which do not end with a '}' */
634f476cb60f Insert the auto generated enum datatype conversion functions after the TYPE...END_TYPE, instead of at the end of input file.
Mario de Sousa <msousa@fe.up.pt>
parents: 737
diff changeset
  1084
<include_end>.				unput_text(0); yy_pop_state(); 
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1085
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1086
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1087
	/*********************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1088
	/* Handle all the state changes! */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1089
	/*********************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1090
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
  1091
	/* INITIAL -> header_state */
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1092
<INITIAL>{
1016
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1093
FUNCTION{st_whitespace} 		if (get_preparse_state()) BEGIN(get_pou_name_state); else {BEGIN(header_state);/* printf("\nChanging to header_state\n"); */} return FUNCTION;
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1094
FUNCTION_BLOCK{st_whitespace}		if (get_preparse_state()) BEGIN(get_pou_name_state); else {BEGIN(header_state);/* printf("\nChanging to header_state\n"); */} return FUNCTION_BLOCK;
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1095
PROGRAM{st_whitespace}			if (get_preparse_state()) BEGIN(get_pou_name_state); else {BEGIN(header_state);/* printf("\nChanging to header_state\n"); */} return PROGRAM;
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1096
CONFIGURATION{st_whitespace}		if (get_preparse_state()) BEGIN(get_pou_name_state); else {BEGIN(config_state);/* printf("\nChanging to config_state\n"); */} return CONFIGURATION;
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1097
}
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1098
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1099
<get_pou_name_state>{
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1100
{identifier}			BEGIN(ignore_pou_state); yylval.ID=strdup(yytext); return identifier_token;
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1101
.				BEGIN(ignore_pou_state); unput_text(0);
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1102
}
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1103
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1104
<ignore_pou_state>{
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1105
END_FUNCTION			unput_text(0); BEGIN(INITIAL);
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1106
END_FUNCTION_BLOCK		unput_text(0); BEGIN(INITIAL);
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1107
END_PROGRAM			unput_text(0); BEGIN(INITIAL);
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1108
END_CONFIGURATION		unput_text(0); BEGIN(INITIAL);
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1109
.|\n				{}/* Ignore text inside POU! (including the '\n' character!)) */
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1110
}
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1111
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1112
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1113
	/* header_state -> (vardecl_list_state) */
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1114
	/* NOTE: This transition assumes that all POUs with code (Function, FB, and Program) will always contain
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1115
	 *       at least one VAR_XXX block.
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1116
	 *      How about functions that do not declare variables, and go directly to the body_state???
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1117
	 *      - According to Section 2.5.1.3 (Function Declaration), item 2 in the list, a FUNCTION
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1118
	 *        must have at least one input argument, so a correct declaration will have at least
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1119
	 *        one VAR_INPUT ... VAR_END construct!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1120
	 *      - According to Section 2.5.2.2 (Function Block Declaration), a FUNCTION_BLOCK
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1121
	 *        must have at least one input argument, so a correct declaration will have at least
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1122
	 *        one VAR_INPUT ... VAR_END construct!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1123
	 *      - According to Section 2.5.3 (Programs), a PROGRAM must have at least one input
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1124
	 *        argument, so a correct declaration will have at least one VAR_INPUT ... VAR_END
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1125
	 *        construct!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1126
	 *
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1127
	 *       All the above means that we needn't worry about PROGRAMs, FUNCTIONs or
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
  1128
	 *       FUNCTION_BLOCKs that do not have at least one VAR_END before the body_state.
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1129
	 *       If the code has an error, and no VAR_END before the body, we will simply
1016
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1130
	 *       continue in the <vardecl_state> state, until the end of the FUNCTION, FUNCTION_BLOCK
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1131
	 *       or PROGAM.
1016
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1132
	 * 
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1133
	 * WARNING: From 2016-05 (May 2016) onwards, matiec supports a non-standard option in which a Function
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1134
	 *          may be declared with no Input, Output or IN_OUT variables. This means that the above 
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1135
	 *          assumption is no longer valid.
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1136
	 *          To make things simpler (i.e. so we do not need to change the transition conditions in the flex state machine),
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1137
	 *          when using this non-standard extension matiec requires that Functions must include at least one 
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1138
	 *          VAR .. END_VAR block. This implies that the above assumption remains valid!
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1139
	 *          This limitation of requiring a VAR .. END_VAR block is not really very limiting, as a function
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1140
	 *          with no input and output parameters will probably need to do some 'work', and for that it will
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1141
	 *          probably need some local variables declared in a VAR .. END_VAR block.
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1142
	 *          Note however that in the extreme it might make sense to have a function with no variables whatsoever
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1143
	 *          (e.g.: a function that only calls other functions that all return VOID - another non standard extension!).
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1144
	 *          For now we do not consider this!!
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1145
	 */
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
  1146
<header_state>{
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1147
VAR				| /* execute the next rule's action, i.e. fall-through! */
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1148
VAR_INPUT			|
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1149
VAR_OUTPUT			|
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1150
VAR_IN_OUT			|
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1151
VAR_EXTERNAL			|
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1152
VAR_GLOBAL			|
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1153
VAR_TEMP			|
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1154
VAR_CONFIG			|
1016
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1155
VAR_ACCESS			unput_text(0); /* printf("\nChanging to vardecl_list_state\n") */; BEGIN(vardecl_list_state);
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1156
}
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1157
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1158
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1159
	/* vardecl_list_state -> (vardecl_state | body_state | INITIAL) */
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
  1160
<vardecl_list_state>{
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1161
VAR_INPUT			| /* execute the next rule's action, i.e. fall-through! */
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1162
VAR_OUTPUT			|
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1163
VAR_IN_OUT			|
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1164
VAR_EXTERNAL			|
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1165
VAR_GLOBAL			|
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1166
VAR_TEMP			|
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1167
VAR_CONFIG			|
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1168
VAR_ACCESS			|
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
  1169
VAR				unput_text(0); yy_push_state(vardecl_state);
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1170
1010
242907849850 Correctly identify errors when parsing erroneous code (make sure flex goes back to INITIAL state when code contains errors that do not allow determining whether ST or IL is being parsed)
mjsousa
parents: 952
diff changeset
  1171
END_FUNCTION			unput_text(0); BEGIN(INITIAL);
242907849850 Correctly identify errors when parsing erroneous code (make sure flex goes back to INITIAL state when code contains errors that do not allow determining whether ST or IL is being parsed)
mjsousa
parents: 952
diff changeset
  1172
END_FUNCTION_BLOCK		unput_text(0); BEGIN(INITIAL);
242907849850 Correctly identify errors when parsing erroneous code (make sure flex goes back to INITIAL state when code contains errors that do not allow determining whether ST or IL is being parsed)
mjsousa
parents: 952
diff changeset
  1173
END_PROGRAM			unput_text(0); BEGIN(INITIAL);
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1174
1055
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
  1175
				/* NOTE: Handling of whitespace...
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
  1176
				 *   - Must come __before__ the next rule for any single character '.'
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
  1177
				 *   - If the rules were reversed, any whitespace with a single space (' ') 
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
  1178
				 *     would be handled by the '.' rule instead of the {whitespace} rule!
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
  1179
				 */
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
  1180
{st_whitespace}			/* Eat any whitespace */ 
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
  1181
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
  1182
				/* anything else, just change to body_state! */
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
  1183
.				unput_text(0); yy_push_state(body_state); //printf("\nChanging to body_state\n");
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1184
}
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1185
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1186
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1187
	/* vardecl_list_state -> pop to $previous_state (vardecl_list_state) */
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
  1188
<vardecl_state>{
948
543f8319bdf8 Fix main state machine in flex (states were being pushed without being poped from the stack)
mjsousa
parents: 934
diff changeset
  1189
END_VAR				yy_pop_state(); return END_VAR; /* pop back to vardecl_list_state */
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
  1190
}
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
  1191
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1192
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1193
	/* body_state -> (il_state | st_state | sfc_state) */
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
  1194
<body_state>{
1020
36fb9443b6ea fix bug introduced by commit 91bef6704b44 (parsing SFCs with transitions in ST and leading whitespace => endless loop)
mjsousa
parents: 1016
diff changeset
  1195
{st_whitespace}			{/* In body state we do not process any tokens,
36fb9443b6ea fix bug introduced by commit 91bef6704b44 (parsing SFCs with transitions in ST and leading whitespace => endless loop)
mjsousa
parents: 1016
diff changeset
  1196
				  * we simply store them for later processing!
1055
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
  1197
				  * NOTE: we must return ALL text when in body_state, including
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
  1198
				  * all comments and whitespace, so as not
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
  1199
				  * to lose track of the line_number and column number
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
  1200
				  * used when printing debugging messages.
1056
a47dc03f0e53 fix bug introduced in previous commit (matiec was unable to parse SFC code)
Mario de Sousa <msousa@fe.up.pt>
parents: 1055
diff changeset
  1201
				  * NOTE: some of the following rules depend on the fact that 
1055
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
  1202
				  * the body state buffer is either empty or only contains white space up to
1056
a47dc03f0e53 fix bug introduced in previous commit (matiec was unable to parse SFC code)
Mario de Sousa <msousa@fe.up.pt>
parents: 1055
diff changeset
  1203
				  * that point. Since the vardecl_list_state will eat up all
1055
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
  1204
				  * whitespace before entering the body_state, the contents of the bodystate_buffer
1056
a47dc03f0e53 fix bug introduced in previous commit (matiec was unable to parse SFC code)
Mario de Sousa <msousa@fe.up.pt>
parents: 1055
diff changeset
  1205
				  * will _never_ start with whitespace if the previous state was vardecl_list_state. 
a47dc03f0e53 fix bug introduced in previous commit (matiec was unable to parse SFC code)
Mario de Sousa <msousa@fe.up.pt>
parents: 1055
diff changeset
  1206
				  * However, it is possible to enter the body_state from other states (e.g. when 
a47dc03f0e53 fix bug introduced in previous commit (matiec was unable to parse SFC code)
Mario de Sousa <msousa@fe.up.pt>
parents: 1055
diff changeset
  1207
				  * parsing SFC code, that contains transitions or actions in other languages)
1020
36fb9443b6ea fix bug introduced by commit 91bef6704b44 (parsing SFCs with transitions in ST and leading whitespace => endless loop)
mjsousa
parents: 1016
diff changeset
  1208
				  */
1056
a47dc03f0e53 fix bug introduced in previous commit (matiec was unable to parse SFC code)
Mario de Sousa <msousa@fe.up.pt>
parents: 1055
diff changeset
  1209
				 append_bodystate_buffer(yytext, 1 /* is whitespace */); 
1020
36fb9443b6ea fix bug introduced by commit 91bef6704b44 (parsing SFCs with transitions in ST and leading whitespace => endless loop)
mjsousa
parents: 1016
diff changeset
  1210
				}
1016
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1211
	/* 'INITIAL_STEP' always used in beginning of SFCs !! */
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1212
INITIAL_STEP			{ if (isempty_bodystate_buffer())	{unput_text(0); BEGIN(sfc_state);}
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1213
				  else					{append_bodystate_buffer(yytext);}
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1214
				}
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1215
 
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1216
	/* ':=', at the very beginning of a 'body', occurs only in transitions and not Function, FB, or Program bodies! */
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1217
:=				{ if (isempty_bodystate_buffer())	{unput_text(0); BEGIN(st_state);} /* We do _not_ return a start_ST_body_token here, as bison does not expect it! */
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1218
				  else				 	{append_bodystate_buffer(yytext);}
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1219
				}
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1220
 
1031
ce026aee03e0 fix compilation of SFC transitions written in IL (compiler was entering endless loop)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1020
diff changeset
  1221
	/* check if ';' occurs before an END_FUNCTION, END_FUNCTION_BLOCK, END_PROGRAM, END_ACTION or END_TRANSITION. (If true => we are parsing ST; If false => parsing IL). */
1016
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1222
END_ACTION			| /* execute the next rule's action, i.e. fall-through! */
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1223
END_FUNCTION			|
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1224
END_FUNCTION_BLOCK		|
1031
ce026aee03e0 fix compilation of SFC transitions written in IL (compiler was entering endless loop)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1020
diff changeset
  1225
END_TRANSITION   		|
1016
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1226
END_PROGRAM			{ append_bodystate_buffer(yytext); unput_bodystate_buffer(); BEGIN(il_state); /*printf("returning start_IL_body_token\n");*/ return start_IL_body_token;}
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1227
.|\n				{ append_bodystate_buffer(yytext);
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1228
				  if (strcmp(yytext, ";") == 0)
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1229
				    {unput_bodystate_buffer(); BEGIN(st_state); /*printf("returning start_ST_body_token\n");*/ return start_ST_body_token;}
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1230
				}
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1231
	/* The following rules are not really necessary. They just make compilation faster in case the ST Statement List starts with one fot he following... */
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1232
RETURN				| /* execute the next rule's action, i.e. fall-through! */
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1233
IF				|
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1234
CASE				|
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1235
FOR				|
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1236
WHILE				|
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1237
EXIT				|
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1238
REPEAT				{ if (isempty_bodystate_buffer())	{unput_text(0); BEGIN(st_state); return start_ST_body_token;}
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1239
				  else				 	{append_bodystate_buffer(yytext);}
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1240
				}
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1241
68
b0a43002dcac Adding basic error checking.
mario
parents: 58
diff changeset
  1242
}	/* end of body_state lexical parser */
3
38850ee685e6 ST and IL parsing added into flex-bison analyser
lbessard
parents: 1
diff changeset
  1243
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
  1244
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1245
	/* (il_state | st_state) -> pop to $previous_state (vardecl_list_state or sfc_state) */
3
38850ee685e6 ST and IL parsing added into flex-bison analyser
lbessard
parents: 1
diff changeset
  1246
<il_state,st_state>{
38850ee685e6 ST and IL parsing added into flex-bison analyser
lbessard
parents: 1
diff changeset
  1247
END_FUNCTION		yy_pop_state(); unput_text(0);
38850ee685e6 ST and IL parsing added into flex-bison analyser
lbessard
parents: 1
diff changeset
  1248
END_FUNCTION_BLOCK	yy_pop_state(); unput_text(0);
38850ee685e6 ST and IL parsing added into flex-bison analyser
lbessard
parents: 1
diff changeset
  1249
END_PROGRAM		yy_pop_state(); unput_text(0);
38850ee685e6 ST and IL parsing added into flex-bison analyser
lbessard
parents: 1
diff changeset
  1250
END_TRANSITION		yy_pop_state(); unput_text(0);
6
94741aa26423 Changing from decl_state directly to sfc_state
mario
parents: 4
diff changeset
  1251
END_ACTION		yy_pop_state(); unput_text(0);
3
38850ee685e6 ST and IL parsing added into flex-bison analyser
lbessard
parents: 1
diff changeset
  1252
}
38850ee685e6 ST and IL parsing added into flex-bison analyser
lbessard
parents: 1
diff changeset
  1253
868
23f271534a7c Fix the state machine that became broken 2 commits ago (when adding support for nested comments)
mjsousa
parents: 867
diff changeset
  1254
	/* sfc_state -> pop to $previous_state (vardecl_list_state or sfc_state) */
4
0d71456312ab stack overflow problem corrected
lbessard
parents: 3
diff changeset
  1255
<sfc_state>{
0d71456312ab stack overflow problem corrected
lbessard
parents: 3
diff changeset
  1256
END_FUNCTION		yy_pop_state(); unput_text(0);
0d71456312ab stack overflow problem corrected
lbessard
parents: 3
diff changeset
  1257
END_FUNCTION_BLOCK	yy_pop_state(); unput_text(0);
0d71456312ab stack overflow problem corrected
lbessard
parents: 3
diff changeset
  1258
END_PROGRAM		yy_pop_state(); unput_text(0);
0d71456312ab stack overflow problem corrected
lbessard
parents: 3
diff changeset
  1259
}
0d71456312ab stack overflow problem corrected
lbessard
parents: 3
diff changeset
  1260
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1261
	/* config -> INITIAL */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1262
END_CONFIGURATION	BEGIN(INITIAL); return END_CONFIGURATION;
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1263
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1264
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1265
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1266
	/***************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1267
	/* Next is to to remove all whitespace */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1268
	/***************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1269
	/* NOTE: pragmas are handled right at the beginning... */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1270
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
  1271
	/* The whitespace */
1055
ce7b65e24676 Fix tracking of line numbers in IL code (error messages were previously indicating incorrect line number).
Mario de Sousa <msousa@fe.up.pt>
parents: 1050
diff changeset
  1272
<INITIAL,header_state,config_state,vardecl_state,st_state,sfc_state,task_init_state,sfc_qualifier_state>{st_whitespace}	/* Eat any whitespace */
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
  1273
<il_state>{il_whitespace}		/* Eat any whitespace */
1020
36fb9443b6ea fix bug introduced by commit 91bef6704b44 (parsing SFCs with transitions in ST and leading whitespace => endless loop)
mjsousa
parents: 1016
diff changeset
  1274
 /* NOTE: Due to the need of having the following rule have higher priority,
36fb9443b6ea fix bug introduced by commit 91bef6704b44 (parsing SFCs with transitions in ST and leading whitespace => endless loop)
mjsousa
parents: 1016
diff changeset
  1275
  *        the following rule was moved to an earlier position in this file.
36fb9443b6ea fix bug introduced by commit 91bef6704b44 (parsing SFCs with transitions in ST and leading whitespace => endless loop)
mjsousa
parents: 1016
diff changeset
  1276
<body_state>{st_whitespace}		{...}
36fb9443b6ea fix bug introduced by commit 91bef6704b44 (parsing SFCs with transitions in ST and leading whitespace => endless loop)
mjsousa
parents: 1016
diff changeset
  1277
 */
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
  1278
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
  1279
	/* The comments */
952
e984cfdf3b10 Add a pre-parsing phase to stage1_2 (allows source code that references POUs and datatypes before they are declared)
mjsousa
parents: 948
diff changeset
  1280
<get_pou_name_state,ignore_pou_state,body_state,vardecl_list_state>{comment_beg}		yy_push_state(comment_state);
867
a435684a5223 Add option to control support for nested comments (default is off, as defined in IEC 61131-3 v2)
mjsousa
parents: 866
diff changeset
  1281
{comment_beg}						yy_push_state(comment_state);
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
  1282
<comment_state>{
867
a435684a5223 Add option to control support for nested comments (default is off, as defined in IEC 61131-3 v2)
mjsousa
parents: 866
diff changeset
  1283
{comment_beg}						{if (get_opt_nested_comments()) yy_push_state(comment_state);}
a435684a5223 Add option to control support for nested comments (default is off, as defined in IEC 61131-3 v2)
mjsousa
parents: 866
diff changeset
  1284
{comment_end}						yy_pop_state();
a435684a5223 Add option to control support for nested comments (default is off, as defined in IEC 61131-3 v2)
mjsousa
parents: 866
diff changeset
  1285
.							/* Ignore text inside comment! */
a435684a5223 Add option to control support for nested comments (default is off, as defined in IEC 61131-3 v2)
mjsousa
parents: 866
diff changeset
  1286
\n							/* Ignore text inside comment! */
866
c8c48ab075e0 Add support for nested comments
mjsousa
parents: 793
diff changeset
  1287
}
267
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 264
diff changeset
  1288
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1289
	/*****************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1290
	/* B.1.1 Letters, digits and identifiers */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1291
	/*****************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1292
	/* NOTE: 'R1', 'IN', etc... are IL operators, and therefore tokens
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1293
	 *       On the other hand, the spec does not define them as keywords,
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1294
	 *       which means they may be re-used for variable names, etc...!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1295
	 *       The syntax parser already caters for the possibility of these
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1296
	 *       tokens being used for variable names in their declarations.
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1297
	 *       When they are declared, they will be added to the variable symbol table!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1298
	 *       Further appearances of these tokens must no longer be parsed
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1299
	 *       as R1_tokens etc..., but rather as variable_name_tokens!
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1300
	 *
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1301
	 *       That is why the first thing we do with identifiers, even before
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1302
	 *       checking whether they may be a 'keyword', is to check whether
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1303
	 *       they have been previously declared as a variable name,
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1304
	 *
13
77174ccc5471 Many major changes to support SFC!
mario
parents: 11
diff changeset
  1305
	 *       However, we have a dilema! Should we here also check for
77174ccc5471 Many major changes to support SFC!
mario
parents: 11
diff changeset
  1306
	 *       prev_declared_derived_function_name_token?
77174ccc5471 Many major changes to support SFC!
mario
parents: 11
diff changeset
  1307
	 *       If we do, then the 'MOD' default library function (defined in
77174ccc5471 Many major changes to support SFC!
mario
parents: 11
diff changeset
  1308
	 *       the standard) will always be returned as a function name, and
77174ccc5471 Many major changes to support SFC!
mario
parents: 11
diff changeset
  1309
	 *       it will therefore not be possible to use it as an operator as 
77174ccc5471 Many major changes to support SFC!
mario
parents: 11
diff changeset
  1310
	 *       in the following ST expression 'X := Y MOD Z;' !
77174ccc5471 Many major changes to support SFC!
mario
parents: 11
diff changeset
  1311
	 *       If we don't, then even it will not be possible to use 'MOD'
77174ccc5471 Many major changes to support SFC!
mario
parents: 11
diff changeset
  1312
	 *       as a funtion as in 'X := MOD(Y, Z);'
77174ccc5471 Many major changes to support SFC!
mario
parents: 11
diff changeset
  1313
	 *       We solve this by NOT testing for function names here, and
77174ccc5471 Many major changes to support SFC!
mario
parents: 11
diff changeset
  1314
	 *       handling this function and keyword clash in bison!
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1315
	 */
1016
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1316
	/* NOTE: The following code has been commented out as most users do not want matiec
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1317
	 *       to allow the use of 'R1', 'IN' ... IL operators as identifiers, 
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1318
	 *       even though a literal reading of the standard allows this.
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1319
	 *       We could add this as a commadnd line option, but it is not yet done.
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1320
	 *       For now we just comment out the code, but leave it the commented code
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1321
	 *       in so we can re-activate quickly (without having to go through old commits
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1322
	 *       in the mercurial repository to figure out the missing code!
91bef6704b44 Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents: 1014
diff changeset
  1323
	 */
83
aeb7e0e53855 commenting out code no longer required. To be deleted later.
mario
parents: 82
diff changeset
  1324
 /*
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1325
{identifier} 	{int token = get_identifier_token(yytext);
81
de518eb7bc74 removing debug messages left by mistake in previous commit.
mario
parents: 80
diff changeset
  1326
		 // fprintf(stderr, "flex: analysing identifier '%s'...", yytext); 
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1327
		 if ((token == prev_declared_variable_name_token) ||
13
77174ccc5471 Many major changes to support SFC!
mario
parents: 11
diff changeset
  1328
//		     (token == prev_declared_derived_function_name_token) || // DO NOT add this condition!
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1329
		     (token == prev_declared_fb_name_token)) {
83
aeb7e0e53855 commenting out code no longer required. To be deleted later.
mario
parents: 82
diff changeset
  1330
		 // if (token != identifier_token)
aeb7e0e53855 commenting out code no longer required. To be deleted later.
mario
parents: 82
diff changeset
  1331
		 // * NOTE: if we replace the above uncommented conditions with
13
77174ccc5471 Many major changes to support SFC!
mario
parents: 11
diff changeset
  1332
                  *       the simple test of (token != identifier_token), then 
77174ccc5471 Many major changes to support SFC!
mario
parents: 11
diff changeset
  1333
                  *       'MOD' et al must be removed from the 
77174ccc5471 Many major changes to support SFC!
mario
parents: 11
diff changeset
  1334
                  *       library_symbol_table as a default function name!
83
aeb7e0e53855 commenting out code no longer required. To be deleted later.
mario
parents: 82
diff changeset
  1335
		  * //
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1336
		   yylval.ID=strdup(yytext);
81
de518eb7bc74 removing debug messages left by mistake in previous commit.
mario
parents: 80
diff changeset
  1337
		   // fprintf(stderr, "returning token %d\n", token); 
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1338
		   return token;
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1339
		 }
83
aeb7e0e53855 commenting out code no longer required. To be deleted later.
mario
parents: 82
diff changeset
  1340
		 // otherwise, leave it for the other lexical parser rules... 
81
de518eb7bc74 removing debug messages left by mistake in previous commit.
mario
parents: 80
diff changeset
  1341
		 // fprintf(stderr, "rejecting\n"); 
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1342
		 REJECT;
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1343
		}
83
aeb7e0e53855 commenting out code no longer required. To be deleted later.
mario
parents: 82
diff changeset
  1344
 */
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1345
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1346
	/******************************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1347
	/******************************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1348
	/******************************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1349
	/*****                                            *****/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1350
	/*****                                            *****/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1351
	/*****   N O W    D O   T H E   K E Y W O R D S   *****/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1352
	/*****                                            *****/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1353
	/*****                                            *****/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1354
	/******************************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1355
	/******************************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1356
	/******************************************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1357
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1358
934
2a42a68f4b59 Turn support of derefencing operator '^' an option (default is not supported).
mjsousa
parents: 933
diff changeset
  1359
REF	{if (get_opt_ref_standard_extensions()) return REF;        else{REJECT;}}		/* Keyword in IEC 61131-3 v3 */
2a42a68f4b59 Turn support of derefencing operator '^' an option (default is not supported).
mjsousa
parents: 933
diff changeset
  1360
DREF	{if (get_opt_ref_standard_extensions()) return DREF;       else{REJECT;}}		/* Keyword in IEC 61131-3 v3 */
2a42a68f4b59 Turn support of derefencing operator '^' an option (default is not supported).
mjsousa
parents: 933
diff changeset
  1361
REF_TO	{if (get_opt_ref_standard_extensions()) return REF_TO;     else{REJECT;}}		/* Keyword in IEC 61131-3 v3 */
2a42a68f4b59 Turn support of derefencing operator '^' an option (default is not supported).
mjsousa
parents: 933
diff changeset
  1362
NULL	{if (get_opt_ref_standard_extensions()) return NULL_token; else{REJECT;}}		/* Keyword in IEC 61131-3 v3 */
873
dea39ef02847 Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents: 869
diff changeset
  1363
82
2b6e9eeeff2c Adding some comments.
mario
parents: 81
diff changeset
  1364
EN	return EN;			/* Keyword */
2b6e9eeeff2c Adding some comments.
mario
parents: 81
diff changeset
  1365
ENO	return ENO;			/* Keyword */
0
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1366
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1367
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1368
	/******************************/
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1369
	/* B 1.2.1 - Numeric Literals */
fb772792efd1 Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
etisserant
parents:
diff changeset
  1370
	/******************************/
82
2b6e9eeeff2c Adding some comments.
mario
parents: 81
diff changeset
  1371
TRUE		return TRUE;		/* Keyword */
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 177
diff changeset
  1372
BOOL#1  	return boolean_true_literal_token;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 177
diff changeset
  1373
BOOL#TRUE	return boolean_true_literal_token;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 177
diff changeset
  1374
SAFEBOOL#1	{if (get_opt_safe_extensions()) {return safeboolean_true_literal_token;} else{REJECT;}} /* Keyword (Data Type) */ 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 177
diff changeset