Source

lp_solve / lp_rlp.l

WS1  [ \t]
WS2  [ \t\r\n]
LT   [A-Za-z]
KR   [A-Za-z0-9_\[\]\{\}/.&#$%~'@^]
DI   [0-9]
INNM {DI}+
NM   (({DI}+\.?{DI}*)|(\.{DI}+))([Ee][-+]?{DI}+)?
VR   {LT}{KR}*(<{KR}+>)?
OPEQ =
OPLE [<]=?
OPGE [>]=?
EOW  $|[*+-;<=>]|{WS2}+
INF  {WS2}*[-+][Ii][Nn][Ff]([Ii][Nn][Ii][Tt]([Ee]|[Yy]))?{EOW}
S_OP [-+ \t\n\r]+
MIN  [mM][iI][nN]([iI][mM][iI][zZsS][eE])?{WS1}*:
MAX  [mM][aA][xX]([iI][mM][iI][zZsS][eE])?{WS1}*:
INT  ^{WS1}*[Ii][Nn][Tt]([Ee][Gg][Ee][Rr])?
BIN  ^{WS1}*[Bb][Ii][Nn]([Aa][Rr][Yy])?
SEC  ^{WS1}*([Ss][Ee][Cc])|([Ss][Ee][Mm][Ii]-[Cc][Oo][Nn][Tt][Ii][Nn][Uu][Oo][Uu][Ss])|([Ss][Ee][Mm][Ii])|([Ss][Ee][Mm][Ii][Ss])
SOS  ^{WS1}*([Ss][Oo][Ss][12]*)|([Ss][Ee][Tt][Ss])
FREE ^{WS1}*[Ff][Rr][Ee][Ee]
LBL  {VR}{WS1}*:
SOSD {LBL}:

/*
   made reentrant with help of
   http://www.usualcoding.eu/post/2007/09/03/Building-a-reentrant-parser-in-C-with-Flex/Bison
*/

/*
   Note that a minimum version of flex is needed to be able to compile this.
   Older version don't know the reentrant code.
   Version 2.5.4 is not enough. Probably at least v2.5.31 is needed. Tested with v2.5.35
*/

/*
** We want the scanner to be reentrant, therefore generate no global variables.
** That what the 'reentrant' option is for.
** 'bison-bridge' is used to create a bison compatible scanner and share yylval
*/

%option reentrant bison-bridge
%option noyywrap
%option yylineno

%start COMMENT
%start LINECOMMENT

%%
<INITIAL>"/*" {
  BEGIN COMMENT;
} /* begin skip comment */

<COMMENT>"*/" {
  BEGIN INITIAL;
} /* end skip comment */

<COMMENT>. {
}

<COMMENT>\n {
}

<COMMENT>\r {
}

<INITIAL>"//" {
  BEGIN LINECOMMENT;
} /* begin skip LINECOMMENT */

<LINECOMMENT>\n {
  BEGIN INITIAL;
} /* end skip LINECOMMENT */

<LINECOMMENT>\r {
  BEGIN INITIAL;
} /* end skip LINECOMMENT */

<LINECOMMENT>. {
}

<INITIAL>{WS2}+ {
}

<INITIAL>"," {
  parse_parm *pp = PARM;

  pp->lineno = yylineno;
  return(COMMA);
}

<INITIAL>{MIN} {
  parse_parm *pp = PARM;

  pp->lineno = yylineno;
  return(MINIMISE);
}

<INITIAL>{MAX} {
  parse_parm *pp = PARM;

  pp->lineno = yylineno;
  return(MAXIMISE);
}

<INITIAL>{INNM} {
  parse_parm *pp = PARM;
  parse_vars *pv = (parse_vars *) pp->parse_vars;

  pp->lineno = yylineno;
  pv->f = atof((char *)yytext);
  return(INTCONS);
} /* f contains the last float */

<INITIAL>{NM} {
  parse_parm *pp = PARM;
  parse_vars *pv = (parse_vars *) pp->parse_vars;

  pp->lineno = yylineno;
  pv->f = atof((char *)yytext);
  return(CONS);
} /* f contains the last float */

<INITIAL>{INF} {
  parse_parm *pp = PARM;
  parse_vars *pv = (parse_vars *) pp->parse_vars;
  char *ptr, c;

  pp->lineno = yylineno;
  pv->f = DEF_INFINITE;
  pv->Sign = 0;
  ptr = (char *)yytext;
  while (isspace(*ptr)) ptr++;
  if(*ptr == '-')
    pv->Sign = 1;
  if(yyleng > 0) {
    c = yytext[yyleng - 1];
    if(!isalnum(c))
      unput(c);
  }
  return(INF);
} /* f contains the last float */

<INITIAL>{S_OP} {
  parse_parm *pp = PARM;
  parse_vars *pv = (parse_vars *) pp->parse_vars;
  int x;

  pp->lineno = yylineno;
  pv->Sign = 0;
  for(x = 0; x < yyleng; x++)
    if(yytext[x] == '-' || yytext[x] == '+')
      pv->Sign = (pv->Sign == (yytext[x] == '+'));
  return (TOK_SIGN);
  /* Sign is TRUE if the sign-string
     represents a '-'. Otherwise Sign
     is FALSE */
}

<INITIAL>{INT} {
  parse_parm *pp = PARM;
  parse_vars *pv = (parse_vars *) pp->parse_vars;

  pp->lineno = yylineno;
  if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl)) {
    pv->Within_int_decl = 1;
    pv->Within_sos_decl1 = FALSE;
  }
  return(SEC_INT);
}

