stage1_2/stage1_2.cc
author laurent
Wed, 16 Mar 2011 10:31:50 +0100
changeset 250 5d2927300e2c
parent 177 697562a5da7c
child 264 6facabd9c2cd
permissions -rw-r--r--
Adding missing support for accessors and retain in configuration files (Bug and fix reported by Manuele Conti)
15
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
     1
/*
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
     2
 * (c) 2007 Mario de Sousa
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
     3
 *
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
     4
 * Offered to the public under the terms of the GNU General Public License
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
     5
 * as published by the Free Software Foundation; either version 2 of the
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
     6
 * License, or (at your option) any later version.
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
     7
 *
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
     8
 * This program is distributed in the hope that it will be useful, but
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
     9
 * WITHOUT ANY WARRANTY; without even the implied warranty of
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    11
 * Public License for more details.
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    12
 *
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    13
 * This code is made available on the understanding that it will not be
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    14
 * used in safety-critical situations without a full and competent review.
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    15
 */
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    16
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    17
/*
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    18
 * An IEC 61131-3 IL and ST compiler.
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    19
 *
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    20
 * Based on the
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    21
 * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10)
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    22
 *
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    23
 */
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    24
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    25
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    26
/*
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    27
 * This file contains the code that calls the stage 1 (lexical anayser) 
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    28
 * and stage 2 (syntax parser) during the first pass.
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    29
 */
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    30
139
668a54686827 added missing includes on some platform (gentoo/gcc-4.3.1)
etisserant
parents: 136
diff changeset
    31
#include <string.h>
668a54686827 added missing includes on some platform (gentoo/gcc-4.3.1)
etisserant
parents: 136
diff changeset
    32
#include <stdlib.h>
15
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    33
20
81a06a308b7e *** empty log message ***
mario
parents: 15
diff changeset
    34
/* file with declaration of absyntax classes... */
81a06a308b7e *** empty log message ***
mario
parents: 15
diff changeset
    35
#include "../absyntax/absyntax.hh"
81a06a308b7e *** empty log message ***
mario
parents: 15
diff changeset
    36
15
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    37
177
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
    38
#include "stage1_2.hh"
15
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    39
#include "iec.y.hh"
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    40
#include "stage1_2_priv.hh"
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    41
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    42
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    43
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    44
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    45
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    46
/**************************************/
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    47
/* The name of the file being parsed. */
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    48
/**************************************/
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    49
/* The name of the file currently being parsed...
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    50
 * Note that flex accesses and updates this global variable
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    51
 * apropriately whenever it comes across an (*#include <filename> *)
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    52
 * directive...
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    53
 * ... and bison will use it when producing error messages.
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    54
 * Note that bison also sets this variable correctly to the first
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    55
 * file being parsed.
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    56
 */
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    57
const char *current_filename = NULL;
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    58
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    59
177
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
    60
/******************************************************/
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
    61
/* whether we are suporting safe extensions           */
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
    62
/* as defined in PLCopen - Technical Committee 5      */
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
    63
/* Safety Software Technical Specification,           */
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
    64
/* Part 1: Concepts and Function Blocks,              */
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
    65
/* Version 1.0 – Official Release                     */
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
    66
/******************************************************/
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
    67
bool safe_extensions_ = false;
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
    68
bool get_opt_safe_extensions() {return safe_extensions_;}
15
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    69
68
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
    70
/****************************************************/
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
    71
/* Controlling the entry to the body_state in flex. */
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
    72
/****************************************************/
15
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    73
static int goto_body_state__ = 0;
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    74
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    75
void cmd_goto_body_state(void) {goto_body_state__ = 1;}
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    76
int  get_goto_body_state(void) {return goto_body_state__;}
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    77
void rst_goto_body_state(void) {goto_body_state__ = 0;}
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
    78
68
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
    79
/*************************************************************/
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
    80
/* Controlling the entry to the sfc_qualifier_state in flex. */
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
    81
/*************************************************************/
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
    82
static int goto_sfc_qualifier_state__ = 0;
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
    83
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
    84
void cmd_goto_sfc_qualifier_state(void) {goto_sfc_qualifier_state__ = 1;}
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
    85
int  get_goto_sfc_qualifier_state(void) {return goto_sfc_qualifier_state__;}
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
    86
