# OpenMP PEG grammar %preamble { #include "parser/peg/rules.h" #include using namespace std; using namespace seq::ast; #define V0 VS[0] #define V1 VS[1] #define ac std::any_cast } pragma <- "omp"? _ "parallel"? _ (clause _)* { vector v; for (auto &i: VS) { auto vi = ac>(i); v.insert(v.end(), vi.begin(), vi.end()); } return v; } clause <- / "schedule" _ "(" _ schedule_kind (_ "," _ int)? _ ")" { vector v{{"schedule", make_shared(ac(V0))}}; if (VS.size() > 1) v.push_back({"chunk_size", make_shared(ac(V1))}); return v; } / "num_threads" _ "(" _ int _ ")" { return vector{{"num_threads", make_shared(ac(V0))}}; } / "ordered" { return vector{{"ordered", make_shared(true)}}; } schedule_kind <- ("static" / "dynamic" / "guided" / "auto" / "runtime") { return VS.token_to_string(); } int <- [1-9] [0-9]* { return stoi(VS.token_to_string()); } # ident <- [a-zA-Z_] [a-zA-Z_0-9]* { # return make_shared(VS.token_to_string()); # } ~SPACE <- [ \t]+ ~_ <- SPACE*