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.
Files changed (193) hide show
  1. data/README.txt +36 -0
  2. data/lib/EFL.rb +494 -0
  3. data/lib/EFL_array.rb +20 -0
  4. data/lib/EFL_errors.rb +48 -0
  5. data/lib/EFL_hash.rb +18 -0
  6. data/lib/EFL_production.rb +49 -0
  7. data/lib/EFL_regexp.rb +112 -0
  8. data/lib/EFL_regexp_generator.rb +70 -0
  9. data/lib/EFL_substitution.rb +221 -0
  10. data/lib/EFL_syntactic_sugar.rb +67 -0
  11. data/lib/Hash Doc.doc +0 -0
  12. data/lib/Limitaciones.txt +3 -0
  13. data/lib/doc/classes/Generator.html +634 -0
  14. data/lib/doc/classes/Generator.src/M000008.html +18 -0
  15. data/lib/doc/classes/Generator.src/M000009.html +18 -0
  16. data/lib/doc/classes/Generator.src/M000010.html +18 -0
  17. data/lib/doc/classes/Generator.src/M000011.html +18 -0
  18. data/lib/doc/classes/Generator.src/M000012.html +18 -0
  19. data/lib/doc/classes/Generator.src/M000013.html +18 -0
  20. data/lib/doc/classes/Generator.src/M000014.html +18 -0
  21. data/lib/doc/classes/Generator.src/M000015.html +18 -0
  22. data/lib/doc/classes/Generator.src/M000016.html +28 -0
  23. data/lib/doc/classes/Generator.src/M000017.html +24 -0
  24. data/lib/doc/classes/Generator.src/M000018.html +157 -0
  25. data/lib/doc/classes/Generator.src/M000019.html +25 -0
  26. data/lib/doc/classes/Generator.src/M000020.html +30 -0
  27. data/lib/doc/classes/Generator.src/M000021.html +32 -0
  28. data/lib/doc/classes/Generator.src/M000022.html +22 -0
  29. data/lib/doc/classes/Generator.src/M000023.html +18 -0
  30. data/lib/doc/classes/Generator.src/M000024.html +27 -0
  31. data/lib/doc/classes/Generator.src/M000025.html +22 -0
  32. data/lib/doc/classes/Generator.src/M000026.html +18 -0
  33. data/lib/doc/classes/Generator.src/M000027.html +27 -0
  34. data/lib/doc/classes/Regexp.html +271 -0
  35. data/lib/doc/classes/Regexp.src/M000028.html +37 -0
  36. data/lib/doc/classes/Regexp.src/M000029.html +29 -0
  37. data/lib/doc/classes/Regexp.src/M000030.html +32 -0
  38. data/lib/doc/created.rid +1 -0
  39. data/lib/doc/files/EFL_rb.html +147 -0
  40. data/lib/doc/files/EFL_regexp_generator_rb.html +242 -0
  41. data/lib/doc/files/EFL_regexp_generator_rb.src/M000003.html +27 -0
  42. data/lib/doc/files/EFL_regexp_generator_rb.src/M000004.html +27 -0
  43. data/lib/doc/files/EFL_regexp_generator_rb.src/M000005.html +19 -0
  44. data/lib/doc/files/EFL_regexp_generator_rb.src/M000006.html +20 -0
  45. data/lib/doc/files/EFL_regexp_generator_rb.src/M000007.html +19 -0
  46. data/lib/doc/files/EFL_regexp_rb.html +139 -0
  47. data/lib/doc/files/EFL_syntactic_sugar_rb.html +208 -0
  48. data/lib/doc/files/EFL_syntactic_sugar_rb.src/M000001.html +29 -0
  49. data/lib/doc/files/EFL_syntactic_sugar_rb.src/M000002.html +19 -0
  50. data/lib/doc/fr_class_index.html +28 -0
  51. data/lib/doc/fr_file_index.html +30 -0
  52. data/lib/doc/fr_method_index.html +56 -0
  53. data/lib/doc/index.html +24 -0
  54. data/tests/Add_Sup_1.rb +223 -0
  55. data/tests/Add_Sup_1.rb.bak +223 -0
  56. data/tests/Add_Sup_1_NI.rb +25 -0
  57. data/tests/Add_Sup_2.rb +142 -0
  58. data/tests/Add_Sup_2.rb.bak +140 -0
  59. data/tests/All.rb +2 -0
  60. data/tests/All_1.rb +7 -0
  61. data/tests/All_2.rb +7 -0
  62. data/tests/All_2.rb.bak +5 -0
  63. data/tests/BeforeAfter.rb +83 -0
  64. data/tests/Bloques.rb +34 -0
  65. data/tests/Bloques.rb.bak +34 -0
  66. data/tests/Complementary.rb +144 -0
  67. data/tests/ComplementaryZoom.rb +78 -0
  68. data/tests/Del.rb +126 -0
  69. data/tests/Dup.rb +55 -0
  70. data/tests/Dup.rb.bak +54 -0
  71. data/tests/Error.rb +11 -0
  72. data/tests/ErrorArgClass.rb +169 -0
  73. data/tests/ErrorArgClass.rb.bak +158 -0
  74. data/tests/ErrorCollision.rb +218 -0
  75. data/tests/ErrorCollision.rb.bak +219 -0
  76. data/tests/ErrorWithoutDeclaration.rb +60 -0
  77. data/tests/ErrorWithoutDeclaration.rb.bak +60 -0
  78. data/tests/Extract.rb +56 -0
  79. data/tests/ExtractDollar.rb +17 -0
  80. data/tests/HashTest.rb +54 -0
  81. data/tests/HashTest.rb.bak +54 -0
  82. data/tests/Lista Czarnecki/AntiguaInterfaz/List.cpp +75 -0
  83. data/tests/Lista Czarnecki/AntiguaInterfaz/ListTransformer.rb +69 -0
  84. data/tests/Lista Czarnecki/AntiguaInterfaz/ListTransformer.rb.bak +100 -0
  85. data/tests/Lista Czarnecki/AntiguaInterfaz/ejecutame.bat +1 -0
  86. data/tests/Lista Czarnecki/AntiguaInterfaz/outDir/MyClassList.cpp +75 -0
  87. data/tests/Lista Czarnecki/AntiguaInterfaz/runme.bat +1 -0
  88. data/tests/Lista Czarnecki/AntiguaInterfaz/specification1.txt +5 -0
  89. data/tests/Lista Czarnecki/AntiguaInterfaz/specification2.txt +3 -0
  90. data/tests/Lista Czarnecki/AntiguaInterfaz/specification3.txt +5 -0
  91. data/tests/Lista Czarnecki/NuevaInterfaz/List.cpp +75 -0
  92. data/tests/Lista Czarnecki/NuevaInterfaz/ListTransformer.rb +58 -0
  93. data/tests/Lista Czarnecki/NuevaInterfaz/ListTransformer.rb.bak +57 -0
  94. data/tests/Lista Czarnecki/NuevaInterfaz/ejecutame.bat +1 -0
  95. data/tests/Lista Czarnecki/NuevaInterfaz/outDir/MyClassList.cpp +75 -0
  96. data/tests/Lista Czarnecki/NuevaInterfaz/outDir/NewClassList.cpp +75 -0
  97. data/tests/Lista Czarnecki/NuevaInterfaz/specification1.txt +5 -0
  98. data/tests/Lista Czarnecki/NuevaInterfaz/specification1.txt.bak +5 -0
  99. data/tests/Lista Czarnecki/NuevaInterfaz/specification2.txt +3 -0
  100. data/tests/Lista Czarnecki/NuevaInterfaz/specification3.txt +5 -0
  101. data/tests/Minus.rb +89 -0
  102. data/tests/Plus.rb.bak +48 -0
  103. data/tests/REVit.rb +84 -0
  104. data/tests/RenameTest.rb +46 -0
  105. data/tests/RenameTest.rb.bak +46 -0
  106. data/tests/SubCrash.rb +26 -0
  107. data/tests/SubList.rb.bak +43 -0
  108. data/tests/archAuxiliares/1.txt +328 -0
  109. data/tests/archAuxiliares/2.txt +328 -0
  110. data/tests/archAuxiliares/Bloques/s1.txt +328 -0
  111. data/tests/archAuxiliares/Copia de Matriz.java +19 -0
  112. data/tests/archAuxiliares/Gen/Tesis_156_1.lgi +10 -0
  113. data/tests/archAuxiliares/Gen/Tesis_156_2.lgi +10 -0
  114. data/tests/archAuxiliares/Gen/t01.txt +328 -0
  115. data/tests/archAuxiliares/Gen/t01.txt.bak +328 -0
  116. data/tests/archAuxiliares/Gen/t02.txt +328 -0
  117. data/tests/archAuxiliares/Gen/t02.txt.bak +328 -0
  118. data/tests/archAuxiliares/Gen/t03.txt +328 -0
  119. data/tests/archAuxiliares/Gen/t03.txt.bak +328 -0
  120. data/tests/archAuxiliares/Gen/t04.txt +328 -0
  121. data/tests/archAuxiliares/Gen/t04.txt.bak +328 -0
  122. data/tests/archAuxiliares/Gen/t1.txt +328 -0
  123. data/tests/archAuxiliares/Gen/t1.txt.bak +328 -0
  124. data/tests/archAuxiliares/Gen/t2.txt +328 -0
  125. data/tests/archAuxiliares/Gen/t2.txt.bak +328 -0
  126. data/tests/archAuxiliares/Gen/t5.txt +328 -0
  127. data/tests/archAuxiliares/Gen/t9.txt +328 -0
  128. data/tests/archAuxiliares/Gen/t9.txt.bak +328 -0
  129. data/tests/archAuxiliares/GenTesis_156_1.lgi +10 -0
  130. data/tests/archAuxiliares/Matriz.java +74 -0
  131. data/tests/archAuxiliares/MatrizOut.java +74 -0
  132. data/tests/archAuxiliares/MatrizOut10.java +68 -0
  133. data/tests/archAuxiliares/MatrizOut11.java +86 -0
  134. data/tests/archAuxiliares/MatrizOut2.java +74 -0
  135. data/tests/archAuxiliares/MatrizOut3.java +74 -0
  136. data/tests/archAuxiliares/MatrizOut4.java +74 -0
  137. data/tests/archAuxiliares/MatrizOut5.java +21 -0
  138. data/tests/archAuxiliares/MatrizOut6.java +21 -0
  139. data/tests/archAuxiliares/MatrizOut7.java +21 -0
  140. data/tests/archAuxiliares/MatrizOut8.java +16 -0
  141. data/tests/archAuxiliares/MatrizOut9.java +86 -0
  142. data/tests/archAuxiliares/MatrizOut_9.java +86 -0
  143. data/tests/archAuxiliares/Matriz_1.java +74 -0
  144. data/tests/archAuxiliares/Matriz_10.java +68 -0
  145. data/tests/archAuxiliares/Matriz_11.java +86 -0
  146. data/tests/archAuxiliares/Matriz_2.java +74 -0
  147. data/tests/archAuxiliares/Matriz_3.java +74 -0
  148. data/tests/archAuxiliares/Matriz_4.java +74 -0
  149. data/tests/archAuxiliares/Matriz_5.java +21 -0
  150. data/tests/archAuxiliares/Matriz_6.java +21 -0
  151. data/tests/archAuxiliares/Matriz_7.java +21 -0
  152. data/tests/archAuxiliares/Matriz_8.java +16 -0
  153. data/tests/archAuxiliares/Matriz_9.java +86 -0
  154. data/tests/archAuxiliares/Matriz_N_1.java +21 -0
  155. data/tests/archAuxiliares/Matriz_N_2.java +91 -0
  156. data/tests/archAuxiliares/N1.txt +18 -0
  157. data/tests/archAuxiliares/N1_EXPECTED.txt +18 -0
  158. data/tests/archAuxiliares/N1_OUT.txt +18 -0
  159. data/tests/archAuxiliares/N2_EXPECTED.txt +18 -0
  160. data/tests/archAuxiliares/N2_OUT.txt +18 -0
  161. data/tests/archAuxiliares/N3.txt +23 -0
  162. data/tests/archAuxiliares/N3_EXPECTED.txt +22 -0
  163. data/tests/archAuxiliares/N3_OUT.txt +22 -0
  164. data/tests/archAuxiliares/N4_EXPECTED.txt +10 -0
  165. data/tests/archAuxiliares/N4_OUT.txt +10 -0
  166. data/tests/archAuxiliares/N5_OUT.txt +18 -0
  167. data/tests/archAuxiliares/N6_OUT.txt +18 -0
  168. data/tests/archAuxiliares/PedidorTerceroWS.jsp +142 -0
  169. data/tests/archAuxiliares/Tesis_156.lgi +7 -0
  170. data/tests/archAuxiliares/aspectgen.rb +328 -0
  171. data/tests/archAuxiliares/aspectgenCopy.rb +328 -0
  172. data/tests/archAuxiliares/extract_dollar.txt +1 -0
  173. data/tests/archAuxiliares/minus.txt +26 -0
  174. data/tests/archAuxiliares/minus_expected_1.txt +26 -0
  175. data/tests/archAuxiliares/minus_expected_2.txt +26 -0
  176. data/tests/archAuxiliares/minus_out_1.txt +26 -0
  177. data/tests/archAuxiliares/minus_out_2.txt +26 -0
  178. data/tests/archAuxiliares/p1.txt +328 -0
  179. data/tests/archAuxiliares/p2.txt +328 -0
  180. data/tests/archAuxiliares/s1.txt +328 -0
  181. data/tests/archAuxiliares/s2.txt +328 -0
  182. data/tests/archAuxiliares/s3.txt +328 -0
  183. data/tests/archAuxiliares/s4.txt +328 -0
  184. data/tests/archAuxiliares/s5.txt +328 -0
  185. data/tests/archAuxiliares/s7.txt +328 -0
  186. data/tests/archAuxiliares/s8.txt +328 -0
  187. data/tests/archAuxiliares/s9.txt +328 -0
  188. data/tests/archAuxiliares/text.txt +1 -0
  189. data/tests/delay.rb +33 -0
  190. data/tests/delay.rb.bak +33 -0
  191. data/tests/satisfy.rb +44 -0
  192. data/tests/satisfy.rb.bak +34 -0
  193. metadata +252 -0