void rst_goto_sfc_qualifier_state(void) {goto_sfc_qualifier_state__ = 0;}
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
    87
74
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 68
diff changeset
    88
/*************************************************************/
86
1988bf1634da Adding support for use of PRIORITY as identifier inside SFC.
mario
parents: 74
diff changeset
    89
/* Controlling the entry to the sfc_priority_state in flex.  */
1988bf1634da Adding support for use of PRIORITY as identifier inside SFC.
mario
parents: 74
diff changeset
    90
/*************************************************************/
1988bf1634da Adding support for use of PRIORITY as identifier inside SFC.
mario
parents: 74
diff changeset
    91
static int goto_sfc_priority_state__ = 0;
1988bf1634da Adding support for use of PRIORITY as identifier inside SFC.
mario
parents: 74
diff changeset
    92
1988bf1634da Adding support for use of PRIORITY as identifier inside SFC.
mario
parents: 74
diff changeset
    93
void cmd_goto_sfc_priority_state(void) {goto_sfc_priority_state__ = 1;}
1988bf1634da Adding support for use of PRIORITY as identifier inside SFC.
mario
parents: 74
diff changeset
    94
int  get_goto_sfc_priority_state(void) {return goto_sfc_priority_state__;}
1988bf1634da Adding support for use of PRIORITY as identifier inside SFC.
mario
parents: 74
diff changeset
    95
void rst_goto_sfc_priority_state(void) {goto_sfc_priority_state__ = 0;}
1988bf1634da Adding support for use of PRIORITY as identifier inside SFC.
mario
parents: 74
diff changeset
    96
1988bf1634da Adding support for use of PRIORITY as identifier inside SFC.
mario
parents: 74
diff changeset
    97
/*************************************************************/
74
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 68
diff changeset
    98
/* Controlling the entry to the sfc_qualifier_state in flex. */
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 68
diff changeset
    99
/*************************************************************/
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 68
diff changeset
   100
static int goto_task_init_state__ = 0;
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 68
diff changeset
   101
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 68
diff changeset
   102
void cmd_goto_task_init_state(void) {goto_task_init_state__ = 1;}
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 68
diff changeset
   103
int  get_goto_task_init_state(void) {return goto_task_init_state__;}
85af9521bf63 fixing identifier issues of PRIORITY, SINGLE, and INTERVAL
mario
parents: 68
diff changeset
   104
void rst_goto_task_init_state(void) {goto_task_init_state__ = 0;}
68
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
   105
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
   106
/****************************************************************/
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
   107
/* Returning to state in flex previously pushed onto the stack. */
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
   108
/****************************************************************/
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
   109
static int pop_state__ = 0;
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
   110
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
   111
void cmd_pop_state(void) {pop_state__ = 1;}
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
   112
int  get_pop_state(void) {return pop_state__;}
b0a43002dcac Adding basic error checking.
mario
parents: 20
diff changeset
   113
void rst_pop_state(void) {pop_state__ = 0;}
15
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   114
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   115
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   116
/*********************************/
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   117
/* The global symbol tables...   */
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   118
/*********************************/
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   119
/* NOTE: only accessed indirectly by the lexical parser (flex)
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   120
 *       through the function get_identifier_token()
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   121
 */
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   122
/* NOTE: BOGUS_TOKEN_ID is defined in the bison generated file iec.y.hh.
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   123
 *       We need this constant defined before we can declare the symbol tables.
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   124
 *       However, we cannot #include "iec.y.hh" in this file (stage1_2_priv.hh) directly
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   125
 *       because of the way bison ver. 3.2 is copying all declarations in the prologue
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   126
 *       of iec.y to the iec.y.hh file (including an #include stage1_2_priv.hh).
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   127
 *       So, if we were to include "iec.y.hh" here, we would get a circular include.
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   128
 *       All this means that whoever includes this file (stage1_2_priv.hh) will need
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   129
 *       to take care to first inlcude iec.y.hh !!
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   130
 */ 
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   131
/* A symbol table to store all the library elements */
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   132
/* e.g.: <function_name , function_decl>
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   133
 *       <fb_name , fb_decl>
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   134
 *       <type_name , type_decl>
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   135
 *       <program_name , program_decl>
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   136
 *       <configuration_name , configuration_decl>
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   137
 */
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   138
/* static */ symtable_c<int, BOGUS_TOKEN_ID> library_element_symtable;
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   139
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   140
/* A symbol table to store the declared variables of
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   141
 * the function currently being parsed...
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   142
 */
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   143
/* static */ symtable_c<int, BOGUS_TOKEN_ID> variable_name_symtable;
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   144
175
dadda1b5401e Adding support for checking direct variable declared before using
lbessard
parents: 139
diff changeset
   145
