cloudy  trunk
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
parser.h
Go to the documentation of this file.
1 /* This file is part of Cloudy and is copyright (C)1978-2017 by Gary J. Ferland and
2  * others. For conditions of distribution and use see copyright notice in license.txt */
3 
4 #ifndef PARSER_H_
5 #define PARSER_H_
6 
13 #include <cstdio>
14 #include <map>
15 #include "count_ptr.h"
16 
17 const char * nWord(const char *chKey,
18  const char *chCard);
19 
20 class Parser;
21 class DepthTable;
22 class LineID;
23 
24 typedef void (*OptionParser)(Parser &);
25 
26 struct CloudyCommand {
27  const char *name;
29 };
30 
31 bool isBoundaryChar(char c);
32 
33 class Symbol {
34 public:
37  string value;
38  Symbol(enum tokens t, const string& v) : toktype(t), value(v) {}
39 };
40 
42 class Parser
43 {
46  long int m_len;
47  long int m_off;
48  bool m_lgEOL;
49  const CloudyCommand * const m_Commands;
50  std::map<string,double> m_symtab;
51 public:
52  long int m_nqh, m_nInitFile;
54 
55  explicit Parser(void) : m_Commands(NULL)
56  {
57  init();
58  }
59  explicit Parser(const CloudyCommand *commands) : m_Commands(commands)
60  {
61  init();
62  }
63 private:
64  void init()
65  {
66  m_nqh = m_nInitFile = 0;
67  m_lgDSet = m_lgEOF = false;
68  setline("");
69  }
70  void newlineProcess();
71  bool at_end() const;
72  char current( void ) const
73  {
74  return m_card[m_off];
75  }
76  char current_raw() const;
77 public:
78  bool getline();
79  void setline(const char * const card)
80  {
82  ASSERT(strlen(card) < (unsigned) INPUT_LINE_LENGTH);
83  strncpy(m_card_raw,card,INPUT_LINE_LENGTH);
85  }
86 
87  void set_point(long int ipnt)
88  {
89  m_off = ipnt;
90  }
91  const char * nWord(const char *chKey) const;
92 public:
93  long int GetElem( void ) const;
94  double FFmtRead( void );
95  double getNumberPlain( const char *chDesc );
96  double getNumberCheck( const char *chDesc );
97  double getNumberDefault( const char *chDesc, double fdef );
98  double getNumberCheckLogLinNegImplLog( const char *chDesc );
99  double getNumberCheckAlwaysLog( const char *chDesc );
100  double getNumberCheckAlwaysLogLim( const char *chDesc, double flim );
101  double getNumberDefaultAlwaysLog( const char *chDesc, double fdef );
102  double getNumberDefaultNegImplLog( const char *chDesc, double fdef );
103  bool lgEOL(void) const
104  {
105  return m_lgEOL;
106  }
107  void setEOL(bool val)
108  {
109  m_lgEOL = val;
110  }
111  NORETURN void NoNumb(const char *chDesc) const;
112 private:
113  int nMatch1(const char *chKey) const
114  {
115  const char *p=chKey;
116 
117  while (isspace(*p))
118  ++p;
119 
120  for (const char *q=p; *q; ++q)
121  ASSERT(!islower(*q));
122 
123  if ( !isBoundaryChar(*p))
124  {
125  const char *q = ::nWord(p, m_card);
126  if (NULL == q)
127  return 0;
128  else
129  return q-m_card+1;
130  }
131  else
132  {
133  // If the keyword starts with a member of the boundary character
134  // set, can't require it to be preceded by one so revert to explicit
135  // matching
136  return ::nMatch(chKey, m_card);
137  }
138  }
139 public:
140  bool nMatch(const char *chKey) const
141  {
142  return nMatch1(chKey) != 0;
143  }
144  bool GetParam(const char *chKey, double *val)
145  {
146  int i = nMatch1(chKey);
147  if (i > 0) {
148  m_off = i-1;
149  *val = FFmtRead();
150  }
151  return i>0;
152  }
153  bool GetRange(const char *chKey, double *val1, double *val2)
154  {
155  int i = nMatch1(chKey);
156  if (i > 0) {
157  m_off = i-1;
158  *val1 = FFmtRead();
159  *val2 = FFmtRead();
160  }
161  return i>0;
162  }
163  bool nMatchErase(const char *chKey)
164  {
165  const char *p=chKey;
166  while (isspace(*p))
167  ++p;
168  int i = nMatch1(p);
169  bool found = (i != 0);
170  if(found)
171  {
172  char *ptr = m_card+i-1;
173  const long len = strlen(p);
174  /* erase this keyword, it upsets FFmtRead */
175  for (long i=0; i<len; ++i)
176  {
177  ptr[i] = ' ';
178  }
179  }
180  return found;
181  }
182  bool hasCommand(const char *s2);
183  bool Command(const char *name, OptionParser doOpts)
184  {
185  bool lgFound = hasCommand(name);
186  if ( lgFound )
187  (*doOpts)(*this);
188  return lgFound;
189  }
190  bool isComment(void) const;
191  bool isCommandComment(void) const;
192  bool isVar(void) const;
193  std::string getVarName(void);
194  void doSetVar(void);
195  void echo(void) const;
196  bool last(void) const
197  {
198  return m_lgEOF || m_card[0] == ' ';
199  }
200  int PrintLine(FILE *fp) const
201  {
202  return fprintf( fp, " ==%-.80s==\n", m_card_raw);
203  }
204  NORETURN void CommandError( void ) const;
205  NORETURN void Error( const char *msg ) const;
206  NORETURN void StringError( ) const;
207  int GetQuote( string& chLabel );
208  const char *StandardEnergyUnit(void) const;
209  string StandardFluxUnit(void) const;
210  string getFirstChunk(long i);
211  string getRawTail()
212  {
213  return string(m_card_raw+m_off);
214  }
215  void help(FILE *fp) const;
216  double getWave();
217  double getWaveOpt();
218  LineID getLineID();
219  Symbol getSymbol();
220  void getPairs(vector<double>& a, vector<double> & b);
221  void readList(vector<string>& list, const char *chName);
222  void readLaw(DepthTable& table);
223 };
224 
226 template <typename V>
227 class KeyAction {
228  const char * const m_keyword;
230 public:
231  KeyAction(const char *keyword, const V &action) :
232  m_keyword(keyword), m_action(action) {}
233 
234  const char *key(void) const
235  {
236  return m_keyword;
237  }
238  void operator()(realnum *v) const
239  {
240  m_action(v);
241  }
242 };
243 
245 template <typename V>
246 inline KeyAction<V> MakeKeyAction(const char *keyword, const V &action)
247 {
248  return KeyAction<V>(keyword, action);
249 }
250 
253 {
255 public:
256  UnitConverter ( double unit ) : m_unit((realnum)unit) {}
257 
258  void operator()( realnum *t ) const
259  {
260  *t *= m_unit;
261  }
262 };
263 
266 template <typename T, typename V>
267 bool parserProcess(Parser &p, T *list, unsigned long nlist, V *value)
268 {
269  bool lgFound = false;
270  for (unsigned long option=0; option < nlist; ++option)
271  {
272  if( p.nWord( list[option].key() ) )
273  {
274  list[option]( value );
275  lgFound = true;
276  break;
277  }
278  }
279  return lgFound;
280 }
281 
285 void ParseCosmicRays( Parser &p );
286 
290 void ParseCosmology( Parser &p );
291 
297 
298 void ParseAbundances(Parser &p);
299 
301 void ParseDont(Parser &p);
302 
306 void ParseSave(Parser &p);
307 
308 void parse_save_line(Parser &p,
309  /* true, return rel intensity, false, log of luminosity or intensity I */
310  bool lgLog3,
311  ostringstream& chHeader,
312  long int ipPun
313 );
314 
315 void parse_save_average(Parser &p,
316  /* the file we will write to */
317  long int ipPun,
318  ostringstream& chHeader);
319 
320 void parse_save_colden(Parser &p,
321  /* the header for the file, a list of identifications */
322  ostringstream& chHeader);
323 
324 void Parse_Save_Line_RT(Parser &p);
325 
327 void ParseAge(Parser &p);
328 
332 void ParseAgn(Parser &p);
333 
337 void ParseState(Parser &p);
338 
344 void ParseBlackbody(Parser &p);
345 
349 void ParseCompile(Parser &p );
350 
352 void ParseConstant(Parser &p);
353 
357 void ParseDLaw(Parser &p );
358 
362 void ParseTLaw(Parser &p);
363 
367 void ParseDrive(Parser &p );
368 
373 void ParseGrain(Parser &p);
374 
376 void ParseFluc(Parser &p);
377 
379 void ParseHDEN(Parser &p);
380 
385 void ParseDatabaseISO(long ipISO, Parser &p);
386 
390 void ParseDatabaseH2(Parser &p );
391 
395 void ParseGrid(Parser &p);
396 
398 void ParseInit(Parser &p);
399 
404 void ParseInterp(Parser &p);
405 
411 void ParseIonParI(Parser &p);
412 
419 void ParseIonParX(Parser &p);
425 void ParseIonPar(Parser &p,
426  char chType);
427 
431 void ParseNorm(Parser &p);
432 
436 void ParseOptimize(Parser &p);
437 
441 void ParsePrint(Parser &p );
442 
444 void ParseRadius(Parser &p);
445 
447 void ParseSet(Parser &p);
448 
454 void ParseTable(Parser &p);
455 
457 void ParseTrace(Parser &p);
458 
459 /*ParseExtinguish parse the extinguish command */
460 void ParseExtinguish( Parser &p );
461 
462 /*ParseIlluminate parse the illuminate command */
463 void ParseIlluminate( Parser &p );
464 
465 /*ParseCaseB - parse the Case B command */
466 void ParseCaseB(Parser &p );
467 
469 void ParseTest(Parser &p);
470 
472 void ParseAbsMag(Parser &p);
473 
475 void ParseBackgrd(Parser &p);
476 
478 void ParseCoronal(Parser &p);
479 
481 void ParseElement(Parser &p);
482 
488 void ParseCMB(double z,
489  long int *nqh);
490 
498 void ParseF_nu(
499  Parser &p,
500  const char *chType,
501  bool lgNU2);
502 
506 void ParseGlobule(Parser &p);
507 
509 void ParseRangeOption(Parser &p);
510 
512 void ParseMap(Parser &p);
513 
515 void ParseMetal(Parser &p);
516 
517 void ParsePrtLineSum(Parser &p);
518 
520 void ParsePlot(Parser &p);
521 
524 
526 void ParseRatio(Parser &p);
527 
529 void ParseSphere(Parser &p);
530 
532 void ParseStop(Parser &p);
533 
537 void ParseCrashDo(Parser &p);
538 
539 class Option {
540 public:
543  union {
544  bool l;
545  long i;
546  double r;
547  };
548  string s;
549  Option(bool val)
550  {
551  opttype=BOOL;
552  l = val;
553  }
554  Option(long val)
555  {
556  opttype=LONG;
557  i = val;
558  }
559  Option(double val)
560  {
561  opttype=REAL;
562  r = val;
563  }
564  Option(const string& val, enum Quoted q)
565  {
566  if (q == QUOTED)
567  opttype=STRING;
568  else
569  opttype=OPTION;
570  s = val;
571  }
572 };
573 
575 {
576  bool m_lgDone;
577 public:
578  vector< pair<string, count_ptr<Option> > > p;
579  Properties() : m_lgDone(false) {}
580  void setDone()
581  {
582  m_lgDone = true;
583  }
584  bool isDone() const
585  {
586  return m_lgDone;
587  }
588 };
589 
590 #endif // _PARSER_H_
void ParseState(Parser &p)
Definition: parse_state.cpp:9
void Parse_Save_Line_RT(Parser &p)
Definition: save_line.cpp:268
void setEOL(bool val)
Definition: parser.h:107
bool nMatch(const char *chKey) const
Definition: parser.h:140
void ParseHDEN(Parser &p)
Definition: parse_hden.cpp:10
void parse_save_average(Parser &p, long int ipPun, ostringstream &chHeader)
void ParseAgn(Parser &p)
Definition: parse_agn.cpp:10
bool hasCommand(const char *s2)
Definition: parser.cpp:705
const realnum m_unit
Definition: parser.h:254
void(* OptionParser)(Parser &)
Definition: parser.h:24
void ParseDont(Parser &p)
Definition: parse_dont.cpp:28
vector< pair< string, count_ptr< Option > > > p
Definition: parser.h:578
STATIC long int ipPun
Definition: save_do.cpp:721
void echo(void) const
Definition: parser.cpp:167
double FFmtRead(void)
Definition: parser.cpp:438
void ParseAge(Parser &p)
Definition: parse_age.cpp:38
#define NORETURN
Definition: cpu.h:451
void ParsePlot(Parser &p)
Definition: parse_plot.cpp:16
void ParseDatabaseISO(long ipISO, Parser &p)
void ParseBlackbody(Parser &p)
void setline(const char *const card)
Definition: parser.h:79
Option(double val)
Definition: parser.h:559
double getNumberCheckLogLinNegImplLog(const char *chDesc)
Definition: parser.cpp:376
Parser(void)
Definition: parser.h:55
bool m_lgEOL
Definition: parser.h:48
void ParseBackgrd(Parser &p)
bool Command(const char *name, OptionParser doOpts)
Definition: parser.h:183
long int m_nqh
Definition: parser.h:52
void operator()(realnum *t) const
Definition: parser.h:258
void readList(vector< string > &list, const char *chName)
Definition: parser.cpp:909
Properties()
Definition: parser.h:579
void ParseDatabaseH2(Parser &p)
void ParseExtinguish(Parser &p)
void ParseTable(Parser &p)
Definition: parse_table.cpp:94
long nMatch(const char *chKey, const char *chCard)
Definition: service.cpp:537
void ParseSet(Parser &p)
Definition: parse_set.cpp:38
int GetQuote(string &chLabel)
Definition: parser.cpp:184
char m_card[INPUT_LINE_LENGTH]
Definition: parser.h:44
bool at_end() const
Definition: parser.cpp:37
bool isCommandComment(void) const
Definition: parser.cpp:117
void ParseRatio(Parser &p)
Definition: parse_ratio.cpp:10
void ParseConstant(Parser &p)
Symbol(enum tokens t, const string &v)
Definition: parser.h:38
void newlineProcess()
Definition: parser.cpp:45
double getNumberDefaultAlwaysLog(const char *chDesc, double fdef)
Definition: parser.cpp:412
bool nMatchErase(const char *chKey)
Definition: parser.h:163
void ParseIonPar(Parser &p, char chType)
long int m_off
Definition: parser.h:47
Definition: lines.h:14
void ParseCrashDo(Parser &p)
bool parserProcess(Parser &p, T *list, unsigned long nlist, V *value)
Definition: parser.h:267
void parse_save_line(Parser &p, bool lgLog3, ostringstream &chHeader, long int ipPun)
void ParseStop(Parser &p)
Definition: parse_stop.cpp:17
double getWave()
Definition: parser.cpp:345
void ParseSave(Parser &p)
Definition: parse_save.cpp:73
string s
Definition: parser.h:548
void ParseGrid(Parser &p)
Definition: parse_grid.cpp:10
const char * name
Definition: parser.h:27
bool isBoundaryChar(char c)
Definition: parser.cpp:103
void ParseDLaw(Parser &p)
Definition: parse_dlaw.cpp:10
Definition: parser.h:42
Symbol getSymbol()
Definition: parser.cpp:784
void ParseRangeOption(Parser &p)
void ParsePrint(Parser &p)
NORETURN void StringError() const
Definition: parser.cpp:174
double getNumberPlain(const char *chDesc)
Definition: parser.cpp:354
void ParseSphere(Parser &p)
Definition: parse_sphere.cpp:9
bool m_lgDone
Definition: parser.h:576
void ParseMap(Parser &p)
Definition: parse_map.cpp:9
char m_card_raw[INPUT_LINE_LENGTH]
Definition: parser.h:44
void ParseIlluminate(Parser &p)
long int m_nInitFile
Definition: parser.h:52
bool isDone() const
Definition: parser.h:584
void ParseCosmology(Parser &p)
LineID getLineID()
Definition: parser.cpp:535
void ParseCompile(Parser &p)
OptionParser action
Definition: parser.h:28
void ParseTest(Parser &p)
Definition: parse_test.cpp:9
string StandardFluxUnit(void) const
Definition: parser.cpp:263
Option(long val)
Definition: parser.h:554
void ParseGlobule(Parser &p)
void ParseCaseB(Parser &p)
Definition: parse_caseb.cpp:9
string getRawTail()
Definition: parser.h:211
Quoted
Definition: parser.h:542
bool m_lgDSet
Definition: parser.h:53
void set_point(long int ipnt)
Definition: parser.h:87
void ParseF_nu(Parser &p, const char *chType, bool lgNU2)
Definition: parse_f_nu.cpp:9
Opts
Definition: parser.h:541
void ParseIonParX(Parser &p)
void init()
Definition: parser.h:64
void operator()(realnum *v) const
Definition: parser.h:238
Option(bool val)
Definition: parser.h:549
void ParseAbsMag(Parser &p)
Definition: parse_absmag.cpp:9
float realnum
Definition: cddefines.h:124
const char * StandardEnergyUnit(void) const
Definition: parser.cpp:259
bool last(void) const
Definition: parser.h:196
const int INPUT_LINE_LENGTH
Definition: cddefines.h:301
void parse_save_colden(Parser &p, ostringstream &chHeader)
long i
Definition: parser.h:545
void ParseFluc(Parser &p)
Definition: parse_fluc.cpp:9
void ParseNorm(Parser &p)
Definition: parse_norm.cpp:10
void ParseCMB(double z, long int *nqh)
Definition: parse_CMB.cpp:10
NORETURN void NoNumb(const char *chDesc) const
Definition: parser.cpp:318
long int GetElem(void) const
Definition: parser.cpp:294
tokens
Definition: parser.h:35
const char * nWord(const char *chKey) const
Definition: parser.cpp:32
int nMatch1(const char *chKey) const
Definition: parser.h:113
string getFirstChunk(long i)
Definition: parser.cpp:520
void ParseDrive(Parser &p)
Definition: parse_drive.cpp:31
bool isVar(void) const
Definition: parser.cpp:122
const char * nWord(const char *chKey, const char *chCard)
Definition: parser.cpp:57
void ParseTrace(Parser &p)
Definition: parse_trace.cpp:11
long int m_len
Definition: parser.h:46
void ParseAbundancesNonSolar(Parser &p)
void ParseInit(Parser &p)
Definition: parse_init.cpp:9
void ParseGrain(Parser &p)
Definition: parse_grain.cpp:12
void ParsePrtLineSum(Parser &p)
Definition: prt_linesum.cpp:18
void setDone()
Definition: parser.h:580
void ParsePowerlawContinuum(Parser &p)
Definition: parser.h:539
double getNumberCheckAlwaysLogLim(const char *chDesc, double flim)
Definition: parser.cpp:399
void help(FILE *fp) const
Definition: parser.cpp:267
bool l
Definition: parser.h:544
void ParseIonParI(Parser &p)
#define ASSERT(exp)
Definition: cddefines.h:617
KeyAction< V > MakeKeyAction(const char *keyword, const V &action)
Definition: parser.h:246
bool getline()
Definition: parser.cpp:249
KeyAction(const char *keyword, const V &action)
Definition: parser.h:231
NORETURN void Error(const char *msg) const
Definition: parser.cpp:228
bool GetParam(const char *chKey, double *val)
Definition: parser.h:144
double getNumberCheckAlwaysLog(const char *chDesc)
Definition: parser.cpp:393
Option(const string &val, enum Quoted q)
Definition: parser.h:564
void ParseRadius(Parser &p)
Parser(const CloudyCommand *commands)
Definition: parser.h:59
const CloudyCommand *const m_Commands
Definition: parser.h:49
double getNumberDefault(const char *chDesc, double fdef)
Definition: parser.cpp:367
void ParseTLaw(Parser &p)
Definition: parse_tlaw.cpp:13
char current(void) const
Definition: parser.h:72
bool lgEOL(void) const
Definition: parser.h:103
string value
Definition: parser.h:37
void ParseCosmicRays(Parser &p)
int fprintf(const Output &stream, const char *format,...)
Definition: service.cpp:1217
NORETURN void CommandError(void) const
Definition: parser.cpp:239
void getPairs(vector< double > &a, vector< double > &b)
Definition: parser.cpp:728
enum tokens toktype
Definition: parser.h:36
const char *const m_keyword
Definition: parser.h:228
char current_raw() const
Definition: parser.cpp:41
void ParseOptimize(Parser &p)
int PrintLine(FILE *fp) const
Definition: parser.h:200
std::string getVarName(void)
Definition: parser.cpp:126
enum Option::Opts opttype
bool m_lgEOF
Definition: parser.h:53
Definition: parser.h:33
void readLaw(DepthTable &table)
Definition: parser.cpp:936
void ParseMetal(Parser &p)
Definition: parse_metal.cpp:12
bool GetRange(const char *chKey, double *val1, double *val2)
Definition: parser.h:153
UnitConverter(double unit)
Definition: parser.h:256
void doSetVar(void)
Definition: parser.cpp:139
double getNumberDefaultNegImplLog(const char *chDesc, double fdef)
Definition: parser.cpp:421
double getWaveOpt()
Definition: parser.cpp:329
std::map< string, double > m_symtab
Definition: parser.h:50
void ParseCoronal(Parser &p)
const char * key(void) const
Definition: parser.h:234
void ParseElement(Parser &p)
V m_action
Definition: parser.h:229
bool isComment(void) const
Definition: parser.cpp:113
void ParseInterp(Parser &p)
double r
Definition: parser.h:546
void ParseAbundances(Parser &p)
double getNumberCheck(const char *chDesc)
Definition: parser.cpp:358