MBDyn-1.7.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
parsinc.h
Go to the documentation of this file.
1 /* $Header: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/libraries/libmbutil/parsinc.h,v 1.29 2017/01/12 14:44:05 masarati Exp $ */
2 /*
3  * MBDyn (C) is a multibody analysis code.
4  * http://www.mbdyn.org
5  *
6  * Copyright (C) 1996-2017
7  *
8  * Pierangelo Masarati <masarati@aero.polimi.it>
9  * Paolo Mantegazza <mantegazza@aero.polimi.it>
10  *
11  * Dipartimento di Ingegneria Aerospaziale - Politecnico di Milano
12  * via La Masa, 34 - 20156 Milano, Italy
13  * http://www.aero.polimi.it
14  *
15  * Changing this copyright notice is forbidden.
16  *
17  * This program is free software; you can redistribute it and/or modify
18  * it under the terms of the GNU General Public License as published by
19  * the Free Software Foundation (version 2 of the License).
20  *
21  *
22  * This program is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25  * GNU General Public License for more details.
26  *
27  * You should have received a copy of the GNU General Public License
28  * along with this program; if not, write to the Free Software
29  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30  */
31 
32 /* Parser per l'ingresso dati - parte generale */
33 
34 /* Si compone di tre diverse strutture di scansione,
35  * piu' le strutture di memorizzazione di stringhe e variabili.
36  *
37  * La prima struttura e' data dal LowParser, che riconosce gli elementi
38  * della sintassi. E' data da:
39  * <statement_list>::=
40  * <statement> ; <statement_list>
41  * epsilon
42  * <statement>::=
43  * <description>
44  * <description> : <arg_list>
45  * <arg_list>::=
46  * <arg>
47  * <arg> , <arg_list>
48  * <arg>::=
49  * <word>
50  * <number>
51  * ecc. ecc.
52  *
53  * La seconda struttura e' data dall'HighParser, che riconosce la sintassi
54  * vera e propria. In alternativa al LowParser, qualora sia atteso un valore
55  * numerico esprimibile mediante un'espressione regolare
56  * (espressione matematica), e' possibile invocare la terza struttura,
57  * il MathParser. Questo analizza espressioni anche complesse e multiple,
58  * se correttamente racchiuse tra parentesi.
59  *
60  * L'HighParser deve necessariamente riconoscere una parola chiave nel campo
61  * <description>, mentre puo' trovare parole qualsiasi nel campo <arg>
62  * qualora sia attesa una stringa.
63  *
64  * Le parole chiave vengono fornite all'HighParser attraverso la KeyTable,
65  * ovvero una lista di parole impaccate (senza spazi). L'uso consigliato e':
66  *
67  * const char sKeyWords[] = { "keyword0",
68  * "keyword1",
69  * "...",
70  * "keywordN"};
71  *
72  * enum KeyWords { KEYWORD0 = 0,
73  * KEYWORD1,
74  * ...,
75  * KEYWORDN,
76  * LASTKEYWORD};
77  *
78  * KeyTable K((int)LASTKEYWORD, sKeyWords);
79  *
80  * Il MathParser usa una tabella di simboli, ovvero nomi (dotati di tipo)
81  * a cui e' associato un valore. La tabella e' esterna e quindi puo' essere
82  * conservata ed utilizzata in seguito conservando in memoria i nomi
83  * definiti in precedenza.
84  *
85  * A questo punto si puo' generare la tabella dei simboli:
86  *
87  * int iSymbolTableInitialSize = 10;
88  * Table T(iSymbolTableInitialSize);
89  *
90  * Quindi si crea il MathParser:
91  *
92  * MathParser Math(T);
93  *
94  * Infine si genera l'HighParser:
95  *
96  * HighParser HP(Math, K, StreamIn);
97  *
98  * dove StreamIn e' l'istream da cui avviene la lettura.
99  */
100 
101 
102 #ifndef PARSINC_H
103 #define PARSINC_H
104 
105 #include <fstream>
106 #include <stack>
107 
108 #include "parser.h"
109 
110 /* IncludeParser - begin */
111 
112 class IncludeParser : public HighParser {
113  friend struct IncludeDR;
114 protected:
115 
116  /*
117  * Struttura e dati per la stack di flussi in ingresso, usata
118  * per consentire l'inclusione multipla di files
119  * ATTENZIONE: non impedisce l'inclusione ricorsiva, e quindi il loop
120  */
121  struct MyInput {
122  std::ifstream* pfile;
124 
125 #ifdef USE_INCLUDE_PARSER
126  char* sPath;
127  char* sFile;
128 
129  MyInput(std::ifstream* pf = NULL, InputStream* pi = NULL,
130  char* sp = NULL, char* sfile = NULL)
131  : pfile(pf), pis(pi), sPath(sp), sFile(sfile) {
132  NO_OP;
133  };
134 
135 #else /* !USE_INCLUDE_PARSER */
136  MyInput(std::ifstream* pf = NULL, InputStream* pi = NULL)
137  : pfile(pf), pis(pi) {
138  NO_OP;
139  };
140 #endif /* !USE_INCLUDE_PARSER */
141  };
142 
143  std::stack<MyInput *> myinput;
144  char* sCurrPath;
146  char* sCurrFile;
147 
148  flag fCheckStack(void);
149  bool Include_int(void);
150  virtual void Eof(void);
151 
152 public:
153  IncludeParser(MathParser& MP, InputStream& streamIn,
154  const char *initial_file = "initial file");
155  virtual ~IncludeParser(void);
156 
157  virtual void Close(void); /* "Chiude" i flussi */
158 
159  virtual const char* GetFileName(enum Delims Del = DEFAULTDELIM);
160 
161  virtual HighParser::ErrOut GetLineData(void) const;
162 };
163 
164 /* Le funzioni:
165  * ExpectDescription()
166  * ExpectArg()
167  * informano il parser di cio' che e' atteso; di default il costruttore
168  * setta ExpectDescription().
169  *
170  * Le funzioni:
171  * GetDescription()
172  * IsKeyWord()
173  * GetWord()
174  * restituiscono un intero che corrisponde alla posizione occupata nella
175  * KeyTable dalle parole corrispondenti, oppure -1 se la parola non e'
176  * trovata. Si noti che IsKeyWord(), in caso di esito negativo, ripristina
177  * l'istream. Tutte preparano poi il parser per la lettura successiva.
178  *
179  * La funzione
180  * IsKeyWord(const char*)
181  * restituisce 0 se non trova la parola e ripristina l'istream, altrimenti
182  * restituisce 1 e prepara il parser alla lettura successiva.
183  *
184  * Le funzioni
185  * GetInt(),
186  * GetReal(),
187  * GetString(),
188  * GetStringWithDelims(enum Delims)
189  * GatFileName(enum Delims)
190  * restituiscono i valori attesi e preparano il parser alla lettura successiva.
191  */
192 
193 /* IncludeParser - end */
194 
195 #endif /* PARSINC_H */
196 
InputStream * pis
Definition: parsinc.h:123
MyInput(std::ifstream *pf=((void *) 0), InputStream *pi=((void *) 0))
Definition: parsinc.h:136
IncludeParser(MathParser &MP, InputStream &streamIn, const char *initial_file="initial file")
Definition: parsinc.cc:120
long int flag
Definition: mbdyn.h:43
virtual const char * GetFileName(enum Delims Del=DEFAULTDELIM)
Definition: parsinc.cc:673
std::ifstream * pf
Definition: parser.h:420
virtual ~IncludeParser(void)
Definition: parsinc.cc:149
#define NO_OP
Definition: myassert.h:74
virtual void Eof(void)
Definition: parsinc.cc:425
bool Include_int(void)
Definition: parsinc.cc:281
std::stack< MyInput * > myinput
Definition: parsinc.h:143
flag fCheckStack(void)
Definition: parsinc.cc:225
char * sInitialPath
Definition: parsinc.h:145
char * sCurrPath
Definition: parsinc.h:144
std::ifstream * pfile
Definition: parsinc.h:122
virtual HighParser::ErrOut GetLineData(void) const
Definition: parsinc.cc:697
virtual void Close(void)
Definition: parsinc.cc:155
char * sCurrFile
Definition: parsinc.h:146