/* A symbol table to store the declared direct variables of
dadda1b5401e Adding support for checking direct variable declared before using
lbessard
parents: 139
diff changeset
   146
 * the function currently being parsed...
dadda1b5401e Adding support for checking direct variable declared before using
lbessard
parents: 139
diff changeset
   147
 */
dadda1b5401e Adding support for checking direct variable declared before using
lbessard
parents: 139
diff changeset
   148
/* static */ symtable_c<int, BOGUS_TOKEN_ID> direct_variable_symtable;
15
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   149
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   150
/* Function only called from within flex!
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   151
 *
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   152
 * search for a symbol in either of the two symbol tables
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   153
 * declared above, and return the token id of the first
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   154
 * symbol found.
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   155
 * Searches first in the variables, and only if not found
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   156
 * does it continue searching in the library elements
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   157
 */
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   158
int get_identifier_token(const char *identifier_str) {
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   159
//  std::cout << "get_identifier_token(" << identifier_str << "): \n";
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   160
  int token_id;
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   161
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   162
  if ((token_id = variable_name_symtable.find_value(identifier_str)) == variable_name_symtable.end_value())
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   163
    if ((token_id = library_element_symtable.find_value(identifier_str)) == library_element_symtable.end_value())
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   164
      return identifier_token;
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   165
  return token_id;
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   166
}
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   167
175
dadda1b5401e Adding support for checking direct variable declared before using
lbessard
parents: 139
diff changeset
   168
/* Function only called from within flex!
dadda1b5401e Adding support for checking direct variable declared before using
lbessard
parents: 139
diff changeset
   169
 *
dadda1b5401e Adding support for checking direct variable declared before using
lbessard
parents: 139
diff changeset
   170
 * search for a symbol in direct variables symbol table
dadda1b5401e Adding support for checking direct variable declared before using
lbessard
parents: 139
diff changeset
   171
 * declared above, and return the token id of the first
dadda1b5401e Adding support for checking direct variable declared before using
lbessard
parents: 139
diff changeset
   172
 * symbol found.
dadda1b5401e Adding support for checking direct variable declared before using
lbessard
parents: 139
diff changeset
   173
 */
dadda1b5401e Adding support for checking direct variable declared before using
lbessard
parents: 139
diff changeset
   174
int get_direct_variable_token(const char *direct_variable_str) {
dadda1b5401e Adding support for checking direct variable declared before using
lbessard
parents: 139
diff changeset
   175
  int token_id;
dadda1b5401e Adding support for checking direct variable declared before using
lbessard
parents: 139
diff changeset
   176
dadda1b5401e Adding support for checking direct variable declared before using
lbessard
parents: 139
diff changeset
   177
  if ((token_id = direct_variable_symtable.find_value(direct_variable_str)) == direct_variable_symtable.end_value())
dadda1b5401e Adding support for checking direct variable declared before using
lbessard
parents: 139
diff changeset
   178
    return direct_variable_token;
dadda1b5401e Adding support for checking direct variable declared before using
lbessard
parents: 139
diff changeset
   179
  return token_id;
dadda1b5401e Adding support for checking direct variable declared before using
lbessard
parents: 139
diff changeset
   180
}
15
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   181
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   182
/************************/
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   183
/* Utility Functions... */
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   184
/************************/
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   185
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   186
/*
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   187
 * Join two strings together. Allocate space with malloc(3).
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   188
 */
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   189
char *strdup2(const char *a, const char *b) {
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   190
  char *res = (char *)malloc(strlen(a) + strlen(b) + 1);
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   191
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   192
  if (!res)
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   193
    return NULL;
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   194
  return strcat(strcpy(res, a), b);  /* safe, actually */
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   195
}
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   196
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   197
/*
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   198
 * Join three strings together. Allocate space with malloc(3).
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   199
 */
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   200
char *strdup3(const char *a, const char *b, const char *c) {
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   201
  char *res = (char *)malloc(strlen(a) + strlen(b) + strlen(c) + 1);
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   202
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   203
  if (!res)
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   204
    return NULL;
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   205
  return strcat(strcat(strcpy(res, a), b), c);  /* safe, actually */
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   206
}
0b472e25eb16 Adding changes to make the compiler compatible with bison ver 2.3
mario
parents:
diff changeset
   207
