loxxy 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/README.md +1 -1
- data/lib/loxxy/ast/ast_builder.rb +30 -0
- data/lib/loxxy/front_end/grammar.rb +6 -6
- data/lib/loxxy/version.rb +1 -1
- data/spec/front_end/parser_spec.rb +49 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 583f5c2f620ea8f45b339607103955eda2f32c02f0358ccb88cf4d20b4398d21
|
4
|
+
data.tar.gz: f349b949c1315473027eaaab589ff1cf2da89deca3b243cd1508c088bf9a9cc5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c93648c634783348a22b3b65cf710a59c0ca5e3cefc5a20d7c60b9b429b4334e1e5603cc2bf74f302aed881daa71634cb7253445b3f376838197637f79f8cc7
|
7
|
+
data.tar.gz: 67d60e89985322911a7842a2b5fc2e22b4ccc3136ffa216027089ea05ea56a6932d1de9b8917173ad072695aaa6abb2147d456f54d09f2878d7831937c42af74
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
## [0.0.11] - 2021-01-08
|
2
|
+
- AST node generation for logical expression (and, or).
|
3
|
+
|
4
|
+
## Changed
|
5
|
+
- Class `AST::ASTBuilder` added `reduce_` methods for logical operations.
|
6
|
+
- File `grammar.rb`added name to logical expression rules
|
7
|
+
- File `README.md` added gem version and license badges, expanded roadmap section.
|
8
|
+
|
9
|
+
## Fixed
|
10
|
+
- File `grammar.rb`: a rule had incomplete non-terminal name `conjunct_` in its lhs.
|
11
|
+
|
12
|
+
|
1
13
|
## [0.0.10] - 2021-01-08
|
2
14
|
- AST node generation for equality expression.
|
3
15
|
|
data/README.md
CHANGED
@@ -35,7 +35,7 @@ The __loxxy__ gem hosts two distinct parsers classes (`RawParser` and `Parser`).
|
|
35
35
|
AST Node generation
|
36
36
|
Goal: parser should generate AST for any input Lox program
|
37
37
|
- [X] Equality operator
|
38
|
-
- [] Logical operator (and, or)
|
38
|
+
- [X] Logical operator (and, or)
|
39
39
|
- [] Unary expressions (negate, not)
|
40
40
|
- [] Grouping expressions
|
41
41
|
- [] Print statement
|
@@ -117,6 +117,36 @@ module Loxxy
|
|
117
117
|
[[operator, operand2]]
|
118
118
|
end
|
119
119
|
|
120
|
+
# rule('logic_or' => 'logic_and disjunct_plus')
|
121
|
+
def reduce_logic_or_plus(production, range, tokens, theChildren)
|
122
|
+
reduce_binary_operator(production, range, tokens, theChildren)
|
123
|
+
end
|
124
|
+
|
125
|
+
# rule('disjunct_plus' => 'disjunct_plus OR logic_and')
|
126
|
+
def reduce_logic_or_plus_more(production, range, tokens, theChildren)
|
127
|
+
reduce_binary_plus_more(production, range, tokens, theChildren)
|
128
|
+
end
|
129
|
+
|
130
|
+
# rule('disjunct_plus' => 'OR logic_and')
|
131
|
+
def reduce_logic_or_plus_end(production, range, tokens, theChildren)
|
132
|
+
reduce_binary_plus_end(production, range, tokens, theChildren)
|
133
|
+
end
|
134
|
+
|
135
|
+
# rule('logic_and' => 'equality conjunct_plus')
|
136
|
+
def reduce_logic_and_plus(production, range, tokens, theChildren)
|
137
|
+
reduce_binary_operator(production, range, tokens, theChildren)
|
138
|
+
end
|
139
|
+
|
140
|
+
# rule('conjunct_plus' => 'conjunct_plus AND equality')
|
141
|
+
def reduce_logic_and_plus_more(production, range, tokens, theChildren)
|
142
|
+
reduce_binary_plus_more(production, range, tokens, theChildren)
|
143
|
+
end
|
144
|
+
|
145
|
+
# rule('conjunct_plus' => 'AND equality')
|
146
|
+
def reduce_logic_and_plus_end(production, range, tokens, theChildren)
|
147
|
+
reduce_binary_plus_end(production, range, tokens, theChildren)
|
148
|
+
end
|
149
|
+
|
120
150
|
# rule('equality' => 'comparison equalityTest_plus')
|
121
151
|
def reduce_equality_plus(production, range, tokens, theChildren)
|
122
152
|
reduce_binary_operator(production, range, tokens, theChildren)
|
@@ -88,13 +88,13 @@ module Loxxy
|
|
88
88
|
rule('owner_opt' => 'call DOT')
|
89
89
|
rule('owner_opt' => [])
|
90
90
|
rule('logic_or' => 'logic_and')
|
91
|
-
rule('logic_or' => 'logic_and disjunct_plus')
|
92
|
-
rule('disjunct_plus' => 'disjunct_plus OR logic_and')
|
93
|
-
rule('disjunct_plus' => 'OR logic_and')
|
91
|
+
rule('logic_or' => 'logic_and disjunct_plus').as 'logic_or_plus'
|
92
|
+
rule('disjunct_plus' => 'disjunct_plus OR logic_and').as 'logic_or_plus_more'
|
93
|
+
rule('disjunct_plus' => 'OR logic_and').as 'logic_or_plus_end'
|
94
94
|
rule('logic_and' => 'equality')
|
95
|
-
rule('logic_and' => 'equality conjunct_plus')
|
96
|
-
rule('conjunct_plus' => 'conjunct_plus AND equality')
|
97
|
-
rule('
|
95
|
+
rule('logic_and' => 'equality conjunct_plus').as 'logic_and_plus'
|
96
|
+
rule('conjunct_plus' => 'conjunct_plus AND equality').as 'logic_and_plus_more'
|
97
|
+
rule('conjunct_plus' => 'AND equality').as 'logic_and_plus_end'
|
98
98
|
rule('equality' => 'comparison')
|
99
99
|
rule('equality' => 'comparison equalityTest_plus').as 'equality_plus'
|
100
100
|
rule('equalityTest_plus' => 'equalityTest_plus equalityTest comparison').as 'equality_t_plus_more'
|
data/lib/loxxy/version.rb
CHANGED
@@ -303,6 +303,55 @@ LOX_END
|
|
303
303
|
expect(expr.operands[1].literal.value).to be_falsey
|
304
304
|
end
|
305
305
|
end # context
|
306
|
+
|
307
|
+
context 'Parsing logical expressions' do
|
308
|
+
it 'should parse the logical operations betweentwo sub-expression' do
|
309
|
+
%w[or and].each do |connector|
|
310
|
+
input = "5 > 2 #{connector} 3 <= 4;"
|
311
|
+
ptree = subject.parse(input)
|
312
|
+
parent = ptree.root.subnodes[0]
|
313
|
+
expect(parent).to be_kind_of(Rley::PTree::NonTerminalNode)
|
314
|
+
expect(parent.symbol.name).to eq('exprStmt')
|
315
|
+
expr = parent.subnodes[0]
|
316
|
+
expect(expr).to be_kind_of(Ast::LoxBinaryExpr)
|
317
|
+
expect(expr.operator).to eq(connector.to_sym)
|
318
|
+
expect(expr.operands[0]).to be_kind_of(Ast::LoxBinaryExpr)
|
319
|
+
expect(expr.operands[0].operator).to eq(:>)
|
320
|
+
expect(expr.operands[0].operands[0].literal.value).to eq(5)
|
321
|
+
expect(expr.operands[0].operands[1].literal.value).to eq(2)
|
322
|
+
expect(expr.operands[1]).to be_kind_of(Ast::LoxBinaryExpr)
|
323
|
+
expect(expr.operands[1].operator).to eq(:<=)
|
324
|
+
expect(expr.operands[1].operands[0].literal.value).to eq(3)
|
325
|
+
expect(expr.operands[1].operands[1].literal.value).to eq(4)
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
it 'should parse a combinations of logical expressions' do
|
330
|
+
input = '4 > 3 and 1 < 2 or 4 >= 5;'
|
331
|
+
ptree = subject.parse(input)
|
332
|
+
parent = ptree.root.subnodes[0]
|
333
|
+
expect(parent).to be_kind_of(Rley::PTree::NonTerminalNode)
|
334
|
+
expect(parent.symbol.name).to eq('exprStmt')
|
335
|
+
expr = parent.subnodes[0]
|
336
|
+
expect(expr).to be_kind_of(Ast::LoxBinaryExpr)
|
337
|
+
expect(expr.operator).to eq(:or) # or has lower precedence than and
|
338
|
+
expect(expr.operands[0]).to be_kind_of(Ast::LoxBinaryExpr)
|
339
|
+
expect(expr.operands[0].operator).to eq(:and)
|
340
|
+
conjuncts = expr.operands[0].operands
|
341
|
+
expect(conjuncts[0]).to be_kind_of(Ast::LoxBinaryExpr)
|
342
|
+
expect(conjuncts[0].operator).to eq(:>)
|
343
|
+
expect(conjuncts[0].operands[0].literal.value).to eq(4)
|
344
|
+
expect(conjuncts[0].operands[1].literal.value).to eq(3)
|
345
|
+
expect(conjuncts[1]).to be_kind_of(Ast::LoxBinaryExpr)
|
346
|
+
expect(conjuncts[1].operator).to eq(:<)
|
347
|
+
expect(conjuncts[1].operands[0].literal.value).to eq(1)
|
348
|
+
expect(conjuncts[1].operands[1].literal.value).to eq(2)
|
349
|
+
expect(expr.operands[1]).to be_kind_of(Ast::LoxBinaryExpr)
|
350
|
+
expect(expr.operands[1].operator).to eq(:>=)
|
351
|
+
expect(expr.operands[1].operands[0].literal.value).to eq(4)
|
352
|
+
expect(expr.operands[1].operands[1].literal.value).to eq(5)
|
353
|
+
end
|
354
|
+
end # context
|
306
355
|
end # describe
|
307
356
|
end # module
|
308
357
|
end # module
|