Line data Source code
1 : %{ /* -*- C++ -*- */
2 : # include <cstdlib>
3 : # include <errno.h>
4 : # include <limits.h>
5 : # include <string>
6 : # include "Eval.hpp"
7 :
8 : # undef yywrap
9 : # define yywrap() 1
10 :
11 : # define YY_DECL EVAL_DECL
12 :
13 : /* By default evallex returns int, we use token_type.
14 : Unfortunately evalterminate by default returns 0, which is
15 : not of token_type. */
16 : #define yyterminate() return token::END
17 :
18 : #ifndef __clang_analyzer__
19 : %}
20 :
21 : %option noyywrap nounput batch
22 :
23 : STR [a-zA-Z][a-zA-Z_0-9]*
24 : INT [0-9]+|[0-9]*
25 : REAL ([0-9]+|[0-9]*\.[0-9]+)([eE][-+]?[0-9]+)?
26 : blank [ \t]
27 :
28 : %{
29 : # define EVAL_USER_ACTION evallloc->columns (evalleng);
30 : %}
31 : %%
32 : %{
33 1070 : evallloc->step ();
34 : %}
35 24 : {blank}+ evallloc->step ();
36 24 : [\n]+ evallloc->lines (evalleng); evallloc->step ();
37 0 :
38 : %{
39 : typedef eval::Eval_parser::token token;
40 : %}
41 : /* Convert ints to the actual type of tokens. */
42 0 : [{}] return eval::Eval_parser::token_type (evaltext[0]);
43 :
44 :
45 :
46 0 : "(" {evallval->name = new std::string (evaltext); return token::LB;
47 : Evaluate.error (*evallloc, "( expected");}
48 0 : ")" {evallval->name = new std::string (evaltext); return token::RB;
49 : Evaluate.error (*evallloc, ") expected");}
50 :
51 0 : "," {evallval->name = new std::string (evaltext); return token::COMMA;
52 : Evaluate.error (*evallloc, ", expected");}
53 :
54 0 : "/" {evallval->name = new std::string (evaltext); return token::DIV;
55 : Evaluate.error (*evallloc, "/ expected");}
56 12 : "*" {evallval->name = new std::string (evaltext); return token::MUL;
57 : Evaluate.error (*evallloc, "* expected");}
58 0 : "+" {evallval->name = new std::string (evaltext); return token::PLUS;
59 : Evaluate.error (*evallloc, "+ expected");}
60 0 : "-" {evallval->name = new std::string (evaltext); return token::MINUS;
61 : Evaluate.error (*evallloc, "- expected");}
62 0 : "^" {evallval->name = new std::string (evaltext); return token::POWER;
63 : Evaluate.error (*evallloc, "^ expected");}
64 :
65 :
66 0 : "min" {evallval->name = new std::string (evaltext); return token::MIN;
67 : Evaluate.error (*evallloc, "min expected");}
68 :
69 0 : "max" {evallval->name = new std::string (evaltext); return token::MAX;
70 : Evaluate.error (*evallloc, "max expected");}
71 :
72 0 : "floor" {evallval->name = new std::string (evaltext); return token::FLOOR;
73 : Evaluate.error (*evallloc, "floor expected");}
74 0 : "double" {evallval->name = new std::string (evaltext); return token::DOUBLE;
75 : Evaluate.error (*evallloc, "double expected");}
76 :
77 :
78 : {INT} {
79 458 : errno = 0;
80 458 : int x=atoi(evaltext);
81 458 : evallval->IntVal = x;
82 458 : return token::ival;
83 : }
84 :
85 : {REAL} {
86 72 : errno = 0;
87 72 : double x=atof(evaltext);
88 72 : evallval->RealVal = x;
89 72 : return token::rval;
90 : }
91 :
92 10 : {STR} {evallval->name = new std::string (evaltext); return token::str;
93 : Evaluate.error (*evallloc, "invalid character");}
94 :
95 :
96 :
97 :
98 0 : %%
99 0 :
100 :
101 :
102 :
103 : void
104 : Eval::scan_end ()
105 528 : {
106 : evallex_destroy();
107 528 : }
108 528 :
109 :
110 : void Eval::scan_expression (const std::string& f){
111 528 : const char* ch=f.c_str();
112 528 : evalset_debug(trace_scanning);
113 528 :
114 : // EVAL_BUFFER_STATE b=eval_scan_string(ch);
115 : // eval_switch_to_buffer(b);
116 : eval_scan_string(ch);
117 528 : }
118 633 : #endif // not __clang_analyzer__
119 :
120 :
|