136
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   208
/*************************/
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   209
/* Tracking Functions... */
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   210
/*************************/
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   211
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   212
extern tracking_t* current_tracking;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   213
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   214
/*--------------------------------------------------------------------
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   215
 * GetNextChar
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   216
 * 
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   217
 * reads a character from input for flex
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   218
 *------------------------------------------------------------------*/
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   219
int GetNextChar(char *b, int maxBuffer) {
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   220
  char *p;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   221
  
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   222
  if (  current_tracking->eof  )
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   223
    return 0;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   224
  
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   225
  while (  current_tracking->currentChar >= current_tracking->lineLength  ) {
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   226
    current_tracking->currentChar = 0;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   227
    current_tracking->currentTokenStart = 1;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   228
    current_tracking->eof = false;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   229
    
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   230
    p = fgets(current_tracking->buffer, MAX_BUFFER_LENGTH, current_tracking->in_file);
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   231
    if (  p == NULL  ) {
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   232
      if (  ferror(current_tracking->in_file)  )
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   233
        return 0;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   234
      current_tracking->eof = true;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   235
      return 0;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   236
    }
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   237
    
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   238
    current_tracking->lineNumber++;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   239
    current_tracking->lineLength = strlen(current_tracking->buffer);
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   240
  }
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   241
  
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   242
  b[0] = current_tracking->buffer[current_tracking->currentChar];
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   243
  if (b[0] == ' ' || b[0] == '\t')
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   244
    current_tracking->currentTokenStart++;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   245
  current_tracking->currentChar++;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   246
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   247
  return b[0]==0?0:1;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   248
}
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   249
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   250
tracking_t* GetNewTracking(FILE* in_file) {
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   251
  tracking_t* new_env = new tracking_t;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   252
  new_env->eof = 0;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   253
  new_env->lineNumber = 0;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   254
  new_env->currentChar = 0;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   255
  new_env->lineLength = 0;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   256
  new_env->currentTokenStart = 0;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   257
  new_env->buffer = (char*)malloc(MAX_BUFFER_LENGTH);
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   258
  new_env->in_file = in_file;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   259
  return new_env;
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   260
}
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   261
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   262
/***********************************************************************/
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   263
/***********************************************************************/
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   264
/***********************************************************************/
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   265
/***********************************************************************/
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   266
/***********************************************************************/
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   267
/***********************************************************************/
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   268
/***********************************************************************/
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   269
/***********************************************************************/
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   270
/***********************************************************************/
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   271
/***********************************************************************/
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   272
32bd7ef40897 Adding some improvements:
lbessard
parents: 86
diff changeset
   273
177
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   274
int stage2__(const char *filename, 
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   275
             const char *includedir,     /* Include directory, where included files will be searched for... */
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   276
             symbol_c **tree_root_ref,
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   277
             bool full_token_loc         /* error messages specify full token location */
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   278
            );
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   279
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   280
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   281
int stage1_2(const char *filename, symbol_c **tree_root_ref, stage1_2_options_t options) {
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   282
      /* NOTE: we only call stage2 (bison - syntax analysis) directly, as stage 2 will itself call stage1 (flex - lexical analysis)
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   283
       *       automatically as needed
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   284
       */
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   285
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   286
      /* NOTE: Since we do not call stage1__ (flex) directly, we cannot directly pass any parameters to that function either.
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   287
       *       In this case, we use callback functions, i.e. stage1__ (i.e. flex) will call functions defined in this file
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   288
       *       whenever it needs info/parameters coming from stage1_2().
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   289
       *       These callback functions will get their data from local (to this file) global variables...
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   290
       *       We now set those variables...
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   291
       */
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   292
  safe_extensions_ = options.safe_extensions;
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   293
  
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   294
  return stage2__(filename, options.includedir, tree_root_ref, options.full_token_loc);
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   295
}
697562a5da7c Adding support for SAFEBOOL. Some code generation yet to do...
mario
parents: 175
diff changeset
   296