@@ -0,0 +1,20 @@
1
+ # <em>Copyright � 2007 by Ruben Heradio Gil, Jose Antonio Cerrada Somolinos, Jose Ramon Coz Fernandez and Jose Carlos Lopez Ruiz.</em>
2
+ # <em>This file is part of <b>EFL-A Ruby implementation of the Exemplar Flexibilization Language.</b></em>
3
+ # <em>EFL is distributed under the terms of the GNU Lesser General Public License (LGPL).</em>
4
+ # <em>EFL is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</em>
5
+ # <em>EFL is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.</em>
6
+ # <em>You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.</em>
7
+ # <em>Contact Information: Ruben Heradio Gil (rheradio@issi.uned.es). Phone number: 00 34 91 398 8242, Postal address: Dpto. de Ingenier�a de SW y Sistemas Inform�ticos. E.T.S.I. Inform�tica, UNED. C/ Juan del Rosal, 16. 28040 Madrid.</em>
8
+
9
+ class Array #:nodoc: all
10
+
11
+ def oneOnRest
12
+ 0.upto(length-2) {|i|
13
+ (i+1).upto(length-1) {|j|
14
+ return true if yield(at(i), at(j))
15
+ } #j
16
+ } #i
17
+ return false
18
+ end #oneOnRest
19
+
20
+ end #Array
@@ -0,0 +1,48 @@
1
+ # <em>Copyright � 2007 by Ruben Heradio Gil, Jose Antonio Cerrada Somolinos, Jose Ramon Coz Fernandez and Jose Carlos Lopez Ruiz.</em>
2
+ # <em>This file is part of <b>EFL-A Ruby implementation of the Exemplar Flexibilization Language.</b></em>
3
+ # <em>EFL is distributed under the terms of the GNU Lesser General Public License (LGPL).</em>
4
+ # <em>EFL is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</em>
5
+ # <em>EFL is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.</em>
6
+ # <em>You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.</em>
7
+ # <em>Contact Information: Ruben Heradio Gil (rheradio@issi.uned.es). Phone number: 00 34 91 398 8242, Postal address: Dpto. de Ingenier�a de SW y Sistemas Inform�ticos. E.T.S.I. Inform�tica, UNED. C/ Juan del Rosal, 16. 28040 Madrid.</em>
8
+
9
+ module Error #:nodoc: all
10
+
11
+ def Error.arg_class(*args)
12
+ code = ""
13
+ args.each {|a|
14
+ code += "
15
+ if !#{a.at(0)}.kind_of?(#{a.at(1)}) && #{a.at(0)}
16
+ raise 'argument number #{args.index(a) + 1} ' +
17
+ 'should be of class #{a.at(1)}'
18
+ end"
19
+ }
20
+ return code
21
+ end #Error.arg_class
22
+
23
+ def Error.without_declaration(element)
24
+ # Un elemento de una lista (pasada como parametro) no existe en la tabla hash correspondiente
25
+ <<-CODE
26
+ #{element}_list.each {|e|
27
+ if !@#{element}_hash.include?(e)
28
+ raise "\#\{e\} needs a prior declaration"
29
+ end
30
+ }
31
+ CODE
32
+ end #Error.without_declaration
33
+
34
+ def Error.collision(receiver)
35
+ c = {
36
+ 'prod' => [['i_file', 'o_file', 'sub_list'], 'Substitution'],
37
+ 'gen' => [['prod_list'], 'Production'],
38
+ 'add' => [['generator'], 'Generator'],
39
+ 'sup' => [['generator'], 'Generator']
40
+ }
41
+ <<-CODE
42
+ if !#{receiver}?(#{c[receiver].at(0).join(', ')})
43
+ raise "Collision between #{c[receiver].at(1)}s"
44
+ end
45
+ CODE
46
+ end #Error.collision
47
+
48
+ end #Error
@@ -0,0 +1,18 @@
1
+ # <em>Copyright � 2007 by Ruben Heradio Gil, Jose Antonio Cerrada Somolinos, Jose Ramon Coz Fernandez and Jose Carlos Lopez Ruiz.</em>
2
+ # <em>This file is part of <b>EFL-A Ruby implementation of the Exemplar Flexibilization Language.</b></em>
3
+ # <em>EFL is distributed under the terms of the GNU Lesser General Public License (LGPL).</em>
4
+ # <em>EFL is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</em>
5
+ # <em>EFL is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.</em>
6
+ # <em>You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.</em>
7
+ # <em>Contact Information: Ruben Heradio Gil (rheradio@issi.uned.es). Phone number: 00 34 91 398 8242, Postal address: Dpto. de Ingenier�a de SW y Sistemas Inform�ticos. E.T.S.I. Inform�tica, UNED. C/ Juan del Rosal, 16. 28040 Madrid.</em>
8
+
9
+ class Hash #:nodoc: all
10
+ def my_collect
11
+ result = {}
12
+ each {|key, value|
13
+ new_key, new_value = yield(key, value.dup)
14
+ result[new_key] = new_value
15
+ }
16
+ return result
17
+ end
18
+ end #Hash
@@ -0,0 +1,49 @@
1
+ # <em>Copyright � 2007 by Ruben Heradio Gil, Jose Antonio Cerrada Somolinos, Jose Ramon Coz Fernandez and Jose Carlos Lopez Ruiz.</em>
2
+ # <em>This file is part of <b>EFL-A Ruby implementation of the Exemplar Flexibilization Language.</b></em>
3
+ # <em>EFL is distributed under the terms of the GNU Lesser General Public License (LGPL).</em>
4
+ # <em>EFL is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</em>
5
+ # <em>EFL is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.</em>
6
+ # <em>You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.</em>
7
+ # <em>Contact Information: Ruben Heradio Gil (rheradio@issi.uned.es). Phone number: 00 34 91 398 8242, Postal address: Dpto. de Ingenier�a de SW y Sistemas Inform�ticos. E.T.S.I. Inform�tica, UNED. C/ Juan del Rosal, 16. 28040 Madrid.</em>
8
+
9
+ class Production #:nodoc: all
10
+ attr_accessor :i_file, :o_file, :sub_list
11
+ def initialize(i_file, o_file, sub_list)
12
+ @i_file = i_file
13
+ @o_file = o_file
14
+ @sub_list = sub_list
15
+ end
16
+
17
+ def dup
18
+ return Production.new(@i_file.dup, @o_file.dup, @sub_list.dup)
19
+ end
20
+
21
+ def crash?(sub_hash, production = nil)
22
+ return crashSelf?(sub_hash) unless production
23
+ if @o_file != production.o_file
24
+ return false
25
+ else
26
+ if @i_file != production.i_file
27
+ return true
28
+ else
29
+ return Production.new(@i_file, @o_file,
30
+ (@sub_list + production.sub_list)).crashSelf?(sub_hash)
31
+ end #if
32
+ end #if
33
+ end #crash?
34
+
35
+ #####################################################
36
+ # <crash? auxiliar method>
37
+ #####################################################
38
+
39
+ def crashSelf?(sub_hash)
40
+ @sub_list.oneOnRest {|s1, s2|
41
+ sub_hash[s1].crash?(sub_hash[s2], @i_file)
42
+ }
43
+ end #crashSelf?
44
+
45
+ #####################################################
46
+ # </crash? auxiliar method>
47
+ #####################################################
48
+
49
+ end #Production
@@ -0,0 +1,112 @@
1
+ # <em>Copyright � 2007 by Ruben Heradio Gil, Jose Antonio Cerrada Somolinos, Jose Ramon Coz Fernandez and Jose Carlos Lopez Ruiz.</em>
2
+ # <em>This file is part of <b>EFL-A Ruby implementation of the Exemplar Flexibilization Language.</b></em>
3
+ # <em>EFL is distributed under the terms of the GNU Lesser General Public License (LGPL).</em>
4
+ # <em>EFL is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</em>
5
+ # <em>EFL is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.</em>
6
+ # <em>You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.</em>
7
+ # <em>Contact Information: Ruben Heradio Gil (rheradio@issi.uned.es). Phone number: 00 34 91 398 8242, Postal address: Dpto. de Ingenier�a de SW y Sistemas Inform�ticos. E.T.S.I. Inform�tica, UNED. C/ Juan del Rosal, 16. 28040 Madrid.</em>
8
+ #
9
+ # = Extensions of the Ruby regular expressions
10
+ #
11
+ # The next operators are included:
12
+ # * zoom Regexp#>
13
+ # * complement Regexp#o
14
+ # * minus Regexp#-
15
+
16
+ class Regexp
17
+
18
+ attr_accessor :zoom_list #:nodoc:
19
+ attr_accessor :minus_list #:nodoc:
20
+ attr_accessor :complemented #:nodoc:
21
+
22
+
23
+ # Using the "zoom operator", regular expressions can be chained to specify progressively a text pattern.
24
+ #
25
+ # For example:
26
+ # <tt>regular_expression_1 > regular_expression_2 > regular_expression_3 > ... regular_expression_N</tt>
27
+ #
28
+ # runs the <tt>regular_expression_2</tt> over the selection made by the <tt>regular_expression_1</tt>,
29
+ #
30
+ # the <tt>regular_expression_3</tt> over the selection made by the <tt>regular_expression_2</tt>, etcetera
31
+
32
+ def > (zoom_regular_expression)
33
+ op2 = zoom_regular_expression.dup
34
+ if !op2.zoom_list then
35
+ op2.zoom_list = [op2]
36
+ end
37
+
38
+ op1 = self.dup
39
+ if op1.minus_list && (op1.minus_list !=[]) then #due '-' has major precedence than '>', this error is detected here
40
+ raise "erroooor minus"
41
+ end
42
+ if op1.zoom_list
43
+ op1.zoom_list = op1.zoom_list + op2.zoom_list
44
+ else
45
+ op1.zoom_list = [op1] + op2.zoom_list
46
+ end
47
+
48
+ op1.minus_list = [] unless op1.minus_list
49
+ op1.zoom_list.each {|e|
50
+ op1.minus_list = op1.minus_list + e.minus_list unless !e.minus_list
51
+ }
52
+ return op1
53
+ end # >
54
+
55
+
56
+ # Using the "minus operator", regular expressions can be refined by deleting specific patterns.
57
+ # For example, let suppose we have the text: <tt>text_1, text_2, text_3, text_4</tt>.
58
+ #
59
+ # The matching of the regular expression <tt>/text_[0-9]/</tt> is <tt>['text_1', 'text_2', 'text_3', 'text_4']</tt>.
60
+ #
61
+ # Applying the <tt>-</tt> operator: <tt>/text_[0-9]/ - /text_1/ - /text_3/</tt>, the matching will be refined to <tt>['text_2', 'text_4']</tt>.
62
+ #
63
+ # Note that:
64
+ # * <tt>re1 - re2</tt> deletes the <tt>re2</tt> matchings in the context of <tt>re1</tt>.
65
+ # That is, <tt>re_1 > re_2 > ... > re_n - re_minus</tt> it would be equivalent to
66
+ # <tt>re_1 > re_2 > ... > re_n - (re_1 > re_2 > ... > re_n > re_minus)</tt>
67
+ # * To avoid inconsistent expressions, on the right side of the <tt>-</tt> operator is not permitted the use of the <tt>></tt> operator.
68
+
69
+ def - (minus_regular_expression)
70
+ op2 = minus_regular_expression.dup
71
+ if !op2.minus_list then
72
+ op2.minus_list = [op2]
73
+ end
74
+
75
+ op1 = self.dup
76
+ if op1.minus_list
77
+ op1.minus_list = op1.minus_list + op2.minus_list
78
+ else
79
+ op1.minus_list = op2.minus_list
80
+ end
81
+ return op1
82
+ end # -
83
+
84
+
85
+ # Complements a regular expression.
86
+ # For example:
87
+ # <tt>regular_expression_1.o > regular_expression_2</tt>
88
+ # matchs <tt>regular_expression_2</tt> outside the text matched by <tt>regular_expression_1</tt>
89
+ #
90
+ # Note that:
91
+ # * <tt>regular_expresion.o.o = regular_expresion</tt>
92
+ # * <tt>(regular_expression_1 > regular_expression_2 > ... > regular_expression_N).o = regular_expression_1 > regular_expression_2 > ... > regular_expresion_N.o</tt>
93
+
94
+ def o
95
+ result = self.dup
96
+ if result.zoom_list then
97
+ if not result.zoom_list.last.complemented then
98
+ result.zoom_list.last.complemented = true
99
+ else
100
+ result.zoom_list.last.complemented = false
101
+ end
102
+ else
103
+ if not result.complemented then
104
+ result.complemented = true
105
+ else
106
+ result.complemented = false
107
+ end
108
+ end
109
+ return result
110
+ end # o
111
+
112
+ end # Regexp
@@ -0,0 +1,70 @@
1
+ # <em>Copyright � 2007 by Ruben Heradio Gil, Jose Antonio Cerrada Somolinos, Jose Ramon Coz Fernandez and Jose Carlos Lopez Ruiz.</em>
2
+ # <em>This file is part of <b>EFL-A Ruby implementation of the Exemplar Flexibilization Language.</b></em>
3
+ # <em>EFL is distributed under the terms of the GNU Lesser General Public License (LGPL).</em>
4
+ # <em>EFL is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</em>
5
+ # <em>EFL is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.</em>
6
+ # <em>You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.</em>
7
+ # <em>Contact Information: Ruben Heradio Gil (rheradio@issi.uned.es). Phone number: 00 34 91 398 8242, Postal address: Dpto. de Ingenier�a de SW y Sistemas Inform�ticos. E.T.S.I. Inform�tica, UNED. C/ Juan del Rosal, 16. 28040 Madrid.</em>
8
+ #
9
+ # = Regular expression generators and facilities
10
+
11
+ #Returns a Regular Expression who matches nested symbols.
12
+ #By default, 10 is the maximum possible nested levels.
13
+ #
14
+ #Example:
15
+ # y = '( 1 + (3 + 9 - (45 + 9) ) ) (89(14))'
16
+ # y =~ nestedSymbols( '(' , ')' )
17
+ # puts $&
18
+ # ------------>
19
+ # 1 + (3 + 9 - (45 + 9) )
20
+ def nested_symbols(beginSymbol, endSymbol, levels=10)
21
+ eval('@level0 = "[' + beginSymbol + ']([^' + beginSymbol + endSymbol + '])*[' + endSymbol + ']"')
22
+ (1..(levels-2)).reject {|i|
23
+ eval("@level#{i}" + '= "[' + beginSymbol + ']([^' + beginSymbol + endSymbol +'] | #{@level' + "#{i-1}" + '} )*[' + endSymbol + ']"')
24
+ }
25
+ if levels > 1 then
26
+ eval("@level#{levels-1}" + '= /[' + beginSymbol + ']([^' + beginSymbol + endSymbol +'] | #{@level' + "#{levels-2}" + '} )*[' + endSymbol + ']/mx')
27
+ eval "return @level#{levels-1}"
28
+ else
29
+ eval "return /#{@level0}/mx"
30
+ end
31
+ end #nested_symbols
32
+
33
+ #Returns a Regular Expression who matches nested symbols.
34
+ #By default, 10 is the maximum possible nested levels.
35
+ #
36
+ #Example:
37
+ # puts nested_symbol('=', 2)
38
+ # ------------>
39
+ # (?mx-i:[=]([^=] | [=]([^=])*[=] )*[=])
40
+ def nested_symbol(symbol, levels=10)
41
+ eval('@level0 = "[' + symbol + ']([^' + symbol + '])*[' + symbol + ']"')
42
+ (1..(levels-2)).reject {|i|
43
+ eval("@level#{i}" + '= "[' + symbol + ']([^' + symbol +'] | #{@level' + "#{i-1}" + '} )*[' + symbol + ']"')
44
+ }
45
+ if levels > 1 then
46
+ eval("@level#{levels-1}" + '= /[' + symbol + ']([^' + symbol +'] | #{@level' + "#{levels-2}" + '} )*[' + symbol + ']/mx')
47
+ eval "return @level#{levels-1}"
48
+ else
49
+ eval "return /#{@level0}/mx"
50
+ end
51
+ end #nested_symbol
52
+
53
+ def regexp2string(reg_exp)
54
+ reg_exp.to_s =~ /:(.*?)[)]$/mx
55
+ return $1
56
+ end
57
+
58
+ #Returns a Regular Expression who matches nested quotes ("..."..."...").
59
+ #By default, 10 is the maximum possible nested levels.
60
+ def nested_quotes(levels=10)
61
+ nq_regexp = nested_symbol('\"', levels)
62
+ nq_string = regexp2string(nq_regexp).gsub(/\\/, '')
63
+ return /#{nq_string}/mx
64
+ end
65
+
66
+ def inside_nested_symbols(beginSymbol, endSymbol, levels=50)
67
+ quit_begin_and_end_symbols = /[^#{beginSymbol}].*(?=#{endSymbol})/xm
68
+ return (nested_symbols(beginSymbol, endSymbol, levels) > quit_begin_and_end_symbols)
69
+ end #nestedSymbols
70
+
@@ -0,0 +1,221 @@
1
+ # <em>Copyright � 2007 by Ruben Heradio Gil, Jose Antonio Cerrada Somolinos, Jose Ramon Coz Fernandez and Jose Carlos Lopez Ruiz.</em>
2
+ # <em>This file is part of <b>EFL-A Ruby implementation of the Exemplar Flexibilization Language.</b></em>
3
+ # <em>EFL is distributed under the terms of the GNU Lesser General Public License (LGPL).</em>
4
+ # <em>EFL is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</em>
5
+ # <em>EFL is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.</em>
6
+ # <em>You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.</em>
7
+ # <em>Contact Information: Ruben Heradio Gil (rheradio@issi.uned.es). Phone number: 00 34 91 398 8242, Postal address: Dpto. de Ingenier�a de SW y Sistemas Inform�ticos. E.T.S.I. Inform�tica, UNED. C/ Juan del Rosal, 16. 28040 Madrid.</em>
8
+
9
+ class Substitution #:nodoc: all
10
+ attr_accessor :reg_exp, :text, :scope, :match_hash
11
+
12
+ def initialize(reg_exp, text, scope)
13
+ @reg_exp = reg_exp
14
+ @text = text
15
+ @scope = scope
16
+ @match_hash = {}
17
+ end
18
+
19
+ #####################################################
20
+ # <matching>
21
+ #####################################################
22
+
23
+ #####################################################
24
+ # <complemented regular expressions matching>
25
+ #####################################################
26
+
27
+ def local_o(str, array)
28
+ if array == [] then
29
+ return [ [0, str.length-1] ]
30
+ else
31
+ if array[0][0] == 0 then
32
+ array_complemented = []
33
+ else
34
+ array_complemented = [ [0, array[0][0]-1] ]
35
+ end
36
+ array_complemented << [array[0][1]+1, str.length-1]
37
+ return array_complemented
38
+ end
39
+ end
40
+
41
+ def global_o(str, array)
42
+ if array == [] then
43
+ return [ [0, str.length-1] ]
44
+ else
45
+ if array[0][0] == 0 then
46
+ array_complemented = []
47
+ else
48
+ array_complemented = [ [0, array[0][0]-1] ]
49
+ end
50
+ i = -1
51
+ for i in 0..array.length-2
52
+ array_complemented << [array[i][1]+1, array[i+1][0]-1]
53
+ end
54
+ array_complemented << [array[i+1][1]+1, str.length-1]
55
+ return array_complemented
56
+ end
57
+ end
58
+
59
+ #####################################################
60
+ # </complemented regular expressions matching>
61
+ #####################################################
62
+
63
+ def match_pos(str, reg_exp, scope)
64
+ pos =[]
65
+ aux_str = str.dup
66
+ while aux_str != nil
67
+ m = reg_exp.match(aux_str)
68
+ if m
69
+ range = m.offset(0)
70
+ range[1] = range[1] - 1
71
+ pos << range.dup
72
+ if pos.length > 1
73
+ pos[pos.length - 1][0] = pos[pos.length-2][1] +
74
+ pos[pos.length - 1][0] + 1
75
+ pos[pos.length - 1][1] = pos[pos.length-2][1] +
76
+ pos[pos.length - 1][1] + 1
77
+ end
78
+ aux_str = aux_str[range[1] + 1, aux_str.length-1]
79
+ else
80
+ aux_str = nil
81
+ end
82
+ end
83
+ if reg_exp.complemented then
84
+ if /local/ =~ scope then
85
+ pos = local_o(str, pos)
86
+ else #/global/ =~ scope
87
+ pos = global_o(str, pos)
88
+ end
89
+ else
90
+ return pos
91
+ end
92
+ end #match_pos
93
+
94
+ def format_array(array)
95
+ a1 = array.dup
96
+ a1.flatten!
97
+ i = 0
98
+ a2 = []
99
+ while i<a1.length
100
+ a2 << [a1[i], a1[i+1]]
101
+ i += 2
102
+ end
103
+ return a2
104
+ end
105
+
106
+ def get_match_pos(str, reg_exp, scope)
107
+
108
+ ############################
109
+ # zoom matching
110
+ ############################
111
+ reg_exp.zoom_list = [reg_exp.dup] unless reg_exp.zoom_list
112
+ pos1 = match_pos(str, reg_exp.zoom_list[0], scope)
113
+ pos2, pos3 = [], []
114
+ i = 1
115
+ while i<reg_exp.zoom_list.length
116
+ j = 0
117
+ pos1.each {|aux|
118
+ pos2 = match_pos(str[aux[0], aux[1]-aux[0]+1], reg_exp.zoom_list[i], scope)
119
+ pos2.map! {|e|
120
+ e[0] = e[0] + pos1[j][0]
121
+ e[1] = e[1] + pos1[j][0]
122
+ e
123
+ }
124
+ pos3 << pos2.dup
125
+ j += 1
126
+ }
127
+ pos1 = format_array(pos3)
128
+ pos3 = []
129
+ i += 1
130
+ end #while
131
+
132
+ ############################
133
+ # minus matching
134
+ ############################
135
+ if reg_exp.minus_list then
136
+ pos2, pos3 = [], []
137
+ i = 0
138
+ while i<reg_exp.minus_list.length
139
+ j = 0
140
+ pos1.each {|aux|
141
+ pos2 = match_pos(str[aux[0], aux[1]-aux[0]+1], reg_exp.minus_list[i], scope)
142
+ pos2.map! {|e|
143
+ e[0] = e[0] + pos1[j][0]
144
+ e[1] = e[1] + pos1[j][0]
145
+ e
146
+ }
147
+ pos3 << pos2.dup
148
+ j += 1
149
+ }
150
+ i += 1
151
+ end #while
152
+ pos3 = format_array(pos3)
153
+ return pos1 - pos3
154
+ else
155
+ return pos1
156
+ end
157
+ end
158
+
159
+ #####################################################
160
+ # </matching>
161
+ #####################################################
162
+
163
+ def crash?(substitution, i_file)
164
+
165
+ i_string = ''
166
+ File.open(i_file) { |f| i_string = f.read }
167
+
168
+ self.match_hash[i_file] = get_match_pos(i_string, self.reg_exp, self.scope) unless self.match_hash[i_file]
169
+
170
+ substitution.match_hash[i_file] = get_match_pos(i_string, substitution.reg_exp, substitution.scope) unless substitution.match_hash[i_file]
171
+
172
+ crash = false
173
+
174
+ if (/before/ =~ self.scope) or (/after/ =~ self.scope) or
175
+ (/before/ =~ substitution.scope) or (/after/ =~ substitution.scope)
176
+ return false
177
+
178
+ elsif (/local/ =~ self.scope) and (/local/ =~ substitution.scope)
179
+ crash = crash_one_on_one?(self, 0, substitution, 0, i_file)
180
+
181
+ elsif (/local/ =~ self.scope) and (/global/ =~ substitution.scope)
182
+ index_2 = 0
183
+ while !crash and index_2 < substitution.match_hash[i_file].length - 1 do
184
+ crash = crash_one_on_one?(self, 0, substitution, index_2, i_file)
185
+ index_2 += 1
186
+ end
187
+
188
+ elsif (/global/ =~ self.scope) and (/local/ =~ substitution.scope)
189
+ index_1 = 0
190
+ while !crash and index_1 < self.match_hash[i_file].length - 1 do
191
+ crash = crash_one_on_one?(self, index_1, substitution, 0, i_file)
192
+ index_1 += 1
193
+ end
194
+
195
+ else #if (/global/ =~ self.scope) and (/global/ =~ substitution.scope)
196
+ index_1 = 0
197
+ while !crash and index_1 < self.match_hash[i_file].length - 1 do
198
+ index_2 = 0
199
+ while !crash and index_2 < substitution.match_hash[i_file].length - 1 do
200
+ crash = crash_one_on_one?(self, index_1, substitution, index_2, i_file)
201
+ index_2 += 1
202
+ end
203
+ index_1 += 1
204
+ end
205
+ end #if
206
+
207
+ return crash
208
+
209
+ end #crash?
210
+
211
+ def crash_one_on_one?(substitution1, index_1, substitution2, index_2, i_file)
212
+ return false if (substitution1.match_hash[i_file] == nil) or (substitution2.match_hash[i_file] ==nil)
213
+ if substitution1.match_hash[i_file][index_1][0] <= substitution2.match_hash[i_file][index_2][0]
214
+ return true if substitution1.match_hash[i_file][index_1][1] >= substitution2.match_hash[i_file][index_2][0]
215
+ else
216
+ return true if substitution2.match_hash[i_file][index_2][1] >= substitution1.match_hash[i_file][index_1][0]
217
+ end #if
218
+ return false
219
+ end #crash_one_on_one?
220
+
221
+ end #Substitution