cauldron 0.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 (398) hide show
  1. data/.document +5 -0
  2. data/Gemfile +13 -0
  3. data/LICENSE.txt +20 -0
  4. data/README +1 -0
  5. data/README.rdoc +19 -0
  6. data/Rakefile +53 -0
  7. data/VERSION +1 -0
  8. data/bin/cauldron +10 -0
  9. data/cauldron/.autotest +23 -0
  10. data/cauldron/History.txt +6 -0
  11. data/cauldron/Manifest.txt +8 -0
  12. data/cauldron/README.txt +57 -0
  13. data/cauldron/Rakefile +27 -0
  14. data/cauldron/bin/cauldron +3 -0
  15. data/cauldron/lib/cauldron.rb +3 -0
  16. data/cauldron/test/test_cauldron.rb +8 -0
  17. data/features/cauldron_example_cases.feature +13 -0
  18. data/features/cauldron_generates_runtime_method.feature +12 -0
  19. data/features/cauldron_start_terminal.feature +13 -0
  20. data/features/step_definitions/cauldron_steps.rb +16 -0
  21. data/features/step_definitions/terminal_steps.rb +34 -0
  22. data/features/support/env.rb +19 -0
  23. data/lib/Chain.rb +879 -0
  24. data/lib/ChainMapping.rb +172 -0
  25. data/lib/CodeHandler.rb +517 -0
  26. data/lib/Mapping.rb +26 -0
  27. data/lib/MappingValues.rb +24 -0
  28. data/lib/ScopeDependencies.rb +7 -0
  29. data/lib/Theory.rb +274 -0
  30. data/lib/UnifiedChain.rb +110 -0
  31. data/lib/cauldron.rb +6 -0
  32. data/lib/cauldron/conversion.rb +15 -0
  33. data/lib/cauldron/pot.rb +134 -0
  34. data/lib/cauldron/sexp2cauldron.rb +156 -0
  35. data/lib/cauldron/terminal.rb +120 -0
  36. data/lib/cauldron/theory_factory.rb +10 -0
  37. data/lib/core/ActsAsCode.rb +25 -0
  38. data/lib/core/BlockToken.rb +33 -0
  39. data/lib/core/CCall.rb +7 -0
  40. data/lib/core/CTestCase.rb +27 -0
  41. data/lib/core/ClassMethodCallContainer.rb +45 -0
  42. data/lib/core/Container.rb +85 -0
  43. data/lib/core/InstanceCallContainer.rb +272 -0
  44. data/lib/core/MethodUsage.rb +66 -0
  45. data/lib/core/PrintVariables.rb +25 -0
  46. data/lib/core/TheoryGenerator.rb +764 -0
  47. data/lib/core/Token.rb +7 -0
  48. data/lib/core/assignment/Assignment.rb +18 -0
  49. data/lib/core/assignment/Equal.rb +39 -0
  50. data/lib/core/assignment/Equivalent.rb +20 -0
  51. data/lib/core/assignment/NotEqual.rb +14 -0
  52. data/lib/core/call_container/CallContainer.rb +66 -0
  53. data/lib/core/class_method_call/New.rb +15 -0
  54. data/lib/core/class_method_call/RuntimeClassMethodCall.rb +31 -0
  55. data/lib/core/declaration/Declaration.rb +16 -0
  56. data/lib/core/declaration/LiteralDeclaration.rb +47 -0
  57. data/lib/core/declaration/VariableDeclaration.rb +59 -0
  58. data/lib/core/instance_call/ArrayEach.rb +23 -0
  59. data/lib/core/instance_call/ArrayLength.rb +15 -0
  60. data/lib/core/instance_call/Chop.rb +28 -0
  61. data/lib/core/instance_call/Copy.rb +22 -0
  62. data/lib/core/instance_call/DeclaredVariable.rb +18 -0
  63. data/lib/core/instance_call/InstanceCall.rb +77 -0
  64. data/lib/core/instance_call/Params.rb +15 -0
  65. data/lib/core/instance_call/Push.rb +20 -0
  66. data/lib/core/instance_call/StringLength.rb +32 -0
  67. data/lib/core/instance_call/Times.rb +20 -0
  68. data/lib/core/instance_call/instance_calls.rb +168 -0
  69. data/lib/core/instance_call/length_equal.rb +15 -0
  70. data/lib/core/kernal/EvalCall.rb +15 -0
  71. data/lib/core/kernal/LocalVariablesCall.rb +15 -0
  72. data/lib/core/literal/Literal.rb +111 -0
  73. data/lib/core/literal/Raw.rb +23 -0
  74. data/lib/core/literal/RuntimeMethodLiteral.rb +21 -0
  75. data/lib/core/literal/StatementLiteral.rb +28 -0
  76. data/lib/core/method_call/AvailableVariablesCall.rb +25 -0
  77. data/lib/core/method_call/ClassCall.rb +33 -0
  78. data/lib/core/method_call/DefCall.rb +72 -0
  79. data/lib/core/method_call/EvaluateClassCall.rb +29 -0
  80. data/lib/core/method_call/MethodNameCall.rb +27 -0
  81. data/lib/core/method_call/ToDeclarationCall.rb +15 -0
  82. data/lib/core/requirement/Requirement.rb +291 -0
  83. data/lib/core/runtime_class/ArrayClass.rb +19 -0
  84. data/lib/core/runtime_class/ClassCallClass.rb +23 -0
  85. data/lib/core/runtime_class/ClassEvaluationClass.rb +19 -0
  86. data/lib/core/runtime_class/ClassName.rb +18 -0
  87. data/lib/core/runtime_class/DefCallClass.rb +21 -0
  88. data/lib/core/runtime_class/EqualClass.rb +19 -0
  89. data/lib/core/runtime_class/FixnumClass.rb +15 -0
  90. data/lib/core/runtime_class/IfStatementClass.rb +12 -0
  91. data/lib/core/runtime_class/InstanceCallClass.rb +19 -0
  92. data/lib/core/runtime_class/InstanceCallContainerClass.rb +16 -0
  93. data/lib/core/runtime_class/InstanceClassCallClass.rb +19 -0
  94. data/lib/core/runtime_class/LiteralClass.rb +19 -0
  95. data/lib/core/runtime_class/MethodParameterClass.rb +27 -0
  96. data/lib/core/runtime_class/MethodUsageClass.rb +27 -0
  97. data/lib/core/runtime_class/RequirementClass.rb +19 -0
  98. data/lib/core/runtime_class/ReturnClass.rb +21 -0
  99. data/lib/core/runtime_class/RuntimeClass.rb +30 -0
  100. data/lib/core/runtime_class/RuntimeClassClass.rb +19 -0
  101. data/lib/core/runtime_class/RuntimeMethodClass.rb +34 -0
  102. data/lib/core/runtime_class/StatementClass.rb +53 -0
  103. data/lib/core/runtime_class/StringClass.rb +23 -0
  104. data/lib/core/runtime_class/StringLengthClass.rb +19 -0
  105. data/lib/core/runtime_class/StringVariableClass.rb +19 -0
  106. data/lib/core/runtime_class/ThisClass.rb +15 -0
  107. data/lib/core/runtime_class/UnknownClass.rb +23 -0
  108. data/lib/core/runtime_class/class_names.rb +95 -0
  109. data/lib/core/runtime_class/runtime_class.rb +123 -0
  110. data/lib/core/runtime_method/ActsAsRuntimeMethod.rb +300 -0
  111. data/lib/core/runtime_method/ParametersContainer.rb +29 -0
  112. data/lib/core/runtime_method/RealisedRuntimeMethod.rb +94 -0
  113. data/lib/core/runtime_method/RuntimeMethod.rb +817 -0
  114. data/lib/core/runtime_method/WriteParameters.rb +35 -0
  115. data/lib/core/statement/ActsAsStatement.rb +116 -0
  116. data/lib/core/statement/ArrayAccess.rb +96 -0
  117. data/lib/core/statement/BlockStatement.rb +348 -0
  118. data/lib/core/statement/DeclarationStatement.rb +19 -0
  119. data/lib/core/statement/HackStatement.rb +25 -0
  120. data/lib/core/statement/HashAccess.rb +18 -0
  121. data/lib/core/statement/OpenStatement.rb +171 -0
  122. data/lib/core/statement/RealisedStatement.rb +5 -0
  123. data/lib/core/statement/SingleLineBlockStatement.rb +39 -0
  124. data/lib/core/statement/Statement.rb +1223 -0
  125. data/lib/core/statement/StatementDependencies.rb +271 -0
  126. data/lib/core/statement/StatementGroup.rb +157 -0
  127. data/lib/core/statement/StatementStructure2.rb +224 -0
  128. data/lib/core/statement/TheoryStatement.rb +60 -0
  129. data/lib/core/statement/TopologicalStatements.rb +34 -0
  130. data/lib/core/structure/DeclareNewInstanceStructure.rb +49 -0
  131. data/lib/core/structure/DeclareRuntimeMethodStructure.rb +34 -0
  132. data/lib/core/structure/DeclareVariableAsLiteralStructure.rb +31 -0
  133. data/lib/core/structure/DeclareVariableAsVariableStructure.rb +52 -0
  134. data/lib/core/structure/FixnumAdditionStructure.rb +56 -0
  135. data/lib/core/structure/InstanceCallContainerStructure.rb +50 -0
  136. data/lib/core/structure/InstanceCallStructure.rb +53 -0
  137. data/lib/core/structure/InstanceMethodCallStructure.rb +21 -0
  138. data/lib/core/structure/ReturnStructure.rb +20 -0
  139. data/lib/core/structure/StatementStructure.rb +11 -0
  140. data/lib/core/syntax/Addition.rb +25 -0
  141. data/lib/core/syntax/BlockContainer.rb +130 -0
  142. data/lib/core/syntax/Boolean.rb +15 -0
  143. data/lib/core/syntax/Code.rb +11 -0
  144. data/lib/core/syntax/Do.rb +20 -0
  145. data/lib/core/syntax/False.rb +12 -0
  146. data/lib/core/syntax/If.rb +28 -0
  147. data/lib/core/syntax/IfContainer.rb +100 -0
  148. data/lib/core/syntax/Nil.rb +15 -0
  149. data/lib/core/syntax/Return.rb +33 -0
  150. data/lib/core/syntax/Subtract.rb +19 -0
  151. data/lib/core/syntax/This.rb +40 -0
  152. data/lib/core/syntax/True.rb +20 -0
  153. data/lib/core/syntax/syntax.rb +24 -0
  154. data/lib/core/tracking/ActsAsTrackable.rb +65 -0
  155. data/lib/core/tracking/History.rb +167 -0
  156. data/lib/core/tracking/RuntimeTrackingMethod.rb +32 -0
  157. data/lib/core/tracking/Step.rb +52 -0
  158. data/lib/core/variable/ArrayVariable.rb +76 -0
  159. data/lib/core/variable/BaseVariable.rb +154 -0
  160. data/lib/core/variable/BlockVariable.rb +92 -0
  161. data/lib/core/variable/FixnumVariable.rb +36 -0
  162. data/lib/core/variable/HistoryVariable.rb +8 -0
  163. data/lib/core/variable/MethodParameter.rb +206 -0
  164. data/lib/core/variable/MethodUsageVariable.rb +60 -0
  165. data/lib/core/variable/NilVariable.rb +29 -0
  166. data/lib/core/variable/RuntimeMethodParameter.rb +67 -0
  167. data/lib/core/variable/StatementVariable.rb +72 -0
  168. data/lib/core/variable/StepVariable.rb +7 -0
  169. data/lib/core/variable/StringVariable.rb +46 -0
  170. data/lib/core/variable/TypeVariable.rb +72 -0
  171. data/lib/core/variable/Unknown.rb +116 -0
  172. data/lib/core/variable/UnknownVariable.rb +29 -0
  173. data/lib/core/variable/Variable.rb +70 -0
  174. data/lib/core/variable/VariableContainer.rb +28 -0
  175. data/lib/core/variable/VariableIncluded.rb +27 -0
  176. data/lib/core/variable/VariableReference.rb +85 -0
  177. data/lib/error/FailedToFindStatementContainerError.rb +7 -0
  178. data/lib/error/FailedToFindStatementError.rb +7 -0
  179. data/lib/error/FailedToFindVariableError.rb +7 -0
  180. data/lib/error/FailedToLiteraliseError.rb +7 -0
  181. data/lib/error/FailedVariableMatch.rb +7 -0
  182. data/lib/error/ImproperStatementUsageError.rb +7 -0
  183. data/lib/error/IncompatiableRequirementsError.rb +7 -0
  184. data/lib/error/InvalidStatementError.rb +7 -0
  185. data/lib/error/MethodSizeError.rb +7 -0
  186. data/lib/error/RuntimeSyntaxError.rb +7 -0
  187. data/lib/error/UnexpectedStatementTypeError.rb +7 -0
  188. data/lib/error/UnknownStatementType.rb +7 -0
  189. data/lib/error/UnliteralisableError.rb +7 -0
  190. data/lib/implemented_chain.rb +34 -0
  191. data/lib/intrinsic/IntrinsicLastRuntimeMethod.rb +20 -0
  192. data/lib/intrinsic/IntrinsicLiteral.rb +26 -0
  193. data/lib/intrinsic/IntrinsicObject.rb +22 -0
  194. data/lib/intrinsic/IntrinsicRuntimeMethod.rb +27 -0
  195. data/lib/intrinsic/IntrinsicTestCases.rb +17 -0
  196. data/lib/logger/StandardLogger.rb +62 -0
  197. data/lib/required.rb +236 -0
  198. data/lib/ruby_code/Array.rb +95 -0
  199. data/lib/ruby_code/Fixnum.rb +39 -0
  200. data/lib/ruby_code/Hash.rb +25 -0
  201. data/lib/ruby_code/NilClass.rb +19 -0
  202. data/lib/ruby_code/Object.rb +24 -0
  203. data/lib/ruby_code/String.rb +86 -0
  204. data/lib/ruby_code/Symbol.rb +7 -0
  205. data/lib/standard_library/Tasks.rb +12 -0
  206. data/lib/theories.rb +143 -0
  207. data/lib/theory/ActionImplementation.rb +17 -0
  208. data/lib/theory/TheoryAction.rb +70 -0
  209. data/lib/theory/TheoryChainValidator.rb +101 -0
  210. data/lib/theory/TheoryComponent.rb +42 -0
  211. data/lib/theory/TheoryConnector.rb +755 -0
  212. data/lib/theory/TheoryDependent.rb +135 -0
  213. data/lib/theory/TheoryImplementation.rb +74 -0
  214. data/lib/theory/TheoryResult.rb +131 -0
  215. data/lib/theory/TheoryVariable.rb +63 -0
  216. data/lib/theory/theory_collection.rb +62 -0
  217. data/lib/util/ClassEvaluation.rb +68 -0
  218. data/lib/util/CodeEvaluation.rb +35 -0
  219. data/lib/util/DeclarationStatementEvaluation.rb +31 -0
  220. data/lib/util/MethodEvaluation.rb +49 -0
  221. data/lib/util/MethodTester.rb +71 -0
  222. data/lib/util/MethodValidation.rb +145 -0
  223. data/lib/util/MethodWriter.rb +66 -0
  224. data/lib/util/Parser.rb +299 -0
  225. data/lib/util/StatementCheck.rb +42 -0
  226. data/lib/util/StringToTheory.rb +119 -0
  227. data/lib/util/System.rb +8 -0
  228. data/spec/cauldron/pot_spec.rb +6 -0
  229. data/spec/cauldron/runtime_method_spec.rb +36 -0
  230. data/spec/cauldron/sexp_2_cauldron_spec.rb +26 -0
  231. data/spec/cauldron/terminal_spec.rb +38 -0
  232. data/spec/cauldron/theory_action_spec.rb +5 -0
  233. data/spec/spec_helper.rb +4 -0
  234. data/test/fixtures/chains/1/declaration.txt +26 -0
  235. data/test/fixtures/chains/1/dump +0 -0
  236. data/test/fixtures/chains/2/declaration.txt +26 -0
  237. data/test/fixtures/chains/2/dump +0 -0
  238. data/test/fixtures/chains/3/declaration.txt +26 -0
  239. data/test/fixtures/chains/3/dump +0 -0
  240. data/test/fixtures/implementation_results/0/declaration.txt +3 -0
  241. data/test/fixtures/implementation_results/0/dump +0 -0
  242. data/test/fixtures/theories/0/declaration.txt +9 -0
  243. data/test/fixtures/theories/0/desc +10 -0
  244. data/test/fixtures/theories/0/dump +0 -0
  245. data/test/fixtures/theories/1/declaration.txt +15 -0
  246. data/test/fixtures/theories/1/desc +11 -0
  247. data/test/fixtures/theories/1/dump +0 -0
  248. data/test/fixtures/theories/10/declaration.txt +23 -0
  249. data/test/fixtures/theories/10/desc +17 -0
  250. data/test/fixtures/theories/10/dump +0 -0
  251. data/test/fixtures/theories/11/declaration.txt +20 -0
  252. data/test/fixtures/theories/11/desc +14 -0
  253. data/test/fixtures/theories/11/dump +0 -0
  254. data/test/fixtures/theories/12/declaration.txt +18 -0
  255. data/test/fixtures/theories/12/desc +12 -0
  256. data/test/fixtures/theories/12/dump +0 -0
  257. data/test/fixtures/theories/13/declaration.txt +24 -0
  258. data/test/fixtures/theories/13/desc +20 -0
  259. data/test/fixtures/theories/13/dump +0 -0
  260. data/test/fixtures/theories/14/declaration.txt +26 -0
  261. data/test/fixtures/theories/14/desc +20 -0
  262. data/test/fixtures/theories/14/dump +0 -0
  263. data/test/fixtures/theories/15/declaration.txt +20 -0
  264. data/test/fixtures/theories/15/desc +14 -0
  265. data/test/fixtures/theories/15/dump +0 -0
  266. data/test/fixtures/theories/16/declaration.txt +30 -0
  267. data/test/fixtures/theories/16/desc +14 -0
  268. data/test/fixtures/theories/16/dump +0 -0
  269. data/test/fixtures/theories/17/declaration.txt +25 -0
  270. data/test/fixtures/theories/17/desc +11 -0
  271. data/test/fixtures/theories/17/dump +0 -0
  272. data/test/fixtures/theories/18/declaration.txt +23 -0
  273. data/test/fixtures/theories/18/desc +11 -0
  274. data/test/fixtures/theories/18/dump +0 -0
  275. data/test/fixtures/theories/19/declaration.txt +23 -0
  276. data/test/fixtures/theories/19/desc +11 -0
  277. data/test/fixtures/theories/19/dump +0 -0
  278. data/test/fixtures/theories/2/declaration.txt +12 -0
  279. data/test/fixtures/theories/2/desc +10 -0
  280. data/test/fixtures/theories/2/dump +0 -0
  281. data/test/fixtures/theories/20/declaration.txt +23 -0
  282. data/test/fixtures/theories/20/desc +17 -0
  283. data/test/fixtures/theories/20/dump +0 -0
  284. data/test/fixtures/theories/3/declaration.txt +19 -0
  285. data/test/fixtures/theories/3/desc +11 -0
  286. data/test/fixtures/theories/3/dump +0 -0
  287. data/test/fixtures/theories/4/declaration.txt +11 -0
  288. data/test/fixtures/theories/4/desc +11 -0
  289. data/test/fixtures/theories/4/dump +0 -0
  290. data/test/fixtures/theories/5/declaration.txt +6 -0
  291. data/test/fixtures/theories/5/desc +9 -0
  292. data/test/fixtures/theories/5/dump +0 -0
  293. data/test/fixtures/theories/6/declaration.txt +13 -0
  294. data/test/fixtures/theories/6/desc +11 -0
  295. data/test/fixtures/theories/6/dump +0 -0
  296. data/test/fixtures/theories/7/declaration.txt +19 -0
  297. data/test/fixtures/theories/7/desc +11 -0
  298. data/test/fixtures/theories/7/dump +0 -0
  299. data/test/fixtures/theories/8/declaration.txt +21 -0
  300. data/test/fixtures/theories/8/desc +11 -0
  301. data/test/fixtures/theories/8/dump +0 -0
  302. data/test/fixtures/theories/9/declaration.txt +24 -0
  303. data/test/fixtures/theories/9/desc +20 -0
  304. data/test/fixtures/theories/9/dump +0 -0
  305. data/test/fixtures/theory_implementations/0/declaration.txt +11 -0
  306. data/test/fixtures/theory_implementations/0/desc.txt +9 -0
  307. data/test/fixtures/theory_implementations/0/dump +0 -0
  308. data/test/fixtures/theory_implementations/0/theory_id +1 -0
  309. data/test/fixtures/theory_implementations/1/desc.txt +9 -0
  310. data/test/fixtures/theory_implementations/1/dump +0 -0
  311. data/test/fixtures/theory_implementations/1/theory_id +1 -0
  312. data/test/fixtures/theory_implementations/2/desc.txt +9 -0
  313. data/test/fixtures/theory_implementations/2/dump +0 -0
  314. data/test/fixtures/theory_implementations/2/theory_id +1 -0
  315. data/test/output/simple_method.txt +6 -0
  316. data/test/output/test_method/first_possible_method.txt +6 -0
  317. data/test/output/test_simple_cases/simple_case_01.txt +8 -0
  318. data/test/output/test_simple_cases/simple_case_02.txt +7 -0
  319. data/test/output/test_simple_cases/simple_case_03.txt +8 -0
  320. data/test/output/test_simple_cases/simple_case_04.txt +8 -0
  321. data/test/output/test_simple_cases/simple_case_05.txt +8 -0
  322. data/test/output/test_simple_cases/simple_case_06.txt +9 -0
  323. data/test/output/test_simple_cases/simple_case_07.txt +9 -0
  324. data/test/output/test_simple_cases/simple_case_08.txt +9 -0
  325. data/test/tc_contextual_variables.rb +87 -0
  326. data/test/tc_describe.rb +47 -0
  327. data/test/tc_method.rb +133 -0
  328. data/test/tc_requirement.rb +30 -0
  329. data/test/tc_suite_complete.rb +26 -0
  330. data/test/tc_variable.rb +52 -0
  331. data/test/ts_complete.rb +84 -0
  332. data/test/ts_stable.rb +81 -0
  333. data/test/unit/core/declaration/tc_literal_declaration.rb +34 -0
  334. data/test/unit/core/method_call/tc_class_call.rb +20 -0
  335. data/test/unit/core/runtime_method/tc_realised_runtime_method.rb +129 -0
  336. data/test/unit/core/runtime_method/tc_runtime_method.rb +616 -0
  337. data/test/unit/core/statement/tc_array_access.rb +63 -0
  338. data/test/unit/core/statement/tc_block_statement.rb +51 -0
  339. data/test/unit/core/statement/tc_hack_statement.rb +26 -0
  340. data/test/unit/core/statement/tc_open_statement.rb +70 -0
  341. data/test/unit/core/statement/tc_statement.rb +681 -0
  342. data/test/unit/core/statement/tc_statement_dependencies.rb +146 -0
  343. data/test/unit/core/statement/tc_statement_group.rb +35 -0
  344. data/test/unit/core/statement/tc_statement_replace_variable.rb +61 -0
  345. data/test/unit/core/statement/tc_theory_statement.rb +51 -0
  346. data/test/unit/core/structure/tc_declare_new_instance_structure.rb +41 -0
  347. data/test/unit/core/structure/tc_declare_variable_as_literal_structure.rb +41 -0
  348. data/test/unit/core/structure/tc_declare_variable_as_variable_structure.rb +66 -0
  349. data/test/unit/core/structure/tc_instance_call_container_structure.rb +41 -0
  350. data/test/unit/core/structure/tc_return_structure.rb +32 -0
  351. data/test/unit/core/syntax/tc_block_container.rb +32 -0
  352. data/test/unit/core/syntax/tc_if_container.rb +39 -0
  353. data/test/unit/core/tc_class_method_call.rb +34 -0
  354. data/test/unit/core/tc_container.rb +41 -0
  355. data/test/unit/core/tc_ctest_case.rb +25 -0
  356. data/test/unit/core/tc_instance_call_container.rb +93 -0
  357. data/test/unit/core/tc_literal.rb +30 -0
  358. data/test/unit/core/tc_theory_generator.rb +336 -0
  359. data/test/unit/core/tc_theory_generator_heavy.rb +42 -0
  360. data/test/unit/core/tracking/tc_history.rb +102 -0
  361. data/test/unit/core/tracking/tc_step.rb +65 -0
  362. data/test/unit/core/variable/tc_array_variable.rb +61 -0
  363. data/test/unit/core/variable/tc_block_variable.rb +17 -0
  364. data/test/unit/core/variable/tc_fixnum_variable.rb +54 -0
  365. data/test/unit/core/variable/tc_method_parameter_variable.rb +22 -0
  366. data/test/unit/core/variable/tc_runtime_method_variable.rb +32 -0
  367. data/test/unit/core/variable/tc_string_variable.rb +37 -0
  368. data/test/unit/core/variable/tc_unknown.rb +24 -0
  369. data/test/unit/core/variable/tc_variable_reference.rb +28 -0
  370. data/test/unit/ruby_code/tc_array.rb +64 -0
  371. data/test/unit/ruby_code/tc_fixnum.rb +18 -0
  372. data/test/unit/ruby_code/tc_hash.rb +41 -0
  373. data/test/unit/ruby_code/tc_string.rb +38 -0
  374. data/test/unit/tc_chain.rb +434 -0
  375. data/test/unit/tc_chain_mapping.rb +62 -0
  376. data/test/unit/tc_chain_with_case_1.rb +169 -0
  377. data/test/unit/tc_instance_call.rb +40 -0
  378. data/test/unit/tc_instance_call_structure.rb +35 -0
  379. data/test/unit/tc_method_usage.rb +35 -0
  380. data/test/unit/tc_pot.rb +124 -0
  381. data/test/unit/tc_runtime_tracking_method.rb +40 -0
  382. data/test/unit/tc_statement_structure_2.rb +43 -0
  383. data/test/unit/tc_theory.rb +533 -0
  384. data/test/unit/tc_variable_declaration.rb +32 -0
  385. data/test/unit/theory/tc_theory_action.rb +80 -0
  386. data/test/unit/theory/tc_theory_action_implementation.rb +23 -0
  387. data/test/unit/theory/tc_theory_chain_validator.rb +340 -0
  388. data/test/unit/theory/tc_theory_connector.rb +396 -0
  389. data/test/unit/theory/tc_theory_dependent.rb +151 -0
  390. data/test/unit/theory/tc_theory_implementation.rb +133 -0
  391. data/test/unit/theory/tc_theory_result.rb +111 -0
  392. data/test/unit/theory/tc_theory_variable.rb +45 -0
  393. data/test/unit/util/tc_method_validation.rb +98 -0
  394. data/test/unit/util/tc_parser.rb +108 -0
  395. data/test/unit/util/tc_string_to_theory.rb +299 -0
  396. data/test/unit/variable/tc_method_usage_variable.rb +25 -0
  397. data/tmp/runtime_method_evaluation.rb +10 -0
  398. metadata +522 -0
