gisele 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +39 -1
- data/gisele.noespec +1 -1
- data/lib/gisele/command.rb +13 -4
- data/lib/gisele/errors.rb +21 -0
- data/lib/gisele/language/ast/helpers.rb +37 -0
- data/lib/gisele/language/ast/node.rb +54 -0
- data/lib/gisele/language/ast/unit.rb +10 -0
- data/lib/gisele/language/ast.rb +14 -0
- data/lib/gisele/language/sugar_removal.rb +53 -0
- data/lib/gisele/language/syntax/bool_and.rb +14 -0
- data/lib/gisele/language/syntax/bool_lit.rb +14 -0
- data/lib/gisele/language/syntax/bool_not.rb +14 -0
- data/lib/gisele/language/syntax/bool_or.rb +14 -0
- data/lib/gisele/language/syntax/bool_paren.rb +14 -0
- data/lib/gisele/language/syntax/else_clause.rb +14 -0
- data/lib/gisele/language/syntax/elsif_clause.rb +16 -0
- data/lib/gisele/language/syntax/event_set.rb +15 -0
- data/lib/gisele/language/syntax/fluent_def.rb +18 -0
- data/lib/gisele/language/syntax/grammar.citrus +202 -0
- data/lib/gisele/language/syntax/if_st.rb +18 -0
- data/lib/gisele/language/syntax/implicit_seq_st.rb +16 -0
- data/lib/gisele/language/syntax/node.rb +35 -0
- data/lib/gisele/language/syntax/par_st.rb +14 -0
- data/lib/gisele/language/syntax/seq_st.rb +14 -0
- data/lib/gisele/language/syntax/st_list.rb +14 -0
- data/lib/gisele/language/syntax/task_call_st.rb +14 -0
- data/lib/gisele/language/syntax/task_def.rb +17 -0
- data/lib/gisele/language/syntax/task_refinement.rb +15 -0
- data/lib/gisele/language/syntax/task_signature.rb +15 -0
- data/lib/gisele/language/syntax/trackvar_def.rb +19 -0
- data/lib/gisele/language/syntax/unit.rb +14 -0
- data/lib/gisele/language/syntax/var_ref.rb +14 -0
- data/lib/gisele/language/syntax/while_st.rb +16 -0
- data/lib/gisele/language/syntax.rb +29 -0
- data/lib/gisele/language/transformer.rb +38 -0
- data/lib/gisele/language.rb +15 -1
- data/lib/gisele/version.rb +2 -2
- data/lib/gisele.rb +7 -1
- data/spec/command/main/gisele_ast_ruby.stdout +38 -28
- data/spec/command/main/gisele_help.stdout +5 -0
- data/spec/command/main/gisele_no_sugar.cmd +1 -0
- data/spec/command/main/gisele_no_sugar.stdout +61 -0
- data/spec/fixtures/tasks/simple.ast +18 -14
- data/spec/fixtures/tasks/simple.gis +2 -0
- data/spec/spec_helper.rb +3 -3
- data/spec/test_examples.rb +3 -3
- data/spec/unit/language/ast/test_node.rb +61 -0
- data/spec/unit/language/sugar_removal/test_if_to_guarded_commands.rb +90 -0
- data/spec/unit/language/{test_grammar.rb → syntax/test_grammar.rb} +18 -30
- data/spec/unit/language/syntax/test_to_ast.rb +245 -0
- data/spec/unit/language/test_ast.rb +21 -247
- data/spec/unit/language/test_syntax.rb +48 -0
- data/spec/unit/language/test_transformer.rb +68 -0
- data/spec/unit/test_language.rb +35 -0
- metadata +69 -25
- data/lib/gisele/language/grammar.citrus +0 -246
- data/lib/gisele/language/parser.rb +0 -30
- data/spec/unit/language/test_parser.rb +0 -27
@@ -1,246 +0,0 @@
|
|
1
|
-
grammar Gisele::Language::Grammar
|
2
|
-
|
3
|
-
### Units
|
4
|
-
|
5
|
-
rule task_unit
|
6
|
-
(spacing defn:task_def spacing){
|
7
|
-
defn.value
|
8
|
-
}
|
9
|
-
end
|
10
|
-
|
11
|
-
### Task definitions
|
12
|
-
|
13
|
-
rule task_def
|
14
|
-
('task' spaces tname:task_name spaces
|
15
|
-
signature:(task_signature spaces)?
|
16
|
-
refinement:(task_refinement spaces)?
|
17
|
-
'end'){
|
18
|
-
sigvalue = [:signature] + (signature.empty? ? [] : signature.first.first.value)
|
19
|
-
refvalue = [:refinement, (refinement.empty? ? [] : refinement.first.first.value)]
|
20
|
-
[:task, tname.value, sigvalue, refvalue]
|
21
|
-
}
|
22
|
-
end
|
23
|
-
|
24
|
-
rule task_signature
|
25
|
-
(front:task_signature_element tail:(spaces task_signature)?){
|
26
|
-
[front.value] + (tail.empty? ? [] : tail.first.matches.last.value)
|
27
|
-
}
|
28
|
-
end
|
29
|
-
|
30
|
-
rule task_signature_element
|
31
|
-
fluent_def | trackvar_def
|
32
|
-
end
|
33
|
-
|
34
|
-
rule task_refinement
|
35
|
-
('refinement' spaces main:process_statement spaces 'end'){
|
36
|
-
main.value
|
37
|
-
}
|
38
|
-
end
|
39
|
-
|
40
|
-
### Process statements
|
41
|
-
|
42
|
-
rule process_statement
|
43
|
-
implicit_seq_statement | explicit_statement
|
44
|
-
end
|
45
|
-
|
46
|
-
rule implicit_seq_statement
|
47
|
-
(front:explicit_statement spaces tail:statement_list){
|
48
|
-
[:seq, front.value] + tail.value
|
49
|
-
}
|
50
|
-
end
|
51
|
-
|
52
|
-
rule statement_list
|
53
|
-
(f:explicit_statement t:(spaces statement_list)?){
|
54
|
-
[f.value] + (t.empty? ? [] : t.first.matches.last.value)
|
55
|
-
}
|
56
|
-
end
|
57
|
-
|
58
|
-
rule explicit_statement
|
59
|
-
if_statement
|
60
|
-
| while_statement
|
61
|
-
| seq_statement
|
62
|
-
| par_statement
|
63
|
-
| task_call_statement
|
64
|
-
end
|
65
|
-
|
66
|
-
rule if_statement
|
67
|
-
('if' spaces cond:bool_expr spaces
|
68
|
-
dost:process_statement spaces
|
69
|
-
elsifclauses:elsif_clause*
|
70
|
-
elseclause:else_clause?
|
71
|
-
'end'){
|
72
|
-
elsifs = elsifclauses.matches.map{|c| c.value}
|
73
|
-
elsec = elseclause.empty? ? [] : [elseclause.first.value]
|
74
|
-
[:if, cond.value, dost.value] + elsifs + elsec
|
75
|
-
}
|
76
|
-
end
|
77
|
-
|
78
|
-
rule elsif_clause
|
79
|
-
('elsif' spaces cond:bool_expr spaces dost:process_statement spaces){
|
80
|
-
[:elsif, cond.value, dost.value]
|
81
|
-
}
|
82
|
-
end
|
83
|
-
|
84
|
-
rule else_clause
|
85
|
-
('else' spaces dost:process_statement spaces){
|
86
|
-
[:else, dost.value]
|
87
|
-
}
|
88
|
-
end
|
89
|
-
|
90
|
-
rule while_statement
|
91
|
-
('while' spaces cond:bool_expr spaces
|
92
|
-
dost:process_statement spaces
|
93
|
-
'end'){
|
94
|
-
[:while, cond.value, dost.value]
|
95
|
-
}
|
96
|
-
end
|
97
|
-
|
98
|
-
rule seq_statement
|
99
|
-
('seq' spaces list:statement_list spaces 'end'){
|
100
|
-
[:seq] + list.value
|
101
|
-
}
|
102
|
-
end
|
103
|
-
|
104
|
-
rule par_statement
|
105
|
-
('par' spaces list:statement_list spaces 'end'){
|
106
|
-
[:par] + list.value
|
107
|
-
}
|
108
|
-
end
|
109
|
-
|
110
|
-
rule task_call_statement
|
111
|
-
(task_name){
|
112
|
-
[:task_call, strip]
|
113
|
-
}
|
114
|
-
end
|
115
|
-
|
116
|
-
### Boolean expressions
|
117
|
-
|
118
|
-
rule bool_expr
|
119
|
-
bool_or
|
120
|
-
end
|
121
|
-
|
122
|
-
rule bool_or
|
123
|
-
(left:bool_and spaces 'or' spaces right:bool_or){
|
124
|
-
[:or, left.value, right.value]
|
125
|
-
}
|
126
|
-
| bool_and
|
127
|
-
end
|
128
|
-
|
129
|
-
rule bool_and
|
130
|
-
(left:bool_not spaces 'and' spaces right:bool_and){
|
131
|
-
[:and, left.value, right.value]
|
132
|
-
}
|
133
|
-
| bool_not
|
134
|
-
end
|
135
|
-
|
136
|
-
rule bool_not
|
137
|
-
('not' &([ \t\n] | '(') spacing term:bool_not){
|
138
|
-
[:not, term.value]
|
139
|
-
}
|
140
|
-
| bool_term
|
141
|
-
end
|
142
|
-
|
143
|
-
rule bool_term
|
144
|
-
bool_parenthesed | boolean_literal | bool_varref
|
145
|
-
end
|
146
|
-
|
147
|
-
rule bool_parenthesed
|
148
|
-
('(' spacing expr:bool_expr spacing ')'){
|
149
|
-
expr.value
|
150
|
-
}
|
151
|
-
end
|
152
|
-
|
153
|
-
rule bool_varref
|
154
|
-
(variable_name){
|
155
|
-
[:varref, strip]
|
156
|
-
}
|
157
|
-
end
|
158
|
-
|
159
|
-
### Variables
|
160
|
-
|
161
|
-
rule variable_def
|
162
|
-
trackvar_def | fluent_def
|
163
|
-
end
|
164
|
-
|
165
|
-
rule trackvar_def
|
166
|
-
('trackvar' spaces name:variable_name spacing
|
167
|
-
init:event_set term:(spacing ',' spacing event_set)?
|
168
|
-
initially:initially_def?){
|
169
|
-
termval = term.empty? ? [:event_set] : term.first.matches.last.value
|
170
|
-
initval = initially.empty? ? nil : initially.first.value
|
171
|
-
[:trackvar, name.value, init.value, termval, initval]
|
172
|
-
}
|
173
|
-
end
|
174
|
-
|
175
|
-
rule fluent_def
|
176
|
-
('fluent' spaces name:variable_name spacing
|
177
|
-
init:event_set spacing ',' spacing term:event_set initially:initially_def?){
|
178
|
-
initval = initially.empty? ? nil : initially.first.value
|
179
|
-
[:fluent, name.value, init.value, term.value, initval]
|
180
|
-
}
|
181
|
-
end
|
182
|
-
|
183
|
-
rule initially_def
|
184
|
-
(spaces 'initially' spaces lit:boolean_literal){
|
185
|
-
lit.value
|
186
|
-
}
|
187
|
-
end
|
188
|
-
|
189
|
-
### Events
|
190
|
-
|
191
|
-
rule event_set
|
192
|
-
('{' spacing list:event_commalist? spacing '}'){
|
193
|
-
[:event_set] + (list.empty? ? [] : list.first.value)
|
194
|
-
}
|
195
|
-
end
|
196
|
-
|
197
|
-
rule event_commalist
|
198
|
-
(front:event tail:(spacing ',' spacing event_commalist)?){
|
199
|
-
tailval = tail.empty? ? [] : tail.first.matches.last.value
|
200
|
-
[ front.value ] + tailval
|
201
|
-
}
|
202
|
-
end
|
203
|
-
|
204
|
-
rule event
|
205
|
-
task_start_or_end | event_name
|
206
|
-
end
|
207
|
-
|
208
|
-
rule task_start_or_end
|
209
|
-
task_name ':' ('start' | 'end')
|
210
|
-
end
|
211
|
-
|
212
|
-
### Names
|
213
|
-
|
214
|
-
rule task_name
|
215
|
-
[A-Z] [A-Za-z0-9_]*
|
216
|
-
end
|
217
|
-
|
218
|
-
rule variable_name
|
219
|
-
[a-z] [A-Za-z0-9_]*
|
220
|
-
end
|
221
|
-
|
222
|
-
rule event_name
|
223
|
-
[a-z] [a-z0-9_]*
|
224
|
-
end
|
225
|
-
|
226
|
-
### Literals
|
227
|
-
|
228
|
-
rule boolean_literal
|
229
|
-
('true' | 'false'){ strip == "true" ? true : false }
|
230
|
-
end
|
231
|
-
|
232
|
-
### Spacing
|
233
|
-
|
234
|
-
rule comment
|
235
|
-
"#" (![\n] .)*
|
236
|
-
end
|
237
|
-
|
238
|
-
rule spaces
|
239
|
-
(comment | [ \t\n])+
|
240
|
-
end
|
241
|
-
|
242
|
-
rule spacing
|
243
|
-
(comment | [ \t\n])*
|
244
|
-
end
|
245
|
-
|
246
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Gisele
|
2
|
-
module Language
|
3
|
-
Citrus.load(File.expand_path('../grammar', __FILE__))
|
4
|
-
class Parser
|
5
|
-
|
6
|
-
def self.parse(input)
|
7
|
-
new.parse(input)
|
8
|
-
end
|
9
|
-
|
10
|
-
def call(input)
|
11
|
-
return input if input.is_a?(Array)
|
12
|
-
grammar.parse(parsing_source(input)).value
|
13
|
-
end
|
14
|
-
alias :parse :call
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def grammar
|
19
|
-
Gisele::Language::Grammar
|
20
|
-
end
|
21
|
-
|
22
|
-
def parsing_source(input)
|
23
|
-
input = File.read(input.to_path) if input.respond_to?(:to_path)
|
24
|
-
input = input.to_str if input.respond_to?(:to_str)
|
25
|
-
input
|
26
|
-
end
|
27
|
-
|
28
|
-
end # class Parser
|
29
|
-
end # module Language
|
30
|
-
end # module Gisele
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
module Gisele::Language
|
3
|
-
describe Parser do
|
4
|
-
|
5
|
-
fixture_files('tasks/**/*.gis').each do |file|
|
6
|
-
if file.sub_ext(".ast").exist?
|
7
|
-
|
8
|
-
it "returns the expected ast on #{file}" do
|
9
|
-
parsed = Parser.parse(file)
|
10
|
-
expected = Kernel::eval(file.sub_ext(".ast").read, TOPLEVEL_BINDING, file.sub_ext(".ast").to_s)
|
11
|
-
parsed.should eq(expected)
|
12
|
-
end
|
13
|
-
|
14
|
-
else
|
15
|
-
|
16
|
-
it "parses #{file} without error" do
|
17
|
-
parsed = Parser.parse(file)
|
18
|
-
parsed.should be_a(Array)
|
19
|
-
parsed.first.should eq(:task)
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
27
|
-
end
|