/***************************************************************************** Copyright (C) 1994-2000 the Omega Project Team Copyright (C) 2005-2011 Chun Chen All Rights Reserved. Purpose: lex parser for calculator. Notes: History: 02/04/11 migrate to flex c++ mode, Chun Chen *****************************************************************************/ %{ #include #include #include #include #include #include #include #include #include "parser.tab.hh" #include myFlexLexer mylexer; bool is_interactive; const char *PROMPT_STRING = ">>>"; #define BUFFER scanBuf += yytext std::string scanBuf; std::string err_msg; extern bool need_coef; void yyerror(const std::string &s); void flushScanBuffer(); %} %s LATEX INCLUDE COMMENT %option yylineno %option noyywrap %% "<<" { BUFFER; BEGIN(INCLUDE); } [^>\n ]+">>" { BUFFER; scanBuf += "\n"; flushScanBuffer(); if (is_interactive) { std::cout << "file include disabled in interactive mode\n"; } else { char *s = yytext; while (*s != '>') s++; *s = '\0'; std::ifstream *ifs = new std::ifstream(yytext, std::ifstream::in); if (!ifs->is_open()) { fprintf(stderr, "Can't open file %s\n", yytext); } else { yy_buffer_state *bs = mylexer.yy_create_buffer(ifs, 8092); mylexer.yypush_buffer_state(bs); } } BEGIN(INITIAL); } [ \n] { std::cout << "Error in include syntax\n"; std::cout << "Use <> to include the file named fname\n"; BEGIN(INITIAL); if(is_interactive) { std::cout << PROMPT_STRING << ' '; std::cout.flush(); } } "\\ " { BUFFER; } [ \t]+ { BUFFER; } # { BUFFER; BEGIN(COMMENT); } .* { BUFFER; } "\$\$\n" { BUFFER; BEGIN(INITIAL); } "\$\$" { BUFFER; BEGIN(INITIAL); } "\$\$" { BUFFER; BEGIN(LATEX); } "\\n" { BUFFER; } "\\t" { BUFFER; } "\\!" { BUFFER; } "\\\\" { BUFFER; } "\n" { BUFFER; } \n { BUFFER; BEGIN(INITIAL); if(is_interactive) { std::cout << PROMPT_STRING << ' '; std::cout.flush(); } } "{" { BUFFER; return OPEN_BRACE; } "\\{" { BUFFER; return OPEN_BRACE; } "}" { BUFFER; return CLOSE_BRACE; } "\\}" { BUFFER; return CLOSE_BRACE; } "approximate" { BUFFER; return APPROX; } "union" { BUFFER; return UNION; } "\\cup" { BUFFER; return UNION; } "intersection" { BUFFER; return INTERSECTION; } "\\cap" { BUFFER; return INTERSECTION; } "without_simplify" { BUFFER; return NO_SIMPLIFY; } "symbolic" { BUFFER; return SYMBOLIC; } "sym" { BUFFER; return SYMBOLIC; } "\\mid" { BUFFER; return VERTICAL_BAR; } "|" { BUFFER; return VERTICAL_BAR; } "\\st" { BUFFER; return SUCH_THAT; } "s.t." { BUFFER; return SUCH_THAT; } "inverse" { BUFFER; return INVERSE; } "complement" { BUFFER; return COMPLEMENT; } "\\circ" { BUFFER; return COMPOSE; } "compose" { BUFFER; return COMPOSE; } "difference" { BUFFER; return DIFFERENCE; } "diffToRel" { BUFFER; return DIFFERENCE_TO_RELATION; } "project away symbols" { BUFFER; return PROJECT_AWAY_SYMBOLS; } "project_away_symbols" { BUFFER; return PROJECT_AWAY_SYMBOLS; } "projectAwaySymbols" { BUFFER; return PROJECT_AWAY_SYMBOLS; } "project on symbols" { BUFFER; return PROJECT_ON_SYMBOLS; } "project_on_symbols" { BUFFER; return PROJECT_ON_SYMBOLS; } "projectOnSymbols" { BUFFER; return PROJECT_ON_SYMBOLS; } "\\join" { BUFFER; return JOIN; } "\." { BUFFER; return JOIN; } "join" { BUFFER; return JOIN; } "domain" { BUFFER; return DOMAIN; } "time" { BUFFER; return TIME; } "timeclosure" { BUFFER; return TIMECLOSURE; } "range" { BUFFER; return RANGE; } "\\forall" { BUFFER; return FORALL; } "forall" { BUFFER; return FORALL; } "\\exists" { BUFFER; return EXISTS; } "exists" { BUFFER; return EXISTS; } "Venn" { BUFFER; return VENN; } "ConvexRepresentation" { BUFFER; return CONVEX_REPRESENTATION; } "ConvexCombination" { BUFFER; return CONVEX_COMBINATION; } "PositiveCombination" { BUFFER; return POSITIVE_COMBINATION; } "LinearCombination" { BUFFER; return LINEAR_COMBINATION; } "AffineCombination" { BUFFER; return AFFINE_COMBINATION; } "RectHull" { /*deprecated*/ BUFFER; return RECT_HULL; } "SimpleHull" { BUFFER; return SIMPLE_HULL; } "ConvexHull" { BUFFER; return CONVEX_HULL; } "DecoupledConvexHull" { BUFFER; return DECOUPLED_CONVEX_HULL; } "AffineHull" { BUFFER; return AFFINE_HULL; } "ConicHull" { BUFFER; return CONIC_HULL; } "LinearHull" { BUFFER; return LINEAR_HULL; } "PairwiseCheck" { /*deprecated*/ BUFFER; return PAIRWISE_CHECK; } "ConvexCheck" { /*deprecated*/ BUFFER; return CONVEX_CHECK; } "QuickHull" { /*deprecated*/ BUFFER; return QUICK_HULL; } "Hull" { BUFFER; return HULL; } "farkas" { BUFFER; return FARKAS; } "decoupledfarkas" { BUFFER; return DECOUPLED_FARKAS; } "decoupled-farkas" { BUFFER; return DECOUPLED_FARKAS; } "decoupled_farkas" { BUFFER; return DECOUPLED_FARKAS; } "minimize" { BUFFER; return MINIMIZE; } "maximize" { BUFFER; return MAXIMIZE; } "minimize-range" { BUFFER; return MINIMIZE_RANGE; } "maximize-range" { BUFFER; return MAXIMIZE_RANGE; } "minimizerange" { BUFFER; return MINIMIZE_RANGE; } "maximizerange" { BUFFER; return MAXIMIZE_RANGE; } "minimize-domain" { BUFFER; return MINIMIZE_DOMAIN; } "maximize-domain" { BUFFER; return MAXIMIZE_DOMAIN; } "minimizedomain" { BUFFER; return MINIMIZE_DOMAIN; } "maximizedomain" { BUFFER; return MAXIMIZE_DOMAIN; } "gist" { BUFFER; return GIST; } "given" { BUFFER; return GIVEN; } "within" { BUFFER; return WITHIN; } "subset" { BUFFER; return SUBSET; } "codegen" { BUFFER; return CODEGEN; } "upper_bound" { BUFFER; return MAKE_UPPER_BOUND; } "lower_bound" { BUFFER; return MAKE_LOWER_BOUND; } "supersetof" { BUFFER; return SUPERSETOF;} "subsetof" { BUFFER; return SUBSETOF;} "sym_example" { BUFFER; return SYM_SAMPLE;} "example" { BUFFER; return SAMPLE;} "carried_by" { BUFFER; return CARRIED_BY;} "reachable" { BUFFER; return REACHABLE_FROM; } "reachable of" { BUFFER; return REACHABLE_OF; } "restrict_domain" { BUFFER; return RESTRICT_DOMAIN; } "restrictDomain" { BUFFER; return RESTRICT_DOMAIN; } "\\" { BUFFER; return RESTRICT_DOMAIN; } "restrict_range" { BUFFER; return RESTRICT_RANGE; } "restrictRange" { BUFFER; return RESTRICT_RANGE; } "assertUnsatisfiable" { BUFFER; return ASSERT_UNSAT; } "assert_unsatisfiable" { BUFFER; return ASSERT_UNSAT; } "/" { BUFFER; return RESTRICT_RANGE; } "&" { BUFFER; return AND; } "|" { BUFFER; return OR; } "&&" { BUFFER; return AND; } "||" { BUFFER; return OR; } "and" { BUFFER; return AND; } "or" { BUFFER; return OR; } "\\land" { BUFFER; return AND; } "\\lor" { BUFFER; return OR; } "!" { BUFFER; return NOT; } "not" { BUFFER; return NOT; } "\\neg" { BUFFER; return NOT; } ":=" { BUFFER; return IS_ASSIGNED; } "->" { BUFFER; return GOES_TO; } "in" { BUFFER; return IN; } "\\rightarrow" { BUFFER; return GOES_TO; } "<=" { BUFFER; yylval.REL_OPERATOR = leq; return REL_OP; } "\\leq" { BUFFER; yylval.REL_OPERATOR = leq; return REL_OP; } "\\le" { BUFFER; yylval.REL_OPERATOR = leq; return REL_OP; } ">=" { BUFFER; yylval.REL_OPERATOR = geq; return REL_OP; } "\\geq" { BUFFER; yylval.REL_OPERATOR = geq; return REL_OP; } "\\ge" { BUFFER; yylval.REL_OPERATOR = geq; return REL_OP; } "!=" { BUFFER; yylval.REL_OPERATOR = neq; return REL_OP; } "\\neq" { BUFFER; yylval.REL_OPERATOR = neq; return REL_OP; } "<" { BUFFER; yylval.REL_OPERATOR = lt; return REL_OP; } ">" { BUFFER; yylval.REL_OPERATOR = gt; return REL_OP; } "=" { BUFFER; yylval.REL_OPERATOR = eq; return REL_OP; } "==" { BUFFER; yylval.REL_OPERATOR = eq; return REL_OP; } [A-Za-z_][A-Za-z0-9_]*[\']* { BUFFER; yylval.VAR_NAME = new char[yyleng+1]; strcpy(yylval.VAR_NAME,yytext); return VAR; } [A-Za-z][A-Za-z0-9_]*"(In)" { BUFFER; yylval.VAR_NAME = new char[yyleng+1]; strcpy(yylval.VAR_NAME,yytext); yylval.VAR_NAME[yyleng-3] = 'i'; // lowercase yylval.VAR_NAME[yyleng-2] = 'n'; return VAR; } [A-Za-z][A-Za-z0-9_]*"(Set)" { BUFFER; yylval.VAR_NAME = new char[yyleng+1]; strcpy(yylval.VAR_NAME,yytext); yylval.VAR_NAME[yyleng-4] = 'i'; // Change to "in" yylval.VAR_NAME[yyleng-3] = 'n'; // Be afraid yylval.VAR_NAME[yyleng-2] = ')'; yylval.VAR_NAME[yyleng-1] = '\0'; return VAR; } [A-Za-z][A-Za-z0-9_]*"(Out)" { BUFFER; yylval.VAR_NAME = new char[yyleng+1]; strcpy(yylval.VAR_NAME,yytext); yylval.VAR_NAME[yyleng-4] = 'o'; // lowercase yylval.VAR_NAME[yyleng-3] = 'u'; yylval.VAR_NAME[yyleng-2] = 't'; return VAR; } "\\"[A-Za-z][A-Za-z0-9_]* { BUFFER; yylval.VAR_NAME = new char[yyleng+1]; strcpy(yylval.VAR_NAME,yytext); return VAR; } "\\"[A-Za-z][A-Za-z0-9_]*"(In)" { BUFFER; yylval.VAR_NAME = new char[yyleng+1]; strcpy(yylval.VAR_NAME,yytext); yylval.VAR_NAME[yyleng-3] = 'i'; // lowercase yylval.VAR_NAME[yyleng-2] = 'n'; return VAR; } "\\"[A-Za-z][A-Za-z0-9_]*"(Set)" { BUFFER; yylval.VAR_NAME = new char[yyleng+1]; strcpy(yylval.VAR_NAME,yytext); yylval.VAR_NAME[yyleng-4] = 'i'; // Change to "in" yylval.VAR_NAME[yyleng-3] = 'n'; // Be afraid yylval.VAR_NAME[yyleng-2] = ')'; yylval.VAR_NAME[yyleng-1] = '\0'; return VAR; } "\\"[A-Za-z][A-Za-z0-9_]*"(Out)" { BUFFER; yylval.VAR_NAME = new char[yyleng+1]; strcpy(yylval.VAR_NAME,yytext); yylval.VAR_NAME[yyleng-4] = 'o'; // lowercase yylval.VAR_NAME[yyleng-3] = 'u'; yylval.VAR_NAME[yyleng-2] = 't'; return VAR; } [0-9]+ { BUFFER; if (need_coef) { sscanf(yytext, coef_fmt, &yylval.COEF_VALUE); return COEF; } else { yylval.INT_VALUE = atoi(yytext); return INT; } } \"[^\"]*\" { BUFFER; yytext[yyleng-1]='\0'; yylval.STRING_VALUE = new std::string(yytext+1); return STRING; } <> { mylexer.yypop_buffer_state(); if (!YY_CURRENT_BUFFER) { flushScanBuffer(); return YY_NULL; } } . { BUFFER; return yytext[0]; } %% void flushScanBuffer() { if (scanBuf.size() == 0) return; if (!is_interactive) { size_t prev_pos = 0; if (scanBuf[0] == '\n') prev_pos = 1; for (size_t pos = prev_pos; pos <= scanBuf.size(); pos++) { if (pos == scanBuf.size() || scanBuf[pos] == '\n') { std::cout << PROMPT_STRING << " " << scanBuf.substr(prev_pos, pos-prev_pos) << std::endl; prev_pos = pos+1; } } } scanBuf.clear(); }