@@ -0,0 +1,271 @@
1
+ #
2
+ # TODO I might just make this part of StatementGroup
3
+ #
4
+ # TODO TSort examples show a single use. So you basically add all your variables
5
+ # and then sort them once. Rather than what I'm doing which is to attempt
6
+ # to find the dependencies for particular statements. It might be better
7
+ # to rebuild the dependies each time and then do a single sort.
8
+
9
+ # Include a scope dependencies as well - if a statement resides within a nested statement
10
+ # the nested statement must come first.
11
+ #
12
+ # New statement: - statement level: 183
13
+ # var_5918 = var_652 + var_658
14
+ #
15
+ # Pre-requiste statements:
16
+ # var_34 = method_13
17
+ # var_34.times do |var_658|
18
+ # end
19
+ # var_652 = var_34 + var_34
20
+
21
+ # In this case the scope means that the nested "var_34.times do |var_658|" is dependent
22
+ # on var_652 = var_34 + var_34.
23
+ #
24
+ # # Find the statement that contains this statement - if it exists
25
+ # self.each do |x|
26
+ # if x.kind_of?(BlockStatement)
27
+ # if x.scope_id == statement.statement_level
28
+ #
29
+ # # Apply the dependencies for the statement to the containing statement
30
+ # # unless it's the containing statement itself.
31
+ #
32
+ # end
33
+ # end
34
+ # end
35
+ #
36
+ class StatementDependencies < Array
37
+ #include TSort # See p750
38
+
39
+ alias :array_push :push
40
+
41
+ def initialize(*params)
42
+ super()
43
+ #@dependencies = {}
44
+
45
+ # Add the statements
46
+ params.each {|x| self.push(x)}
47
+ end
48
+
49
+ # TODO Write about this in more detail
50
+ #
51
+ def tsort_for_statement(statement)
52
+
53
+ @statement_sort = TopologicalStatements.new
54
+ add_dependent_statements(@statement_sort,statement)
55
+
56
+ # TODO Should probably copy the @statement_sort before itterating through it
57
+ #
58
+ each_used_nest_statement(@statement_sort,statement) do |x|
59
+ # CONTINUE - Why are these nested statements populated
60
+
61
+ # Find statements that have the same scope as this
62
+ each_nested_statement(@statement_sort,statement,x.scope_id) do |y|
63
+
64
+ # Add the inner statement dependencies onto the nested statement
65
+ @statement_sort[x.statement_id] += @statement_sort[y.statement_id]
66
+ end
67
+
68
+ end
69
+
70
+ return @statement_sort.tsort
71
+
72
+ end
73
+
74
+ def dependencies_for(statement_id)
75
+
76
+ # Check that the statement exists
77
+ unknown_statement_id = lambda {raise StandardError.new('Could\'nt find statement_id '+statement_id.to_s)}
78
+ self.detect(unknown_statement_id) {|x| x.statement_id == statement_id}
79
+
80
+ #
81
+ @statement_sort = TopologicalStatements.new
82
+
83
+ # First find the initial statement
84
+ initial_statement = find_statement(statement_id)
85
+ add_dependent_statements(@statement_sort,initial_statement)
86
+
87
+
88
+ return @statement_sort.tsort
89
+ end
90
+
91
+ def add_dependent_statements(tsort,statement)
92
+ dependencies = find_dependencies_for(statement)
93
+ tsort[statement.statement_id] = dependencies
94
+
95
+ # Find the dependiencies for the
96
+ dependencies.each do |x|
97
+ add_dependent_statements(tsort,find_statement(x))
98
+ end
99
+ end
100
+
101
+ def find_statement(id)
102
+ self.each do |x|
103
+ if x.statement_id == id
104
+ return x
105
+ end
106
+ end
107
+ # TODO Should raise error here
108
+ end
109
+
110
+ # Returns an array of statement ids of all the statements that the supplied
111
+ # statement is dependent on.
112
+ #
113
+ # @param statement A statement instance thats dependencies are returned
114
+ #
115
+ def find_dependencies_for(statement)
116
+ results = []
117
+ statement.not_declared_variables.each do |x|
118
+
119
+ # Find the original declaration statement
120
+ # TODO Doesn't catch no results
121
+ statement_ids = self.inject([]) do |ids,y|
122
+ #ids.push(y.statement_id) if x.uniq_id == y.created_variable.uniq_id
123
+ if x.uniq_id == y.created_variable.uniq_id
124
+ # TODO Quick hack to prevent bug
125
+ ids.push(y.statement_id) unless statement.statement_id == y.statement_id
126
+ end
127
+ ids
128
+ end
129
+
130
+ # Find any further required uniq ids
131
+ x.uniq_id_history.each do |y|
132
+ # TODO Change to detect since this presumes a result is found
133
+ statement_ids.push(self.select {|z| z.created_variable.uniq_id == y}.first.statement_id)
134
+ end
135
+ raise StandardError.new('Can\'t find the declaration of '+x.write+' or '+x.write_with_uniq_id) if statement_ids.empty?
136
+ results += statement_ids
137
+ results.each do |y|
138
+ raise StandardError.new('dksafkjdashfkahsdf '+statement.statement_id.to_s) if(y==statement.statement_id)
139
+ end
140
+ # # TODO Change to catch :found
141
+ # found = false
142
+ # self.each do |y|
143
+ # #if x.variable_id == y.declared_variable_id
144
+ # if x.uniq_id == y.created_variable.uniq_id
145
+ # found = true
146
+ # results.push(y.statement_id)
147
+ # break
148
+ # end
149
+ # end
150
+ # raise StandardError.new('Can\'t find the declaration of '+x.write+' or '+x.write_with_uniq_id) unless found
151
+ end
152
+ return results
153
+ end
154
+
155
+ # Saves any of the statements thats dependencies are being
156
+ # saved.
157
+ #
158
+ # @param statement
159
+ #
160
+ def push(statement)
161
+
162
+ # Check that any statements this statement is dependent on is included
163
+ find_dependencies_for(statement)
164
+
165
+ # Add the new piece of code to the statement
166
+ array_push(statement)
167
+
168
+ end
169
+
170
+ # Returns the saved statement based on the statement id provided
171
+ #
172
+ # @param statement_id The statement id of the stored statement.
173
+ #
174
+ def find_statement(statement_id,new_statement=nil)
175
+ unless new_statement.nil?
176
+ return new_statement if new_statement.statement_id == statement_id
177
+ end
178
+ return self.detect {|x| x.statement_id == statement_id}
179
+ end
180
+
181
+ # Returns a string to be printed out for the general use of
182
+ # debugging.
183
+ #
184
+ # @param topsort Topological sort containing the dependencies
185
+ # for each statement.
186
+ # @param statements An array of statements that have already been
187
+ # saved.
188
+ # @param new_statement The new statement that has yet to be included
189
+ # in a large method and hasn't been realised yet.
190
+ #
191
+ def display_statement_dependencies(topsort,statements,new_statement)
192
+ msg = ''
193
+ msg += topsort.inspect+"\n"
194
+ topsort.each_key do |x|
195
+ msg += x.to_s+"\n"
196
+ msg += find_statement(x,new_statement).write+"\n"
197
+ end
198
+ return msg
199
+ end
200
+
201
+ # Modifies the supplied topological sort to include scope dependency. This
202
+ # basically involves applying the dependencies of nested statements to
203
+ # the containing statement. e.g.
204
+ #
205
+ # var_a = 6
206
+ # 5.times do |var_b|
207
+ # var_c = var_b+var_a
208
+ # end
209
+ #
210
+ # So "var_c = var_b+var_a" is dependent on the two proceeding statements but
211
+ # sequentially they could be written as
212
+ #
213
+ # 5.times do |var_b|
214
+ # var_a = 6
215
+ # var_c = var_b+var_a
216
+ #
217
+ # But when put it into its particular nest we end up with
218
+ #
219
+ # 5.times do |var_b|
220
+ # var_c = var_b+var_a
221
+ # end
222
+ # var_a = 6
223
+ #
224
+ # @param topsort Topoligical sort indicating an ordering dependencey
225
+ # @param new_statement The new statement that is yet to saved internally
226
+ # (because it hasn't been realised)
227
+ #
228
+ def apply_scope_dependencies(topsort,new_statement)
229
+
230
+ # Find each nest statement and then any statements contained within
231
+ each_used_nested_statement(topsort,new_statement) do |x|
232
+ # CONTIUE
233
+ end
234
+
235
+ end
236
+
237
+ # Yeilds each nested statement. Despite the naming convention a nested
238
+ # statement is really a nest statement. NOTE This is not every contained
239
+ # NestStatement but rather those used.
240
+ #
241
+ # TODO NestStatement would be a more reflective name - after all the statements
242
+ # within the statement are nested.
243
+ #
244
+ def each_used_nest_statement(topsort,new_statement)
245
+ topsort.each_key do |x|
246
+ found_statement = find_statement(x,new_statement)
247
+ yield found_statement if found_statement.kind_of?(BlockStatement)
248
+ end
249
+ end
250
+
251
+ # Yeilds each statement that is nested within the scope specified
252
+ #
253
+ # @param topsort The has containing each relevent statement id as well
254
+ # as there dependencies.
255
+ # @param statement The statement in the process of being added. It needs
256
+ # passed since is not yet saved within this class.
257
+ # @param scope_id The scope id of the nest statement that contains the
258
+ # nested statements.
259
+ #
260
+ def each_nested_statement(topsort,new_statement,scope_id)
261
+ topsort.each_key do |x|
262
+ found_statement = find_statement(x,new_statement)
263
+ # TODO I need to clarify the terms ,scope,scope_id and statement_level
264
+ # - I think one can at least go or at least have less confusing names.
265
+ if found_statement.statement_level == scope_id
266
+ yield found_statement
267
+ end
268
+ end
269
+ end
270
+
271
+ end
@@ -0,0 +1,157 @@
1
+ class StatementGroup < Array
2
+ attr_reader :scope, :scope_id, :statement_level
3
+ attr_writer :scope, :scope_id, :statement_level
4
+
5
+ # The scope id is used to determine what variables are available with the nested statement
6
+ @@scope_id = 0
7
+
8
+ alias :array_push :push
9
+
10
+ def initialize(*statements)
11
+ super()
12
+ statements.each {|x| self.push(x)}
13
+
14
+ # Update the scope id for the nested statement
15
+ @scope_id = @@scope_id
16
+ @@scope_id += 1
17
+
18
+ @scope = [@scope_id]
19
+
20
+ end
21
+
22
+ def cauldron_method_calls
23
+ return ['.statement_id']
24
+ end
25
+
26
+ def write(tab=0)
27
+ line = ''
28
+ self.each {|x| line += x.write(tab)+"\n" }
29
+ return line
30
+ end
31
+
32
+ def describe(tab=0)
33
+ line = ''
34
+ #self.each {|x| line += x.describe(tab)+"\n" }
35
+ self.each do |x|
36
+ line += x.describe(tab)+"\n"
37
+ end
38
+ return line
39
+ end
40
+
41
+ # Removes any statements that simple re-declare an existing statement
42
+ # e.g var_a = var_b.
43
+ #
44
+ def remove_simple
45
+ results = StatementGroup.new
46
+ self.each do |x|
47
+ results.push x unless x.is_simple?
48
+ end
49
+ return results
50
+ end
51
+
52
+ def push(*entries)
53
+ self.entries.each do |x|
54
+ x.scope = [@scope_id]
55
+ end
56
+ #super.array_push(*entries)
57
+ entries.each do |y|
58
+
59
+ # TODO Oddly super.array_push seems to add it twice - might investigate
60
+ #super.array_push(y)
61
+ array_push(y)
62
+ end
63
+ end
64
+
65
+ # TODO This method name doesn't suit what it returns
66
+ def statement_id
67
+ return @scope_id
68
+ end
69
+
70
+ # Returns a statement container (either a runtime method or a nested statement)
71
+ # thats scope is the statement level specified. This means that any statements
72
+ # with the statement level specified should reside directly in the statement
73
+ # container.
74
+ #
75
+ # @param statement_level The statement level the statement group should
76
+ # contain statements at.
77
+ #
78
+ def find_container_at_level(statement_level)
79
+ return self if scope_id == statement_level
80
+ self.each do |x|
81
+ if x.kind_of?(StatementGroup)
82
+ begin
83
+ return x.find_container_at_level(statement_level)
84
+ rescue FailedToFindStatementContainerError => e
85
+ next
86
+ end
87
+ #result = x.find_container_at_level(statement_level)
88
+ #return result unless result.nil?
89
+ end
90
+ end
91
+ raise FailedToFindStatementContainerError.new('Failed to find containing statement with id '+statement_level.to_s)
92
+ #return nil
93
+ #raise StandardEror.new('There is no container at level '+)
94
+ end
95
+
96
+ # Returns the statement thats id matches that supplied.
97
+ #
98
+ # @param id The id of the statement should exist in the runtime method
99
+ #
100
+ def find_statement(id)
101
+ self.each do |x|
102
+ begin
103
+ return x.find_statement(id)
104
+ rescue FailedToFindStatementError => e
105
+ next
106
+ end
107
+ end
108
+ raise FailedToFindStatementError.new('Couldn\'t find statement with id '+id.to_s)
109
+ end
110
+
111
+ # Returns an array of all the runtime method instances that are
112
+ # required for this statement group. This is essentially the
113
+ # runtime methods referenced in DefCalls.
114
+ #
115
+ def find_all_required_runtime_methods
116
+ results = []
117
+ self.each do |x|
118
+ results += x.find_all_required_runtime_methods
119
+ end
120
+ return results
121
+ end
122
+
123
+ def copy
124
+ result = self.class.new(*self.collect {|x| x.copy })
125
+ result.scope_id = scope_id
126
+ result.scope = scope
127
+ result.statement_level = statement_level
128
+ return result
129
+ end
130
+
131
+ # Identify any of the contained statements that override an
132
+ # existing variable.
133
+ #
134
+ # @param already_declared An array of previously declared variable ids in the
135
+ # following format. [{:variable_id=>43},{:variable_id=>12}, ..]
136
+ #
137
+ def identify_overriding_statements(already_declared=[])
138
+ self.each do |x|
139
+ x.identify_overriding_statements(already_declared)
140
+ end
141
+ end
142
+
143
+ # Returns an array of overriding statements that reside inside
144
+ # this statement group. A overriding statement is a statement that
145
+ # re-declares or modifies a previously declared variable.
146
+ #
147
+ # @param overriding_statements An array of statements that have been overriden
148
+ # within the statement group.
149
+ #
150
+ def find_overriding_statements(overriding_statements=[])
151
+ self.each do |x|
152
+ x.find_overriding_statements(overriding_statements)
153
+ end
154
+ return overriding_statements
155
+ end
156
+
157
+ end
@@ -0,0 +1,224 @@
1
+ # Move this class to the structure folder
2
+ #
3
+ # TODO This is more a StatementStructureFactory
4
+ class StatementStructure2 < Array
5
+
6
+ # attr_reader :declared_fixnum
7
+ #
8
+ # @@DECLARED_FIXNUM = 'declared_fixnum'
9
+ # DECLARE_STRING = 'declared_string'
10
+ # DECLARE_STRING_ADDITION = 'declared_string_addition'
11
+ TIMES_ON_FIXNUM = 'times_on_fixnum'
12
+
13
+ # TODO I don't think I really need to pass the parameters anymore
14
+ def initialize(name)
15
+ # TODO What are the two parameters an array expects
16
+ super()
17
+
18
+ @structure_name = name
19
+
20
+ # Add the parameters to the array
21
+ structure().each do |code|
22
+ self.push(code)
23
+ end
24
+ end
25
+
26
+ # var = 'test'+'ing'
27
+ def StatementStructure2.declared_string_addition
28
+ return 'declared_string_addition'
29
+ end
30
+
31
+ def StatementStructure2.times_on_fixnum
32
+ return 'times_on_fixnum'
33
+ end
34
+
35
+ def StatementStructure2.declared_array
36
+ return 'declared_array'
37
+ end
38
+
39
+ def StatementStructure2.declared_runtime_method
40
+ return 'declared_runtime_method'
41
+ end
42
+
43
+ # var = 5+8
44
+ def StatementStructure2.declared_fixnum_addition
45
+ return 'declared_fixnum_addition'
46
+ end
47
+
48
+ def StatementStructure2.declared_statement
49
+ return 'declared_statement'
50
+ end
51
+
52
+ def structure
53
+ case @structure_name
54
+ # when StatementStructure2.declared_fixnum
55
+ # return [Unknown,Equal,FixnumVariable]
56
+ # when StatementStructure2.declared_string
57
+ # return [Unknown,Equal,StringVariable]
58
+ when StatementStructure2.declared_array
59
+ return [Unknown,Equal,ArrayVariable]
60
+ when StatementStructure2.declared_runtime_method
61
+ return DeclareRuntimeMethodStructure.new()
62
+ when StatementStructure2.declared_string_addition
63
+ return [Unknown,Equal,StringVariable,Addition,StringVariable]
64
+ when StatementStructure2.declared_fixnum_addition
65
+ return FixnumAdditionStructure.new()
66
+ when StatementStructure2.declared_statement
67
+ return DeclareStatementStructure.new()
68
+ else
69
+ raise StandardError.new('Unknown statement structure "'+@structure_name+'"')
70
+ end
71
+ end
72
+
73
+ # Returns an array of possible statements that can be
74
+ # created to follow the structure of the statement.
75
+ #
76
+ # Any method calls are considered as their returned value. So
77
+ # a method that returns a string is just considered as a
78
+ # RuntimeVariable with a string class requirement.
79
+ #
80
+ def statements(available=[])
81
+
82
+ # Retrieve the statements for
83
+ if(@structure_name==StatementStructure2.times_on_fixnum)
84
+ return fixnum_times_statements(available)
85
+ end
86
+
87
+ # Create an array of statements that gets extended
88
+ partial_statements = [Statement.new]
89
+
90
+ # Go through each element of the statement structure
91
+ self.each do |statement_element|
92
+
93
+ # Creates an array of updated statements
94
+ updated_statements = []
95
+
96
+ # If it is an unknown variable just add it
97
+ if(statement_element == Unknown)
98
+ partial_statements = add_unknown_variable(partial_statements)
99
+ next
100
+ end
101
+
102
+ # Just include it if it's a = sign
103
+ if(statement_element == Equal)or(statement_element == Addition)
104
+
105
+ # Go through each element in the partial statements and add a copy of the new element
106
+ partial_statements.each do |partial|
107
+ copied_statement = partial.copy
108
+ copied_statement.push(statement_element.new)
109
+ updated_statements.push copied_statement
110
+ end
111
+ partial_statements = updated_statements
112
+ next
113
+ end
114
+
115
+ # Go through each of the available elements and see if they meet the statement elements
116
+ available.each do |avail|
117
+
118
+ # If any of the values match - include them in the statement
119
+ if avail.kind_of?(statement_element)
120
+
121
+ # Go through each element in the partial statements and add a copy of the new element
122
+ partial_statements.each do |partial|
123
+ copied_statement = partial.copy
124
+ copied_statement.push(avail.copy)
125
+ updated_statements.push copied_statement
126
+ end
127
+
128
+ end
129
+
130
+ # Now see what instance calls are available to the passed avail
131
+ if avail.kind_of?(Variable)
132
+
133
+ # Retrieve any instance calls available for that variable
134
+ # TODO Availabe should not include the variable with the same id
135
+ instance_calls = avail.instance_calls(available)
136
+ instance_calls.each do |x|
137
+
138
+ if x.response.class == statement_element
139
+
140
+ partial_statements.each do |partial|
141
+ copied_statement = partial.copy
142
+ copied_statement.push(x.copy)
143
+ updated_statements.push copied_statement
144
+ end
145
+
146
+ end
147
+ end
148
+
149
+ end
150
+
151
+ # If it is a definition call then check against the response value
152
+ if avail.kind_of?(DefCall)
153
+ if avail.response.class == statement_element
154
+ partial_statements.each do |y|
155
+ copied_statement = y.copy
156
+ copied_statement.push(avail.copy)
157
+ updated_statements.push copied_statement
158
+ end
159
+ end
160
+ end
161
+
162
+ end
163
+
164
+ partial_statements = updated_statements
165
+
166
+ end
167
+
168
+ # # Save the structure used to create the statement - this structure type will
169
+ # # become deprecated soom.
170
+ # partial_statements.each do |x|
171
+ # x.structure = self.class
172
+ # end
173
+
174
+ return partial_statements
175
+
176
+ end
177
+
178
+ # Returns a general description of the statement to
179
+ # indicate whether it declares a new variable or
180
+ # modifies an existing variable or nothing.
181
+ #
182
+ def self.statement_type
183
+ #raise StandardError.new('This method should be overridden "'+self.to_s+'"')
184
+ StandardLogger.instance.warning('This method should be used')
185
+ #return StatementStructure.DECLARATION_STATEMENT
186
+ return 'declaration_statement'
187
+ end
188
+
189
+ protected
190
+
191
+ # TODO Write tests
192
+ # Adds a unknown variable to each statement in the supplied
193
+ # array and returns the result.
194
+ #
195
+ def add_unknown_variable(current_statements)
196
+ results = []
197
+ current_statements.each do |x|
198
+ copied = x.copy
199
+ copied.push(Unknown.new)
200
+ results.push copied
201
+ end
202
+ return results
203
+ end
204
+
205
+ # Get the possible .times statements from the available
206
+ # fixnum variables
207
+ #
208
+ def fixnum_times_statements(available=[])
209
+
210
+ # If there aren't any fixnum variables there is nothing to return
211
+ return [] unless available.any? {|x| x.kind_of?(FixnumVariable)}
212
+
213
+ # Use each of the fixnum variables
214
+ results = []
215
+ available.find_all {|x| x.kind_of?(FixnumVariable) }.each do |y|
216
+ new_statement = BlockStatement.new(Statement.new(InstanceCallContainer.new(y.copy,Times.new)),BlockContainer.new(BlockVariable.new))
217
+ new_statement.structure = self.class
218
+ results.push(new_statement)
219
+ end
220
+
221
+ return results
222
+ end
223
+
224
+ end