The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
%{
#include "fault_tree_textual_parser/fault_tree_textual_parser_includes.h"
//TODO: Can we remove this automatically?
//#include "fault_tree_textual_parser/fault_tree_textual_parser.h"

#include <string>
#include <iostream>
#include <sstream>

using namespace std;

// -----------------------------------------------------------------

void fault_tree_textual_parser_error (string s);
string fault_tree_textual_parser_error_string;

bool fault_tree_textual_parser_reached_end_of_file;
%}

/* Set the name prefix so we can have multiple lexers in the same program. */
%option prefix="fault_tree_textual_parser_"

%%

<<EOF>> return END_OF_FILE;

// This style works too
"system_event" {
  return SYSTEM_EVENT;
}

"and" return AND; 

"or" return OR; 

"thr" return THRESHOLD; 

"pand" return PAND; 

"spare" return SPARE; 

"maximum" return MAXIMUM; 

"trigger" return TRIGGER; 

"seq" return SEQ; 

"fdep" return FDEP; 

"be" return BE; 

"replication" return REPLICATION; 

// "id_1" return IDENTIFIER;
// ( "id_1" | "id_2" | "id_3" ) return IDENTIFIER;
// ["id_1" | "id_2" | "id_3"] return IDENTIFIER;
["id_#"] return IDENTIFIER;

( 0 | 1 | 2 | 10 ) return NATURAL;

0 return ZERO;

"=" return EQUALS; 

";\n" return SEMICOLON; 

%%

void fault_tree_textual_parser_error(string error_string)
{
  ostringstream temp_string;
  temp_string << fault_tree_textual_parser_lineno;

  // Generic yacc "syntax error" message isn't very useful
  if (error_string != "syntax error")
    fault_tree_textual_parser_error_string += "SYNTAX ERROR (line " + temp_string.str() +
      "): " + error_string + "\n";
  else
    fault_tree_textual_parser_error_string += "SYNTAX ERROR (line " + temp_string.str() +
      ")\n";
}

void fault_tree_textual_parser_scanner_initialize(FILE* in_input_file)
{
  yyrestart(in_input_file);
  fault_tree_textual_parser_reached_end_of_file = false;
  fault_tree_textual_parser_error_string = "";
}

/*
Sample main file

#include <string>
#include <cstdio>

extern FILE *fault_tree_textual_parser_in;
extern int fault_tree_textual_parser_lex();
extern void fault_tree_textual_parser_scanner_initialize(FILE *in_input_file);

int main(int argc, char *argv[]) {
  fault_tree_textual_parser_in = fopen(argv[1], "r");
  fault_tree_textual_parser_scanner_initialize(fault_tree_textual_parser_in);

  int token;

  while ((token = fault_tree_textual_parser_lex()))
  {
    if (fault_tree_textual_parser_error_string != "")
      break;

    if (token == IDENTIFIER)
      delete fault_tree_textual_parser_lval.text;

    if (token == NATURAL)
      delete fault_tree_textual_parser_lval.natural;

    if (token == ZERO)
      delete fault_tree_textual_parser_lval.zero;

    if (token == INTEGER)
      delete fault_tree_textual_parser_lval.integer;

    if (token == REAL)
      delete fault_tree_textual_parser_lval.real;
  }

  fclose(fault_tree_textual_parser_in);

  if (fault_tree_textual_parser_error_string != "")
  {
    printf("ERRORS!\n%s", fault_tree_textual_parser_error_string.c_str());
    return 1;
  }

  printf("Scanning succeeded\n");
  return 0;
}
*/