EFL 1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.txt +36 -0
- data/lib/EFL.rb +494 -0
- data/lib/EFL_array.rb +20 -0
- data/lib/EFL_errors.rb +48 -0
- data/lib/EFL_hash.rb +18 -0
- data/lib/EFL_production.rb +49 -0
- data/lib/EFL_regexp.rb +112 -0
- data/lib/EFL_regexp_generator.rb +70 -0
- data/lib/EFL_substitution.rb +221 -0
- data/lib/EFL_syntactic_sugar.rb +67 -0
- data/lib/Hash Doc.doc +0 -0
- data/lib/Limitaciones.txt +3 -0
- data/lib/doc/classes/Generator.html +634 -0
- data/lib/doc/classes/Generator.src/M000008.html +18 -0
- data/lib/doc/classes/Generator.src/M000009.html +18 -0
- data/lib/doc/classes/Generator.src/M000010.html +18 -0
- data/lib/doc/classes/Generator.src/M000011.html +18 -0
- data/lib/doc/classes/Generator.src/M000012.html +18 -0
- data/lib/doc/classes/Generator.src/M000013.html +18 -0
- data/lib/doc/classes/Generator.src/M000014.html +18 -0
- data/lib/doc/classes/Generator.src/M000015.html +18 -0
- data/lib/doc/classes/Generator.src/M000016.html +28 -0
- data/lib/doc/classes/Generator.src/M000017.html +24 -0
- data/lib/doc/classes/Generator.src/M000018.html +157 -0
- data/lib/doc/classes/Generator.src/M000019.html +25 -0
- data/lib/doc/classes/Generator.src/M000020.html +30 -0
- data/lib/doc/classes/Generator.src/M000021.html +32 -0
- data/lib/doc/classes/Generator.src/M000022.html +22 -0
- data/lib/doc/classes/Generator.src/M000023.html +18 -0
- data/lib/doc/classes/Generator.src/M000024.html +27 -0
- data/lib/doc/classes/Generator.src/M000025.html +22 -0
- data/lib/doc/classes/Generator.src/M000026.html +18 -0
- data/lib/doc/classes/Generator.src/M000027.html +27 -0
- data/lib/doc/classes/Regexp.html +271 -0
- data/lib/doc/classes/Regexp.src/M000028.html +37 -0
- data/lib/doc/classes/Regexp.src/M000029.html +29 -0
- data/lib/doc/classes/Regexp.src/M000030.html +32 -0
- data/lib/doc/created.rid +1 -0
- data/lib/doc/files/EFL_rb.html +147 -0
- data/lib/doc/files/EFL_regexp_generator_rb.html +242 -0
- data/lib/doc/files/EFL_regexp_generator_rb.src/M000003.html +27 -0
- data/lib/doc/files/EFL_regexp_generator_rb.src/M000004.html +27 -0
- data/lib/doc/files/EFL_regexp_generator_rb.src/M000005.html +19 -0
- data/lib/doc/files/EFL_regexp_generator_rb.src/M000006.html +20 -0
- data/lib/doc/files/EFL_regexp_generator_rb.src/M000007.html +19 -0
- data/lib/doc/files/EFL_regexp_rb.html +139 -0
- data/lib/doc/files/EFL_syntactic_sugar_rb.html +208 -0
- data/lib/doc/files/EFL_syntactic_sugar_rb.src/M000001.html +29 -0
- data/lib/doc/files/EFL_syntactic_sugar_rb.src/M000002.html +19 -0
- data/lib/doc/fr_class_index.html +28 -0
- data/lib/doc/fr_file_index.html +30 -0
- data/lib/doc/fr_method_index.html +56 -0
- data/lib/doc/index.html +24 -0
- data/tests/Add_Sup_1.rb +223 -0
- data/tests/Add_Sup_1.rb.bak +223 -0
- data/tests/Add_Sup_1_NI.rb +25 -0
- data/tests/Add_Sup_2.rb +142 -0
- data/tests/Add_Sup_2.rb.bak +140 -0
- data/tests/All.rb +2 -0
- data/tests/All_1.rb +7 -0
- data/tests/All_2.rb +7 -0
- data/tests/All_2.rb.bak +5 -0
- data/tests/BeforeAfter.rb +83 -0
- data/tests/Bloques.rb +34 -0
- data/tests/Bloques.rb.bak +34 -0
- data/tests/Complementary.rb +144 -0
- data/tests/ComplementaryZoom.rb +78 -0
- data/tests/Del.rb +126 -0
- data/tests/Dup.rb +55 -0
- data/tests/Dup.rb.bak +54 -0
- data/tests/Error.rb +11 -0
- data/tests/ErrorArgClass.rb +169 -0
- data/tests/ErrorArgClass.rb.bak +158 -0
- data/tests/ErrorCollision.rb +218 -0
- data/tests/ErrorCollision.rb.bak +219 -0
- data/tests/ErrorWithoutDeclaration.rb +60 -0
- data/tests/ErrorWithoutDeclaration.rb.bak +60 -0
- data/tests/Extract.rb +56 -0
- data/tests/ExtractDollar.rb +17 -0
- data/tests/HashTest.rb +54 -0
- data/tests/HashTest.rb.bak +54 -0
- data/tests/Lista Czarnecki/AntiguaInterfaz/List.cpp +75 -0
- data/tests/Lista Czarnecki/AntiguaInterfaz/ListTransformer.rb +69 -0
- data/tests/Lista Czarnecki/AntiguaInterfaz/ListTransformer.rb.bak +100 -0
- data/tests/Lista Czarnecki/AntiguaInterfaz/ejecutame.bat +1 -0
- data/tests/Lista Czarnecki/AntiguaInterfaz/outDir/MyClassList.cpp +75 -0
- data/tests/Lista Czarnecki/AntiguaInterfaz/runme.bat +1 -0
- data/tests/Lista Czarnecki/AntiguaInterfaz/specification1.txt +5 -0
- data/tests/Lista Czarnecki/AntiguaInterfaz/specification2.txt +3 -0
- data/tests/Lista Czarnecki/AntiguaInterfaz/specification3.txt +5 -0
- data/tests/Lista Czarnecki/NuevaInterfaz/List.cpp +75 -0
- data/tests/Lista Czarnecki/NuevaInterfaz/ListTransformer.rb +58 -0
- data/tests/Lista Czarnecki/NuevaInterfaz/ListTransformer.rb.bak +57 -0
- data/tests/Lista Czarnecki/NuevaInterfaz/ejecutame.bat +1 -0
- data/tests/Lista Czarnecki/NuevaInterfaz/outDir/MyClassList.cpp +75 -0
- data/tests/Lista Czarnecki/NuevaInterfaz/outDir/NewClassList.cpp +75 -0
- data/tests/Lista Czarnecki/NuevaInterfaz/specification1.txt +5 -0
- data/tests/Lista Czarnecki/NuevaInterfaz/specification1.txt.bak +5 -0
- data/tests/Lista Czarnecki/NuevaInterfaz/specification2.txt +3 -0
- data/tests/Lista Czarnecki/NuevaInterfaz/specification3.txt +5 -0
- data/tests/Minus.rb +89 -0
- data/tests/Plus.rb.bak +48 -0
- data/tests/REVit.rb +84 -0
- data/tests/RenameTest.rb +46 -0
- data/tests/RenameTest.rb.bak +46 -0
- data/tests/SubCrash.rb +26 -0
- data/tests/SubList.rb.bak +43 -0
- data/tests/archAuxiliares/1.txt +328 -0
- data/tests/archAuxiliares/2.txt +328 -0
- data/tests/archAuxiliares/Bloques/s1.txt +328 -0
- data/tests/archAuxiliares/Copia de Matriz.java +19 -0
- data/tests/archAuxiliares/Gen/Tesis_156_1.lgi +10 -0
- data/tests/archAuxiliares/Gen/Tesis_156_2.lgi +10 -0
- data/tests/archAuxiliares/Gen/t01.txt +328 -0
- data/tests/archAuxiliares/Gen/t01.txt.bak +328 -0
- data/tests/archAuxiliares/Gen/t02.txt +328 -0
- data/tests/archAuxiliares/Gen/t02.txt.bak +328 -0
- data/tests/archAuxiliares/Gen/t03.txt +328 -0
- data/tests/archAuxiliares/Gen/t03.txt.bak +328 -0
- data/tests/archAuxiliares/Gen/t04.txt +328 -0
- data/tests/archAuxiliares/Gen/t04.txt.bak +328 -0
- data/tests/archAuxiliares/Gen/t1.txt +328 -0
- data/tests/archAuxiliares/Gen/t1.txt.bak +328 -0
- data/tests/archAuxiliares/Gen/t2.txt +328 -0
- data/tests/archAuxiliares/Gen/t2.txt.bak +328 -0
- data/tests/archAuxiliares/Gen/t5.txt +328 -0
- data/tests/archAuxiliares/Gen/t9.txt +328 -0
- data/tests/archAuxiliares/Gen/t9.txt.bak +328 -0
- data/tests/archAuxiliares/GenTesis_156_1.lgi +10 -0
- data/tests/archAuxiliares/Matriz.java +74 -0
- data/tests/archAuxiliares/MatrizOut.java +74 -0
- data/tests/archAuxiliares/MatrizOut10.java +68 -0
- data/tests/archAuxiliares/MatrizOut11.java +86 -0
- data/tests/archAuxiliares/MatrizOut2.java +74 -0
- data/tests/archAuxiliares/MatrizOut3.java +74 -0
- data/tests/archAuxiliares/MatrizOut4.java +74 -0
- data/tests/archAuxiliares/MatrizOut5.java +21 -0
- data/tests/archAuxiliares/MatrizOut6.java +21 -0
- data/tests/archAuxiliares/MatrizOut7.java +21 -0
- data/tests/archAuxiliares/MatrizOut8.java +16 -0
- data/tests/archAuxiliares/MatrizOut9.java +86 -0
- data/tests/archAuxiliares/MatrizOut_9.java +86 -0
- data/tests/archAuxiliares/Matriz_1.java +74 -0
- data/tests/archAuxiliares/Matriz_10.java +68 -0
- data/tests/archAuxiliares/Matriz_11.java +86 -0
- data/tests/archAuxiliares/Matriz_2.java +74 -0
- data/tests/archAuxiliares/Matriz_3.java +74 -0
- data/tests/archAuxiliares/Matriz_4.java +74 -0
- data/tests/archAuxiliares/Matriz_5.java +21 -0
- data/tests/archAuxiliares/Matriz_6.java +21 -0
- data/tests/archAuxiliares/Matriz_7.java +21 -0
- data/tests/archAuxiliares/Matriz_8.java +16 -0
- data/tests/archAuxiliares/Matriz_9.java +86 -0
- data/tests/archAuxiliares/Matriz_N_1.java +21 -0
- data/tests/archAuxiliares/Matriz_N_2.java +91 -0
- data/tests/archAuxiliares/N1.txt +18 -0
- data/tests/archAuxiliares/N1_EXPECTED.txt +18 -0
- data/tests/archAuxiliares/N1_OUT.txt +18 -0
- data/tests/archAuxiliares/N2_EXPECTED.txt +18 -0
- data/tests/archAuxiliares/N2_OUT.txt +18 -0
- data/tests/archAuxiliares/N3.txt +23 -0
- data/tests/archAuxiliares/N3_EXPECTED.txt +22 -0
- data/tests/archAuxiliares/N3_OUT.txt +22 -0
- data/tests/archAuxiliares/N4_EXPECTED.txt +10 -0
- data/tests/archAuxiliares/N4_OUT.txt +10 -0
- data/tests/archAuxiliares/N5_OUT.txt +18 -0
- data/tests/archAuxiliares/N6_OUT.txt +18 -0
- data/tests/archAuxiliares/PedidorTerceroWS.jsp +142 -0
- data/tests/archAuxiliares/Tesis_156.lgi +7 -0
- data/tests/archAuxiliares/aspectgen.rb +328 -0
- data/tests/archAuxiliares/aspectgenCopy.rb +328 -0
- data/tests/archAuxiliares/extract_dollar.txt +1 -0
- data/tests/archAuxiliares/minus.txt +26 -0
- data/tests/archAuxiliares/minus_expected_1.txt +26 -0
- data/tests/archAuxiliares/minus_expected_2.txt +26 -0
- data/tests/archAuxiliares/minus_out_1.txt +26 -0
- data/tests/archAuxiliares/minus_out_2.txt +26 -0
- data/tests/archAuxiliares/p1.txt +328 -0
- data/tests/archAuxiliares/p2.txt +328 -0
- data/tests/archAuxiliares/s1.txt +328 -0
- data/tests/archAuxiliares/s2.txt +328 -0
- data/tests/archAuxiliares/s3.txt +328 -0
- data/tests/archAuxiliares/s4.txt +328 -0
- data/tests/archAuxiliares/s5.txt +328 -0
- data/tests/archAuxiliares/s7.txt +328 -0
- data/tests/archAuxiliares/s8.txt +328 -0
- data/tests/archAuxiliares/s9.txt +328 -0
- data/tests/archAuxiliares/text.txt +1 -0
- data/tests/delay.rb +33 -0
- data/tests/delay.rb.bak +33 -0
- data/tests/satisfy.rb +44 -0
- data/tests/satisfy.rb.bak +34 -0
- metadata +252 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require "EFL.rb"
|
|
3
|
+
|
|
4
|
+
########################################################
|
|
5
|
+
# Bateria de pruebas para los m�todos incorporados a Hash
|
|
6
|
+
#
|
|
7
|
+
# Ultima actualizacion: 1-10-2004
|
|
8
|
+
########################################################
|
|
9
|
+
|
|
10
|
+
class HashTest < Test::Unit::TestCase
|
|
11
|
+
def setup
|
|
12
|
+
@hash1 = {
|
|
13
|
+
'clave1' => ['1', '2'],
|
|
14
|
+
'clave2' => ['3']
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
@hash2 = {
|
|
18
|
+
'clave1_texto' => ['1', '2'],
|
|
19
|
+
'clave2_texto' => ['3']
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@hash3 = {
|
|
23
|
+
'clave1' => ['texto_1', 'texto_2'],
|
|
24
|
+
'clave2' => ['texto_3']
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@hash4 = {
|
|
28
|
+
'clave1_texto' => ['texto_1', 'texto_2'],
|
|
29
|
+
'clave2_texto' => ['texto_3']
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
end #setup
|
|
33
|
+
|
|
34
|
+
def test_collect
|
|
35
|
+
assert_equal(@hash2,
|
|
36
|
+
@hash1.collect {|k, v|
|
|
37
|
+
["#{k}_texto", v]
|
|
38
|
+
},
|
|
39
|
+
'')
|
|
40
|
+
|
|
41
|
+
assert_equal(@hash3,
|
|
42
|
+
@hash1.collect {|k, v|
|
|
43
|
+
[k, v.collect!{|e| "texto_#{e}"}]
|
|
44
|
+
},
|
|
45
|
+
'')
|
|
46
|
+
|
|
47
|
+
assert_equal(@hash4,
|
|
48
|
+
@hash1.collect {|k, v|
|
|
49
|
+
["#{k}_texto", v.collect!{|e| "texto_#{e}"}]
|
|
50
|
+
},
|
|
51
|
+
'')
|
|
52
|
+
end #test_collect
|
|
53
|
+
|
|
54
|
+
end #HashTest
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#include <iostream>
|
|
2
|
+
using namespace std;
|
|
3
|
+
|
|
4
|
+
class MyClass {};
|
|
5
|
+
|
|
6
|
+
ostream& operator<<(ostream& os, const MyClass &e)
|
|
7
|
+
{
|
|
8
|
+
os<<"- MyClass -";
|
|
9
|
+
return os;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
////////////////////////////////////////////////
|
|
14
|
+
// List
|
|
15
|
+
////////////////////////////////////////////////
|
|
16
|
+
|
|
17
|
+
class List
|
|
18
|
+
{
|
|
19
|
+
private:
|
|
20
|
+
MyClass* head_;
|
|
21
|
+
List* tail_;
|
|
22
|
+
int length_;
|
|
23
|
+
public:
|
|
24
|
+
List(MyClass&h, List *t=0):
|
|
25
|
+
head_(0), tail_(t), length_(computedLength())
|
|
26
|
+
{ setHead(h); }
|
|
27
|
+
|
|
28
|
+
~List()
|
|
29
|
+
{ delete head_; }
|
|
30
|
+
|
|
31
|
+
void setHead(MyClass& h)
|
|
32
|
+
{
|
|
33
|
+
cout << "setHead(" << h <<")" << endl;
|
|
34
|
+
head_ = new MyClass(h);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
MyClass& head()
|
|
38
|
+
{ cout << "head()" << endl;
|
|
39
|
+
return *head_;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
void setTail(List *t)
|
|
43
|
+
{
|
|
44
|
+
cout << "setTail(t)" << endl;
|
|
45
|
+
tail_ = t;
|
|
46
|
+
length_ = computedLength();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
List *tail() const
|
|
50
|
+
{
|
|
51
|
+
cout << "setTail(t)" << endl;
|
|
52
|
+
return tail_;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const int& length() const
|
|
56
|
+
{ return length_; }
|
|
57
|
+
|
|
58
|
+
private:
|
|
59
|
+
int computedLength() const
|
|
60
|
+
{ return tail()?tail()->length()+1:1; }
|
|
61
|
+
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
int main()
|
|
67
|
+
{
|
|
68
|
+
MyClass e1, e2;
|
|
69
|
+
List l1(e1);
|
|
70
|
+
List l2(e2, &l1);
|
|
71
|
+
List l3(e1);
|
|
72
|
+
|
|
73
|
+
l3.setHead(e1);
|
|
74
|
+
l3.setTail(&l2);
|
|
75
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
require 'EFL'
|
|
2
|
+
EXEMPLAR = 'List.cpp'
|
|
3
|
+
|
|
4
|
+
######################################
|
|
5
|
+
# Generators
|
|
6
|
+
######################################
|
|
7
|
+
|
|
8
|
+
class ElementType < Generator
|
|
9
|
+
def initialize(exemplar, out, element_type)
|
|
10
|
+
gsub(/MyClass/, element_type)
|
|
11
|
+
prod(exemplar, out)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class Ownership < Generator
|
|
16
|
+
def initialize(exemplar, out, ownership_type)
|
|
17
|
+
case ownership_type
|
|
18
|
+
when 'External reference'
|
|
19
|
+
sub /delete head_;/, ''
|
|
20
|
+
sub /new MyClass\(h\)/ , '&h'
|
|
21
|
+
when 'Owned reference'
|
|
22
|
+
sub /new MyClass\(h\)/ , '&h'
|
|
23
|
+
when 'Copy'
|
|
24
|
+
# no change
|
|
25
|
+
end
|
|
26
|
+
prod(exemplar, out)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class LengthCounter < Generator
|
|
31
|
+
def initialize(exemplar, out, length_counter_type)
|
|
32
|
+
if length_counter_type
|
|
33
|
+
gsub(/int/, length_counter_type)
|
|
34
|
+
else
|
|
35
|
+
gsub(/^.*length.*$/i, '')
|
|
36
|
+
gsub(/\)\:/, '\0head_(0), tail_(t)')
|
|
37
|
+
end
|
|
38
|
+
prod(exemplar, out)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
class Tracing < Generator
|
|
43
|
+
def initialize(exemplar, out, tracing)
|
|
44
|
+
gsub(/cout.+$/, '') if !tracing
|
|
45
|
+
prod(exemplar, out)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
######################################
|
|
50
|
+
# Analyzer
|
|
51
|
+
######################################
|
|
52
|
+
|
|
53
|
+
unless ARGV[0]
|
|
54
|
+
print "You should specify the list specification file"
|
|
55
|
+
exit
|
|
56
|
+
end
|
|
57
|
+
eval "SPECIFICATION = {#{File.open("#{ARGV[0]}").read}}"
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
######################################
|
|
61
|
+
# Generator Combination
|
|
62
|
+
######################################
|
|
63
|
+
|
|
64
|
+
ElementType.new(EXEMPLAR, SPECIFICATION['Out File'], SPECIFICATION['Element Type']).gen
|
|
65
|
+
(
|
|
66
|
+
Ownership.new(SPECIFICATION['Out File'], SPECIFICATION['Out File'], SPECIFICATION['Ownership']) +
|
|
67
|
+
LengthCounter.new(SPECIFICATION['Out File'], SPECIFICATION['Out File'], SPECIFICATION['Length Counter Type']) +
|
|
68
|
+
Tracing.new(SPECIFICATION['Out File'], SPECIFICATION['Out File'], SPECIFICATION['Tracing'])
|
|
69
|
+
).gen
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
require '..\..\..\ETL\ETL'
|
|
2
|
+
|
|
3
|
+
######################################
|
|
4
|
+
# generators
|
|
5
|
+
######################################
|
|
6
|
+
|
|
7
|
+
class ElementType < Generator
|
|
8
|
+
def initialize(exemplar, out, elementType)
|
|
9
|
+
gsub(/Exemplar/, elementType)
|
|
10
|
+
prod(exemplar, out)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class Ownership < Generator
|
|
15
|
+
def initialize(exemplar, out, ownershipType)
|
|
16
|
+
case ownershipType
|
|
17
|
+
when 'External reference'
|
|
18
|
+
externalReference
|
|
19
|
+
when 'Owned reference'
|
|
20
|
+
ownedReference
|
|
21
|
+
when 'Copy'
|
|
22
|
+
copy
|
|
23
|
+
end
|
|
24
|
+
prod(exemplar, out)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def externalReference
|
|
28
|
+
sub(/delete head_;/, '')
|
|
29
|
+
sub(/new Exemplar\(h\)/ , '&h')
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def ownedReference
|
|
33
|
+
sub(/new Exemplar\(h\)/ , '&h')
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def copy
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
class LengthCounter < Generator
|
|
41
|
+
def initialize(exemplar, out, lengthType)
|
|
42
|
+
if lengthType
|
|
43
|
+
with(lengthType)
|
|
44
|
+
else
|
|
45
|
+
without
|
|
46
|
+
end
|
|
47
|
+
prod(exemplar, out)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def with(lengthType)
|
|
51
|
+
gsub(/int/, lengthType)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def without
|
|
55
|
+
gsub(/^.*length.*$/i, '')
|
|
56
|
+
gsub(/\)\:/, '\0head_(0), tail_(t)')
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
class Tracing < Generator
|
|
61
|
+
def initialize(exemplar, out, tracing)
|
|
62
|
+
if tracing
|
|
63
|
+
with
|
|
64
|
+
else
|
|
65
|
+
without
|
|
66
|
+
end
|
|
67
|
+
prod(exemplar, out)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def with
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def without
|
|
74
|
+
gsub(/cout.+$/, '')
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
######################################
|
|
79
|
+
# Configuration Knowledge
|
|
80
|
+
######################################
|
|
81
|
+
|
|
82
|
+
unless ARGV[0]
|
|
83
|
+
print "You should specify the list specification file"
|
|
84
|
+
exit
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# analyzer
|
|
88
|
+
|
|
89
|
+
eval "@list_specificacion = {#{File.open("#{ARGV[0]}").read}}"
|
|
90
|
+
|
|
91
|
+
# running generators
|
|
92
|
+
|
|
93
|
+
ElementType.new('List.cpp', @list_specificacion['Out File'], @list_specificacion['Element Type']).gen
|
|
94
|
+
|
|
95
|
+
(
|
|
96
|
+
Ownership.new(@list_specificacion['Out File'], @list_specificacion['Out File'], @list_specificacion['Ownership']) +
|
|
97
|
+
LengthCounter.new(@list_specificacion['Out File'], @list_specificacion['Out File'],
|
|
98
|
+
@list_specificacion['Length Type']) +
|
|
99
|
+
Tracing.new(@list_specificacion['Out File'], @list_specificacion['Out File'], @list_specificacion['Tracing'])
|
|
100
|
+
).gen
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ruby ListTransformer.rb specification1.txt
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#include <iostream>
|
|
2
|
+
using namespace std;
|
|
3
|
+
|
|
4
|
+
class MyClass {};
|
|
5
|
+
|
|
6
|
+
ostream& operator<<(ostream& os, const MyClass &e)
|
|
7
|
+
{
|
|
8
|
+
os<<"- MyClass -";
|
|
9
|
+
return os;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
////////////////////////////////////////////////
|
|
14
|
+
// List
|
|
15
|
+
////////////////////////////////////////////////
|
|
16
|
+
|
|
17
|
+
class List
|
|
18
|
+
{
|
|
19
|
+
private:
|
|
20
|
+
MyClass* head_;
|
|
21
|
+
List* tail_;
|
|
22
|
+
|
|
23
|
+
public:
|
|
24
|
+
List(MyClass&h, List *t=0):head_(0), tail_(t)
|
|
25
|
+
|
|
26
|
+
{ setHead(h); }
|
|
27
|
+
|
|
28
|
+
~List()
|
|
29
|
+
{ delete head_; }
|
|
30
|
+
|
|
31
|
+
void setHead(MyClass& h)
|
|
32
|
+
{
|
|
33
|
+
cout << "setHead(" << h <<")" << endl;
|
|
34
|
+
head_ = new MyClass(h);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
MyClass& head()
|
|
38
|
+
{ cout << "head()" << endl;
|
|
39
|
+
return *head_;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
void setTail(List *t)
|
|
43
|
+
{
|
|
44
|
+
cout << "setTail(t)" << endl;
|
|
45
|
+
tail_ = t;
|
|
46
|
+
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
List *tail() const
|
|
50
|
+
{
|
|
51
|
+
cout << "setTail(t)" << endl;
|
|
52
|
+
return tail_;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
private:
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
int main()
|
|
67
|
+
{
|
|
68
|
+
MyClass e1, e2;
|
|
69
|
+
List l1(e1);
|
|
70
|
+
List l2(e2, &l1);
|
|
71
|
+
List l3(e1);
|
|
72
|
+
|
|
73
|
+
l3.setHead(e1);
|
|
74
|
+
l3.setTail(&l2);
|
|
75
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ruby ListTransformer.rb specification1.txt
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#include <iostream>
|
|
2
|
+
using namespace std;
|
|
3
|
+
|
|
4
|
+
class MyClass {};
|
|
5
|
+
|
|
6
|
+
ostream& operator<<(ostream& os, const MyClass &e)
|
|
7
|
+
{
|
|
8
|
+
os<<"- MyClass -";
|
|
9
|
+
return os;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
////////////////////////////////////////////////
|
|
14
|
+
// List
|
|
15
|
+
////////////////////////////////////////////////
|
|
16
|
+
|
|
17
|
+
class List
|
|
18
|
+
{
|
|
19
|
+
private:
|
|
20
|
+
MyClass* head_;
|
|
21
|
+
List* tail_;
|
|
22
|
+
int length_;
|
|
23
|
+
public:
|
|
24
|
+
List(MyClass&h, List *t=0):
|
|
25
|
+
head_(0), tail_(t), length_(computedLength())
|
|
26
|
+
{ setHead(h); }
|
|
27
|
+
|
|
28
|
+
~List()
|
|
29
|
+
{ delete head_; }
|
|
30
|
+
|
|
31
|
+
void setHead(MyClass& h)
|
|
32
|
+
{
|
|
33
|
+
cout << "setHead(" << h <<")" << endl;
|
|
34
|
+
head_ = new MyClass(h);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
MyClass& head()
|
|
38
|
+
{ cout << "head()" << endl;
|
|
39
|
+
return *head_;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
void setTail(List *t)
|
|
43
|
+
{
|
|
44
|
+
cout << "setTail(t)" << endl;
|
|
45
|
+
tail_ = t;
|
|
46
|
+
length_ = computedLength();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
List *tail() const
|
|
50
|
+
{
|
|
51
|
+
cout << "setTail(t)" << endl;
|
|
52
|
+
return tail_;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const int& length() const
|
|
56
|
+
{ return length_; }
|
|
57
|
+
|
|
58
|
+
private:
|
|
59
|
+
int computedLength() const
|
|
60
|
+
{ return tail()?tail()->length()+1:1; }
|
|
61
|
+
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
int main()
|
|
67
|
+
{
|
|
68
|
+
MyClass e1, e2;
|
|
69
|
+
List l1(e1);
|
|
70
|
+
List l2(e2, &l1);
|
|
71
|
+
List l3(e1);
|
|
72
|
+
|
|
73
|
+
l3.setHead(e1);
|
|
74
|
+
l3.setTail(&l2);
|
|
75
|
+
}
|