<INITIAL>{BIN} {
  parse_parm *pp = PARM;
  parse_vars *pv = (parse_vars *) pp->parse_vars;

  pp->lineno = yylineno;
  if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl)) {
    pv->Within_int_decl = 2;
    pv->Within_sos_decl1 = FALSE;
  }
  return(SEC_BIN);
}

<INITIAL>{SEC} {
  parse_parm *pp = PARM;
  parse_vars *pv = (parse_vars *) pp->parse_vars;

  pp->lineno = yylineno;
  if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl)) {
    pv->Within_sec_decl = TRUE;
    pv->Within_sos_decl1 = FALSE;
  }
  return(SEC_SEC);
}

<INITIAL>{SOS} {
  parse_parm *pp = PARM;
  parse_vars *pv = (parse_vars *) pp->parse_vars;

  pp->lineno = yylineno;
  if(!pv->Within_sos_decl)
    pv->SOStype0 = (short)atoi(((char *)yytext) + 3);
  if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl))
    pv->Within_sos_decl = TRUE;
  return(SEC_SOS);
}

<INITIAL>{SOSD} {
  parse_parm *pp = PARM;
  parse_vars *pv = (parse_vars *) pp->parse_vars;

  pp->lineno = yylineno;
  FREE(pv->Last_var);
  pv->Last_var = strdup((char *)yytext);
  pv->Last_var[strlen(pv->Last_var) - 2] = 0;
  return(SOSDESCR);
}

<INITIAL>{FREE} {
  parse_parm *pp = PARM;
  parse_vars *pv = (parse_vars *) pp->parse_vars;

  pp->lineno = yylineno;
  if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl)) {
    pv->Within_free_decl = TRUE;
    pv->Within_sos_decl1 = FALSE;
  }
  return(SEC_FREE);
}

<INITIAL>{LBL} {
  parse_parm *pp = PARM;
  parse_vars *pv = (parse_vars *) pp->parse_vars;
  char *ptr;

  pp->lineno = yylineno;
  FREE(pv->Last_var);
  pv->Last_var = strdup((char *)yytext);
  ptr = pv->Last_var + strlen(pv->Last_var);
  ptr[-1] = ' ';
  while ((--ptr >= pv->Last_var) && (isspace(*ptr)))
    *ptr = 0;
  return(VARIABLECOLON);
}

<INITIAL>{VR} {
  parse_parm *pp = PARM;
  parse_vars *pv = (parse_vars *) pp->parse_vars;

  pp->lineno = yylineno;
  FREE(pv->Last_var);
  pv->Last_var = strdup((char *)yytext);
  return(VAR);
}

<INITIAL>":" {
  parse_parm *pp = PARM;

  pp->lineno = yylineno;
  return (COLON);
}

<INITIAL>"*" {
  parse_parm *pp = PARM;

  pp->lineno = yylineno;
  return(AR_M_OP);
}

<INITIAL>{OPEQ} {
  parse_parm *pp = PARM;
  parse_vars *pv = (parse_vars *) pp->parse_vars;

  pp->lineno = yylineno;
  pv->OP = *yytext;
  return(RE_OPEQ);
}

<INITIAL>{OPLE} {
  parse_parm *pp = PARM;
  parse_vars *pv = (parse_vars *) pp->parse_vars;

  pp->lineno = yylineno;
  pv->OP = *yytext;
  return(RE_OPLE);
}

<INITIAL>{OPGE} {
  parse_parm *pp = PARM;
  parse_vars *pv = (parse_vars *) pp->parse_vars;

  pp->lineno = yylineno;
  pv->OP = *yytext;
  return(RE_OPGE);
}

<INITIAL>";" {
  parse_parm *pp = PARM;
  parse_vars *pv = (parse_vars *) pp->parse_vars;

  pp->lineno = yylineno;
  pv->Within_int_decl = pv->Within_sec_decl = pv->Within_sos_decl = pv->Within_free_decl = FALSE;
  check_int_sec_sos_free_decl(pp, (int) pv->Within_int_decl, (int) pv->Within_sec_decl, (int) pv->Within_sos_decl, (int) pv->Within_free_decl);
  return(END_C);
}

<INITIAL>. {
  parse_parm *pp = PARM;

  pp->lineno = yylineno;
  report(NULL, CRITICAL, "LEX ERROR : %s lineno %d\n", yytext, yylineno);
  return(UNDEFINED);
}

%%
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.