Skip to content

Commit 50be59b

Browse files
committed
Improved parser
1 parent abef7ae commit 50be59b

30 files changed

Lines changed: 647 additions & 85 deletions

eval/visitors/func_evaluator.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,13 @@ ExprBaseType BuiltInOperators::oppositeEvaluator(const EBTList& args)
4040
, "oppositeEvaluator: wrong number of arguments\n");
4141

4242
auto opposite_evaluator = Overload {
43-
[](LIB::NAT a) { return LIB::RATIONAL(a, -1); },
44-
[](LIB::RATIONAL a) { return LIB::RATIONAL(-1)*a; },
43+
[](LIB::NAT a) { return ExprBaseType(LIB::RATIONAL(a, -1)); },
44+
[](LIB::RATIONAL a) { return ExprBaseType(LIB::RATIONAL(-1)*a); },
45+
[](LIB::Set a) { return ExprBaseType(a.complement()); },
4546
[](auto a) {
4647
Util::ERROR("oppositeEvaluator: wrong type argument ", a
4748
, " for - (opposite)\n");
48-
return LIB::RATIONAL(0);
49+
return ExprBaseType(LIB::RATIONAL(0));
4950
}
5051
};
5152
return std::visit(opposite_evaluator, args[0]);
@@ -131,6 +132,7 @@ ExprBaseType BuiltInOperators::subEvaluator(const EBTList& args)
131132
return ExprBaseType(a - LIB::RATIONAL(b));
132133
},
133134
[](LIB::Exp a, LIB::Exp b) { return ExprBaseType(a - b); },
135+
[](LIB::Map a, LIB::Map b) { return ExprBaseType(a - b); },
134136
[](LIB::PWMap a, LIB::PWMap b) { return ExprBaseType(a - b); },
135137
[](auto a, auto b) {
136138
Util::ERROR("subEvaluator: wrong arguments ", a, ", ", b

eval/visitors/linear_expr_evaluator.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ LIB::LExp LinearExprEvaluator::operator()(AST::UnaryOp v) const
5656

5757
switch (v.op()) {
5858
case AST::UnOp::oppo:
59-
LIB::LExp(-le.slope(), -le.offset());
59+
return LIB::LExp(-le.slope(), -le.offset());
6060
break;
6161

6262
default:
@@ -95,7 +95,7 @@ LIB::LExp LinearExprEvaluator::operator()(AST::BinOp v) const
9595
break;
9696

9797
default:
98-
Util::ERROR("LinearExprEvaluator: UnaryOp ", v.op(), " is not arithmetic\n");
98+
Util::ERROR("LinearExprEvaluator: BinOp ", v.op(), " is not arithmetic\n");
9999
break;
100100
};
101101

parser/expr.hpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ struct ExprRule : qi::grammar<Iterator, Skipper<Iterator>, AST::ExprList()> {
4141

4242
// Rules with no skip
4343
qi::rule<Iterator> comment;
44-
qi::rule<Iterator, AST::Name()> ident;
44+
qi::rule<Iterator, AST::Name()> identifier;
4545
qi::rule<Iterator, AST::Name()> func_name;
4646

4747
// Operators tokens
@@ -51,10 +51,12 @@ struct ExprRule : qi::grammar<Iterator, Skipper<Iterator>, AST::ExprList()> {
5151

5252
// Other rules
5353
qi::rule<Iterator, Skipper<Iterator>, LIB::NAT()> nat;
54-
qi::rule<Iterator, Skipper<Iterator>, AST::Expr()> int_expr;
55-
qi::rule<Iterator, Skipper<Iterator>, AST::Rational> rat_legacy;
56-
qi::rule<Iterator, Skipper<Iterator>, AST::Expr()> rat_primary;
57-
qi::rule<Iterator, Skipper<Iterator>, AST::Expr()> rat_term;
54+
qi::rule<Iterator, Skipper<Iterator>, AST::Expr()> int_value;
55+
qi::rule<Iterator, Skipper<Iterator>, AST::Rational> rational_legacy;
56+
qi::rule<Iterator, Skipper<Iterator>, AST::Rational> rational;
57+
qi::rule<Iterator, Skipper<Iterator>, AST::Expr()> primary;
58+
qi::rule<Iterator, Skipper<Iterator>, AST::Expr()> factor;
59+
qi::rule<Iterator, Skipper<Iterator>, AST::Expr()> term;
5860
qi::rule<Iterator, Skipper<Iterator>, AST::Expr()> arithmetic_expr;
5961

6062
qi::rule<Iterator, Skipper<Iterator>, AST::Expr()> nat_primary;
@@ -88,6 +90,7 @@ struct ExprRule : qi::grammar<Iterator, Skipper<Iterator>, AST::ExprList()> {
8890
qi::rule<Iterator, Skipper<Iterator>, AST::Expr()> sbg_term;
8991
qi::rule<Iterator, Skipper<Iterator>, AST::Expr()> sbg_expr;
9092

93+
qi::rule<Iterator, Skipper<Iterator>, AST::Expr()> relation;
9194
qi::rule<Iterator, Skipper<Iterator>, AST::Expr()> expr;
9295
qi::rule<Iterator, Skipper<Iterator>, AST::ExprList()> expr_list;
9396

parser/expr_def.hpp

Lines changed: 38 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <boost/phoenix/core.hpp>
2424
#include <boost/phoenix/operator.hpp>
2525
#include <boost/phoenix/object.hpp>
26+
#include <boost/spirit/include/qi.hpp>
2627

2728
#include "ast/expr.hpp"
2829
#include "sbg/rational.hpp"
@@ -100,35 +101,18 @@ struct add_symbols_struct : qi::symbols<char, AST::Op> {
100101
} add_symbols;
101102

102103
struct mult_symbol_struct : qi::symbols<char, AST::Op> {
103-
mult_symbol_struct(){
104+
mult_symbol_struct() {
104105
add("*", AST::Op::mult);
105106
}
106107
} mult_symbol;
107108

108-
struct expo_symbol_struct : qi::symbols<char, AST::Op> {
109-
expo_symbol_struct() {
110-
add("^", AST::Op::expo);
111-
}
112-
} expo_symbol;
113-
114109
struct unary_symbol_struct : qi::symbols<char, AST::UnOp> {
115110
unary_symbol_struct() {
116-
add("-", AST::UnOp::oppo);
111+
add("-", AST::UnOp::oppo)
112+
("#", AST::UnOp::card);
117113
}
118114
} unary_symbol;
119115

120-
struct mixed_unary_symbol_struct : qi::symbols<char, AST::UnOp> {
121-
mixed_unary_symbol_struct() {
122-
add("#", AST::UnOp::card);
123-
}
124-
} mixed_unary_symbol;
125-
126-
struct sbg_unary_symbol_struct : qi::symbols<char, AST::UnOp> {
127-
sbg_unary_symbol_struct() {
128-
add("\'", AST::UnOp::comp);
129-
}
130-
} sbg_unary_symbol;
131-
132116
struct binary_symbol_struct : qi::symbols<char, AST::Op> {
133117
binary_symbol_struct() {
134118
add("+", AST::Op::add)
@@ -166,8 +150,6 @@ ExprRule<Iterator>::ExprRule(Iterator &it) :
166150
, OANGLE("<<")
167151
, CANGLE(">>")
168152
, CARTPROD("x")
169-
, SLO("*")
170-
, VAR("x")
171153
, ADD("+")
172154
, SUB("-")
173155
, PIPE("|")
@@ -181,58 +163,44 @@ ExprRule<Iterator>::ExprRule(Iterator &it) :
181163
, MAPB("mapB:")
182164
, MAPD("mapD:")
183165
{
184-
ident = qi::lexeme[qi::char_("a-xy-zA-XY-Z")
185-
>> *(qi::alnum | qi::char_('_'))]
186-
| qi::lexeme[qi::char_("x") >> +(qi::alnum | qi::char_('_'))];
166+
identifier = qi::lexeme[qi::char_("a-zA-Z")
167+
>> *(qi::alnum | qi::char_('_'))];
187168

188169
nat = qi::lexeme[qi::ulong_long][qi::_val = phx::construct<LIB::NAT>(qi::_1)];
189170

190-
int_expr = nat[qi::_val = qi::_1]
191-
| ident[qi::_val = qi::_1];
192-
193-
rat_legacy = (RAT
171+
rational_legacy = (RAT
194172
>> OPAREN
195-
>> int_expr
196-
>> COMA
197-
>> int_expr
173+
>> qi::lexeme[qi::int_]
174+
>> COMA
175+
>> qi::lexeme[qi::int_]
198176
>> CPAREN)[qi::_val = phx::construct<AST::Rational>(qi::_1, qi::_2)];
199177

200-
rat_primary = rat_legacy[qi::_val = qi::_1]
201-
| (int_expr >> DIV >> int_expr)
202-
[qi::_val = phx::construct<AST::Rational>(qi::_1, qi::_2)]
203-
| int_expr[qi::_val = qi::_1]
204-
| (OPAREN >> arithmetic_expr>> CPAREN)
178+
rational = rational_legacy[qi::_val = qi::_1]
179+
| (qi::lexeme[qi::int_] >> DIV >> qi::lexeme[qi::int_])
180+
[qi::_val = phx::construct<AST::Rational>(qi::_1, qi::_2)];
181+
182+
primary = rational[qi::_val = qi::_1]
183+
| nat[qi::_val = qi::_1]
184+
| identifier[qi::_val = qi::_1]
185+
| (OPAREN >> arithmetic_expr >> CPAREN)
205186
[qi::_val = phx::construct<AST::ParenExpr>(qi::_1)];
206187

207-
rat_term = rat_primary[qi::_val = qi::_1] >> *(mult_symbol >> rat_primary)
188+
factor = (unary_symbol >> primary)
189+
[qi::_val = phx::construct<AST::UnaryOp>(qi::_1, qi::_2)]
190+
| primary[qi::_val = qi::_1];
191+
192+
term = factor[qi::_val = qi::_1] >> *(mult_symbol >> factor)
208193
[qi::_val = phx::construct<AST::BinOp>(qi::_val, qi::_1, qi::_2)];
209194

210-
arithmetic_expr = (rat_term[qi::_val = qi::_1] >> *(add_symbols >> rat_term)
211-
[qi::_val = phx::construct<AST::BinOp>(qi::_val, qi::_1, qi::_2)])
212-
| (unary_symbol >> rat_term)
213-
[qi::_val = phx::construct<AST::UnaryOp>(qi::_1, qi::_2)]
214-
| (mixed_unary_symbol >> sbg_expr)
215-
[qi::_val = phx::construct<AST::UnaryOp>(qi::_1, qi::_2)];
195+
arithmetic_expr = term[qi::_val = qi::_1] >> *(add_symbols >> term)
196+
[qi::_val = phx::construct<AST::BinOp>(qi::_val, qi::_1, qi::_2)];
216197

217198
// ------------ //
218199

219-
nat_primary = nat[qi::_val = qi::_1]
220-
| ident[qi::_val = qi::_1];
221-
222-
nat_factor = nat_primary[qi::_val = qi::_1]
223-
>> -(expo_symbol >> nat_primary)
224-
[qi::_val = phx::construct<AST::BinOp>(qi::_val, qi::_1, qi::_2)];
225-
226-
nat_term = nat_factor[qi::_val = qi::_1] >> *(mult_symbol >> nat_factor)
227-
[qi::_val = phx::construct<AST::BinOp>(qi::_val, qi::_1, qi::_2)];
228-
229-
nat_expr = nat_term[qi::_val = qi::_1] >> *(add_symbols >> nat_term)
230-
[qi::_val = phx::construct<AST::BinOp>(qi::_val, qi::_1, qi::_2)];
231-
232200
interval = (OBRACKET
233-
>> nat_expr >> COLON
234-
>> ((nat_expr >> COLON) | qi::attr(phx::construct<AST::Expr>(1)))
235-
>> nat_expr >> CBRACKET)
201+
>> arithmetic_expr >> COLON
202+
>> ((arithmetic_expr >> COLON) | qi::attr(phx::construct<AST::Expr>(1)))
203+
>> arithmetic_expr >> CBRACKET)
236204
[qi::_val = phx::construct<AST::Interval>(qi::_1, qi::_2, qi::_3)];
237205

238206
// ------------ //
@@ -320,23 +288,23 @@ ExprRule<Iterator>::ExprRule(Iterator &it) :
320288
| mdlexp
321289
| set
322290
| md_inter
323-
| arithmetic_expr;
291+
| arithmetic_expr
292+
| (OPAREN >> sbg_expr >> CPAREN);
324293

325-
sbg_factor = (sbg_primary
326-
| (OPAREN >> sbg_expr >> CPAREN)
327-
[qi::_val = phx::construct<AST::ParenExpr>(qi::_1)])[qi::_val = qi::_1]
328-
>> -(sbg_unary_symbol
329-
[qi::_val = phx::construct<AST::UnaryOp>(qi::_1, qi::_val)]);
294+
sbg_factor = (unary_symbol >> sbg_primary)
295+
[qi::_val = phx::construct<AST::UnaryOp>(qi::_1, qi::_2)]
296+
| sbg_primary[qi::_val = qi::_1];
330297

331-
sbg_expr = (sbg_factor >> binary_symbol >> sbg_factor)
332-
[qi::_val = phx::construct<AST::BinOp>(qi::_1, qi::_2, qi::_3)]
333-
| sbg_factor[qi::_val = qi::_1];
298+
sbg_expr = sbg_factor[qi::_val = qi::_1] >> *(binary_symbol >> sbg_factor)
299+
[qi::_val = phx::construct<AST::BinOp>(qi::_val, qi::_1, qi::_2)];
334300

335301
// ------------ //
336302

337-
expr = sbg_expr[qi::_val = qi::_1] >> -(rel_symbol >> sbg_expr)
303+
relation = sbg_expr[qi::_val = qi::_1] >> -(rel_symbol >> sbg_expr)
338304
[qi::_val = phx::construct<AST::BinOp>(qi::_val, qi::_1, qi::_2)];
339305

306+
expr = relation;
307+
340308
expr_list = expr % COMA;
341309
};
342310

parser/statement_def.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ StmRule<Iterator>::StmRule(Iterator &it) : StmRule::base_type(stms)
5353
cfg_dims = (NMBR_DIMS >> qi::uint_)
5454
[qi::_val = phx::construct<AST::ConfigDims>(qi::_1)];
5555

56-
assign = (expr.ident >> ASSIGN >> expr.expr)
56+
assign = (expr.identifier >> ASSIGN >> expr.expr)
5757
[qi::_val = phx::construct<AST::Assign>(qi::_1, qi::_2)];
5858

5959
stm = assign >> expr.SEMI;

test/Test

Whitespace-only changes.

test/Test1D_sbg_input.sbg

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
V0 = 0;
2+
E0 = 0;
3+
V1 = V0+10;
4+
V2 = V1+10;
5+
V3 = V2+10;
6+
V4 = V3+1;
7+
V5 = V4+1;
8+
V6 = V5+9;
9+
V7 = V6+9;
10+
V8 = V7+10;
11+
E1 = E0+1;
12+
offM11 = V0 - E0;
13+
offM21 = V3 - E0;
14+
E2 = E1+1;
15+
offM12 = V1 - E1;
16+
offM22 = V3 - E1;
17+
E3 = E2+1;
18+
offM13 = V0 - E2;
19+
offM23 = V4 - E2;
20+
E4 = E3+1;
21+
offM14 = V1 - E3;
22+
offM24 = V4 - E3;
23+
E5 = E4+9;
24+
offM15 = V0 - E4 + 2;
25+
offM25 = V5 - E4;
26+
E6 = E5+9;
27+
offM16 = V1 - E5 + 1;
28+
offM26 = V5 - E5;
29+
E7 = E6+9;
30+
offM17 = V1 - E6 + 2;
31+
offM27 = V5 - E6;
32+
E8 = E7+9;
33+
offM18 = V0 - E7 + 2;
34+
offM28 = V6 - E7;
35+
E9 = E8+9;
36+
offM19 = V1 - E8 + 2;
37+
offM29 = V6 - E8;
38+
E10 = E9+10;
39+
offM110 = V0 - E9 + 1;
40+
offM210 = V7 - E9;
41+
E11 = E10+10;
42+
offM111 = V2 - E10 + 1;
43+
offM211 = V7 - E10;
44+
45+
matchSCCTS(
46+
V: {[V0+1:1:V1], [V1+1:1:V2], [V2+1:1:V3], [V3+1:1:V4], [V4+1:1:V5], [V5+1:1:V6], [V6+1:1:V7], [V7+1:1:V8]}
47+
Vmap: <<{[V0+1:1:V1]} -> |0*x+1|, {[V1+1:1:V2]} -> |0*x+2|, {[V2+1:1:V3]} -> |0*x+3|, {[V3+1:1:V4]} -> |0*x+4|, {[V4+1:1:V5]} -> |0*x+5|, {[V5+1:1:V6]} -> |0*x+6|, {[V6+1:1:V7]} -> |0*x+7|, {[V7+1:1:V8]} -> |0*x+8|>>
48+
map1: <<{[E0+1:1:E1]} -> |1*x+offM11|, {[E1+1:1:E2]} -> |1*x+offM12|, {[E2+1:1:E3]} -> |1*x+offM13|, {[E3+1:1:E4]} -> |1*x+offM14|, {[E4+1:1:E5]} -> |1*x+offM15|, {[E5+1:1:E6]} -> |1*x+offM16|, {[E6+1:1:E7]} -> |1*x+offM17|, {[E7+1:1:E8]} -> |1*x+offM18|, {[E8+1:1:E9]} -> |1*x+offM19|, {[E9+1:1:E10]} -> |1*x+offM110|, {[E10+1:1:E11]} -> |1*x+offM111|>>
49+
map2: <<{[E0+1:1:E1]} -> |1*x+offM21|, {[E1+1:1:E2]} -> |1*x+offM22|, {[E2+1:1:E3]} -> |1*x+offM23|, {[E3+1:1:E4]} -> |1*x+offM24|, {[E4+1:1:E5]} -> |1*x+offM25|, {[E5+1:1:E6]} -> |1*x+offM26|, {[E6+1:1:E7]} -> |1*x+offM27|, {[E7+1:1:E8]} -> |1*x+offM28|, {[E8+1:1:E9]} -> |1*x+offM29|, {[E9+1:1:E10]} -> |1*x+offM210|, {[E10+1:1:E11]} -> |1*x+offM211|>>
50+
Emap: <<{[E0+1:1:E1]} -> |0*x+1|, {[E1+1:1:E2]} -> |0*x+2|, {[E2+1:1:E3]} -> |0*x+3|, {[E3+1:1:E4]} -> |0*x+4|, {[E4+1:1:E5]} -> |0*x+5|, {[E5+1:1:E6]} -> |0*x+6|, {[E6+1:1:E7]} -> |0*x+7|, {[E7+1:1:E8]} -> |0*x+8|, {[E8+1:1:E9]} -> |0*x+9|, {[E9+1:1:E10]} -> |0*x+10|, {[E10+1:1:E11]} -> |0*x+11|>>
51+
, 1);

0 commit comments

Comments
 (0)