7 #include "glps_parser.h"
8 #include "flame/config.h"
10 # define M_PI 3.14159265358979323846
16 int unary_negate(parse_context* ctxt, expr_value_t *R,
const expr_t *
const *A)
18 *R = -boost::get<double>(A[0]->value);
22 int unary_sin(parse_context* ctxt, expr_value_t *R,
const expr_t *
const *A)
24 *R = sin(boost::get<double>(A[0]->value));
27 int unary_cos(parse_context* ctxt, expr_value_t *R,
const expr_t *
const *A)
29 *R = cos(boost::get<double>(A[0]->value));
32 int unary_tan(parse_context* ctxt, expr_value_t *R,
const expr_t *
const *A)
34 *R = tan(boost::get<double>(A[0]->value));
37 int unary_asin(parse_context* ctxt, expr_value_t *R,
const expr_t *
const *A)
39 *R = asin(boost::get<double>(A[0]->value));
42 int unary_acos(parse_context* ctxt, expr_value_t *R,
const expr_t *
const *A)
44 *R = acos(boost::get<double>(A[0]->value));
47 int unary_atan(parse_context* ctxt, expr_value_t *R,
const expr_t *
const *A)
49 *R = atan(boost::get<double>(A[0]->value));
53 int unary_deg2rad(parse_context* ctxt, expr_value_t *R,
const expr_t *
const *A)
55 double val = boost::get<double>(A[0]->value);
60 int unary_rad2deg(parse_context* ctxt, expr_value_t *R,
const expr_t *
const *A)
62 double val = boost::get<double>(A[0]->value);
68 int binary_add(parse_context* ctxt, expr_value_t *R,
const expr_t *
const *A)
70 *R = boost::get<double>(A[0]->value)+boost::get<double>(A[1]->value);
73 int binary_sub(parse_context* ctxt, expr_value_t *R,
const expr_t *
const *A)
75 *R = boost::get<double>(A[0]->value)-boost::get<double>(A[1]->value);
78 int binary_mult(parse_context* ctxt, expr_value_t *R,
const expr_t *
const *A)
80 *R = boost::get<double>(A[0]->value)*boost::get<double>(A[1]->value);
83 int binary_div(parse_context* ctxt, expr_value_t *R,
const expr_t *
const *A)
85 double result = boost::get<double>(A[0]->value)/boost::get<double>(A[1]->value);
86 if(!isfinite(result)) {
87 ctxt->last_error =
"division results in non-finite value";
96 int unary_bl_negate(parse_context* ctxt, expr_value_t *R,
const expr_t *
const *A)
99 const std::vector<std::string>& line = boost::get<std::vector<std::string> >(A[0]->value);
100 std::vector<std::string> ret(line.size());
101 std::copy(line.rbegin(),
108 template<
int MULT,
int LINE>
109 int binary_bl_mult(parse_context* ctxt, expr_value_t *R,
const expr_t *
const *A)
112 assert(A[MULT]->etype==glps_expr_number);
113 assert(A[LINE]->etype==glps_expr_line);
115 double factor = boost::get<double>(A[MULT]->value);
117 if(factor<0.0 || factor>std::numeric_limits<unsigned>::max()) {
118 ctxt->last_error =
"beamline scale by negative value or out of range value";
121 unsigned factori = (unsigned)factor;
123 const std::vector<std::string>& line = boost::get<std::vector<std::string> >(A[LINE]->value);
125 std::vector<std::string> ret(line.size()*factori);
129 std::vector<std::string>::iterator outi = ret.begin();
132 outi = std::copy(line.begin(),
140 int unary_parse(parse_context* ctxt, expr_value_t *R,
const expr_t *
const *A)
142 using namespace boost::filesystem;
143 assert(A[0]->etype==glps_expr_string);
144 path name(canonical(boost::get<std::string>(A[0]->value), ctxt->cwd));
149 boost::shared_ptr<Config> ret(P.parse_file(name.native().c_str()));
154 int unary_file(parse_context* ctxt, expr_value_t *R,
const expr_t *
const *A)
156 using namespace boost::filesystem;
157 const std::string& inp = boost::get<std::string>(A[0]->value);
158 path ret(canonical(inp, ctxt->cwd));
161 std::ostringstream strm;
162 strm<<
"\""<<ret<<
"\" does not exist";
163 ctxt->last_error = strm.str();
172 int unary_h5file(parse_context* ctxt, expr_value_t *R,
const expr_t *
const *A)
174 using namespace boost::filesystem;
175 const std::string& inp = boost::get<std::string>(A[0]->value);
183 size_t sep = inp.npos;
186 sep = inp.find_last_of(
'/', sep-1);
188 path fname(absolute(inp.substr(0, sep), ctxt->cwd));
191 *R = canonical(fname).native() + inp.substr(sep);
193 }
else if(sep==inp.npos) {
198 std::ostringstream strm;
199 strm<<
"\""<<inp<<
"\" does not exist";
200 ctxt->last_error = strm.str();
207 parse_context::parse_context(
const char *path)
208 :last_line(0), printer(NULL), error_scratch(300), scanner(NULL)
211 cwd = boost::filesystem::canonical(path);
213 cwd = boost::filesystem::current_path();
214 addop(
"-", &unary_negate, glps_expr_number, 1, glps_expr_number);
216 addop(
"sin", &unary_sin, glps_expr_number, 1, glps_expr_number);
217 addop(
"cos", &unary_cos, glps_expr_number, 1, glps_expr_number);
218 addop(
"tan", &unary_tan, glps_expr_number, 1, glps_expr_number);
219 addop(
"asin",&unary_asin,glps_expr_number, 1, glps_expr_number);
220 addop(
"acos",&unary_acos,glps_expr_number, 1, glps_expr_number);
221 addop(
"atan",&unary_atan,glps_expr_number, 1, glps_expr_number);
223 addop(
"arcsin",&unary_asin,glps_expr_number, 1, glps_expr_number);
224 addop(
"arccos",&unary_acos,glps_expr_number, 1, glps_expr_number);
225 addop(
"arctan",&unary_atan,glps_expr_number, 1, glps_expr_number);
227 addop(
"deg2rad",&unary_deg2rad,glps_expr_number, 1, glps_expr_number);
228 addop(
"rad2deg",&unary_rad2deg,glps_expr_number, 1, glps_expr_number);
230 addop(
"+", &binary_add, glps_expr_number, 2, glps_expr_number, glps_expr_number);
231 addop(
"-", &binary_sub, glps_expr_number, 2, glps_expr_number, glps_expr_number);
232 addop(
"*", &binary_mult,glps_expr_number, 2, glps_expr_number, glps_expr_number);
233 addop(
"/", &binary_div, glps_expr_number, 2, glps_expr_number, glps_expr_number);
235 addop(
"-", &unary_bl_negate, glps_expr_line, 1, glps_expr_line);
237 addop(
"*", &binary_bl_mult<0,1>, glps_expr_line, 2, glps_expr_number, glps_expr_line);
238 addop(
"*", &binary_bl_mult<1,0>, glps_expr_line, 2, glps_expr_line, glps_expr_number);
240 addop(
"parse", &unary_parse, glps_expr_config, 1, glps_expr_string);
241 addop(
"file", &unary_file, glps_expr_string, 1, glps_expr_string);
242 addop(
"dir", &unary_file, glps_expr_string, 1, glps_expr_string);
244 addop(
"h5file", &unary_h5file, glps_expr_string, 1, glps_expr_string);
248 parse_context::~parse_context()
void setPrinter(std::ostream *)
Set output for lexer/parser error messages.
Interface to lattice file parser.