%{ #include #include #include "basic_event_model_textual_parser/basic_event_model_textual_parser_includes.h" using namespace std; extern void basic_event_model_textual_parser_error(string s); %} %union { string* text; string* text; Natural* natural; Real* real; int token; set* set; } %token IDENTIFIER %token NATURAL %token REAL %token DORMANCY %token COVERAGE %token RESTORATION %token SINGLE_POINT_FAILURE %token MEAN %token RATE %token SHAPE %token STANDARD_DEVIATION %token PROBABILITY %token DISTRIBUTION %token CONSTANT %token EXPONENTIAL %token WEIBULL %token LOGNORMAL %token EQUALS %token SEMICOLON %type basic_event_model_mapping_list %type basic_event_model_mapping %type basic_event_identifier %type positive_integer_nonterminal %type positive_real_nonterminal %token END_OF_FILE %% basic_event_model_file : basic_event_model_mapping_list eof { delete $1; }; basic_event_model_mapping_list : basic_event_model_mapping { $$ = new set(); $$->insert(*$1); delete $1; } | basic_event_model_mapping basic_event_model_mapping_list { $$ = $2; if ($2->find(*$1) != $2->end()) basic_event_model_textual_parser_error(""); else $$->insert(*$1); delete $1; }; eof: END_OF_FILE ; basic_event_model_mapping: basic_event_identifier basic_event_model SEMICOLON { $$ = $1; }; basic_event_identifier: IDENTIFIER { $$ = $1; }; basic_event_model: distribution_specifier coverage_model_specifier dormancy_specifier ; distribution_specifier: DISTRIBUTION EQUALS CONSTANT constant_distribution_specifier | DISTRIBUTION EQUALS EXPONENTIAL exponential_distribution_specifier | DISTRIBUTION EQUALS WEIBULL weibull_distribution_specifier | DISTRIBUTION EQUALS LOGNORMAL lognormal_distribution_specifier ; constant_distribution_specifier: PROBABILITY EQUALS positive_real_nonterminal { if (*$3 > (Real)1) basic_event_model_textual_parser_error(""); delete $3; }; exponential_distribution_specifier: RATE EQUALS positive_real_nonterminal { delete $3; }; weibull_distribution_specifier: RATE EQUALS positive_real_nonterminal SHAPE EQUALS positive_real_nonterminal { delete $3; delete $6; }; lognormal_distribution_specifier: MEAN EQUALS positive_real_nonterminal STANDARD_DEVIATION EQUALS positive_real_nonterminal { delete $3; delete $6; }; coverage_model_specifier: COVERAGE EQUALS positive_real_nonterminal RESTORATION EQUALS positive_real_nonterminal SINGLE_POINT_FAILURE EQUALS positive_real_nonterminal { if ((Real)(*$3 + *$6 + *$9) != (Real)1) basic_event_model_textual_parser_error(""); if (*$3 > (Real)1) basic_event_model_textual_parser_error(""); if (*$6 > (Real)1) basic_event_model_textual_parser_error(""); if (*$9 > (Real)1) basic_event_model_textual_parser_error(""); delete $3; delete $6; delete $9; }; dormancy_specifier: DORMANCY EQUALS positive_real_nonterminal { if (*$3 > (Real)1) basic_event_model_textual_parser_error(""); delete $3; }; positive_real_nonterminal: REAL { $$ = $1; } | positive_integer_nonterminal { $$ = new Real(*$1); delete $1; }; positive_integer_nonterminal: NATURAL { $$ = new Natural(*$1); delete $1; };