aboutsummaryrefslogtreecommitdiff
path: root/Source/Parser/wp_parser.l
blob: 8e70203cbf4eb8c93f95f056e4f73e3692b52148 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
%option noyywrap nodefault
%{
#include "wp_parser_y.h"
#include "wp_parser.tab.h"
%}

 /* Tokens NUMBER, SYMBOL, F1, POW, F2, etc. are defined in wp_parser.y. */
 /* Types WP_SQRT, WP_SQRT, etc. are defined in wp_parser_y.h. */

 /* Used leater to define NUMBER */
EXP	([Ee][-+]?[0-9]+)

%%

"+" |
"-" |
"*" |
"/" |
"=" |
"|" |
"," |
"<" |
">" |
"(" |
")"     { return yytext[0]; } /* simply pass through */

 /* yylval is union type defined in wp_parser.tab.h that is generated
  * by bison with wp_parser.y */

"sqrt"        { yylval.f1 = WP_SQRT;      return F1; }
"exp"         { yylval.f1 = WP_EXP;       return F1; }
"log"         { yylval.f1 = WP_LOG;       return F1; }
"log10"       { yylval.f1 = WP_LOG10;     return F1; }
"sin"         { yylval.f1 = WP_SIN;       return F1; }
"cos"         { yylval.f1 = WP_COS;       return F1; }
"tan"         { yylval.f1 = WP_TAN;       return F1; }
"asin"        { yylval.f1 = WP_ASIN;      return F1; }
"acos"        { yylval.f1 = WP_ACOS;      return F1; }
"atan"        { yylval.f1 = WP_ATAN;      return F1; }
"sinh"        { yylval.f1 = WP_SINH;      return F1; }
"cosh"        { yylval.f1 = WP_COSH;      return F1; }
"tanh"        { yylval.f1 = WP_TANH;      return F1; }
"abs"         { yylval.f1 = WP_ABS;       return F1; }
"fabs"        { yylval.f1 = WP_ABS;       return F1; }
"**"          { yylval.f2 = WP_POW;       return POW;}
"^"           { yylval.f2 = WP_POW;       return POW;}
">="          { yylval.f2 = WP_GEQ;       return GEQ;}
"<="          { yylval.f2 = WP_LEQ;       return LEQ;}
"=="          { yylval.f2 = WP_EQ;        return EQ;}
"!="          { yylval.f2 = WP_NEQ;       return NEQ;}
"and"         { yylval.f2 = WP_AND;       return AND;}
"or"          { yylval.f2 = WP_OR;        return OR;}
"pow"         { yylval.f2 = WP_POW;       return F2; }
"heaviside"   { yylval.f2 = WP_HEAVISIDE; return F2; }
"min"         { yylval.f2 = WP_MIN;       return F2; }
"max"         { yylval.f2 = WP_MAX;       return F2; }

 /* We use SYMBOL to hold variables and constants */
[a-zA-Z_][a-zA-Z0-9_]*  { yylval.s = wp_makesymbol(yytext); return SYMBOL; }

 /* Number */
[0-9]+"."[0-9]*{EXP}? |
"."?[0-9]+{EXP}?  { yylval.d = atof(yytext);   return NUMBER; }

 /* Special characters */
"//".*
[ \t]   /* ignore white space */
\\\n    /* ignore line continuation */
"\n"    { return EOL; }

 /* everything else */
.	{ yyerror("Unknow character %c\n", *yytext); }

%%