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,299 @@
1
+ # Allows string to be converted into object code.
2
+ #
3
+ # Currently it can only generate objects as complex as statements, so it can't
4
+ # generate whole runtime methods or populated nested statements.
5
+ #
6
+ # http://rubydoc.info/gems/ruby_parser/2.0.5/frames
7
+ #
8
+ # http://www.rubyinside.com/treetop-powerful-but-easy-ruby-parser-library-701.html
9
+ # http://en.wikipedia.org/wiki/Yacc
10
+ # http://thingsaaronmade.com/blog/writing-an-s-expression-parser-in-ruby.html
11
+ #
12
+ # use StringScanner
13
+ #
14
+ # Ruby2Ruby 'ruby code' -> s-expression -> 'ruby code'
15
+ #
16
+ # 'test'
17
+ # s(:str, "test")
18
+ #
19
+ # var8
20
+ # s(:call, nil, :var8, s(:arglist))
21
+ #
22
+ # var8.length
23
+ # s(:call, s(:call, nil, :var8, s(:arglist)), :length, s(:arglist))
24
+ #
25
+ # 'new vegas'.length
26
+ # s(:call, s(:str, "new vegas"), :length, s(:arglist))
27
+ #
28
+ # runtime_method.params
29
+ # s(:call, s(:call, nil, :runtime_method, s(:arglist)), :params, s(:arglist))
30
+ #
31
+ # var_6[8]
32
+ # s(:call, s(:call, nil, :var_6, s(:arglist)), :[], s(:arglist, s(:lit, 8)))
33
+ #
34
+ # 'runtime_method.all_pass?(test_cases)'
35
+ # s(:call, s(:call, nil, :runtime_method, s(:arglist)), :all_pass?, s(:arglist, s(:call, nil, :test_cases, s(:arglist))))
36
+ #
37
+ # 'var_1 = var_2 + var_3'
38
+ # s(:lasgn, :var1, s(:call, s(:call, nil, :var2, s(:arglist)), :+, s(:arglist, s(:call, nil, :var3, s(:arglist)))))
39
+ #
40
+ # var_2 = var_5.chop + var_2
41
+ # s(:lasgn, :var2, s(:call, s(:call, s(:call, nil, :var5, s(:arglist)), :chop, s(:arglist)), :+, s(:arglist, s(:lvar, :var2))))
42
+ # TODO I need to move away from my instance call structure and more towards this -
43
+ # this + contains the arg ment so it just goes deeper down the stack.
44
+ #
45
+ # var1 != var2
46
+ # s(:not, s(:call, s(:call, nil, :var1, s(:arglist)), :==, s(:arglist, s(:call, nil, :var2, s(:arglist)))))
47
+ #
48
+ #
49
+ class Parser
50
+
51
+ def self.run(code)
52
+ parser = RubyParser.new
53
+ #ruby2ruby = Ruby2Ruby.new
54
+ sexp = parser.process(code)
55
+
56
+ return parse_token(sexp,true,0)
57
+ end
58
+
59
+ def self.parse_token(sexp,affirmative=true,depth=0)
60
+ unless sexp.kind_of?(Sexp)
61
+ return parse_simple_token(sexp)
62
+ end
63
+
64
+ # Generate any single literals
65
+ if sexp[0] == :lit || sexp[0] == :str
66
+ return Literal.new(sexp[1])
67
+ end
68
+
69
+ if sexp[0] == :call
70
+ if sexp[1].kind_of?(Sexp)
71
+ if sexp[2] == :[]
72
+ # TODO This doesn't identity hash containers - I don't know if that matters
73
+ #return ArrayAccess.new(parse_token(sexp[1]),self.parse_token(sexp[3]).pop)
74
+ return ArrayAccess.new(parse_token(sexp[1]),*self.parse_token(sexp[3]))
75
+ elsif sexp[2] == :==
76
+ # TODO This should be a Statement - and TheoryStatemetn StringToTheory
77
+
78
+ # Only have one statement per level
79
+ if depth > 0
80
+ #c = Container.new(*(1...sexp.length).collect {|x| parse_token(sexp[x],true,depth+1)})
81
+ c = Container.new(parse_token(sexp[1],true,depth+1),parse_token(sexp[2],true,depth+1),*parse_token(sexp[3],true,depth+1))
82
+ return c
83
+ else
84
+ return TheoryStatement.new(
85
+ parse_token(sexp[1],true,depth+1),self.identify_method(sexp[2],affirmative),*parse_token(sexp[3])
86
+ )
87
+ end
88
+ else
89
+
90
+ if parse_token(sexp[1]).kind_of?(ClassName)
91
+ return ClassMethodCallContainer.new(parse_token(sexp[1]),self.identify_method(sexp[2],affirmative),*parse_token(sexp[3]))
92
+ else
93
+ return InstanceCallContainer.new(
94
+ parse_token(sexp[1]),
95
+ self.identify_method(sexp[2],affirmative),
96
+ *parse_token(sexp[3])
97
+ )
98
+ end
99
+
100
+ end
101
+ else
102
+ return self.parse_custom_token(sexp)
103
+ end
104
+ end
105
+
106
+ if sexp[0] == :arglist
107
+ if sexp[1].nil?
108
+ return []
109
+ end
110
+ return (1...sexp.length).collect {|x| parse_token(sexp[x])}
111
+ end
112
+
113
+ # Catch if it is a statement
114
+ if sexp[0] == :lasgn
115
+ return parse_lasgn(sexp)
116
+ end
117
+ if sexp[0] == :return
118
+ return self.parse_return(sexp)
119
+ end
120
+
121
+ if sexp[0] == :if
122
+ # TODO Look into the change in the nil position
123
+ #
124
+ # "if(var2 == var3)\nreturn true\nend"
125
+ # s(:if, s(:call, s(:call, nil, :var2, s(:arglist)), :==, s(:arglist, s(:call, nil, :var3, s(:arglist)))), s(:return, s(:true)), nil)
126
+ #
127
+ # "if(var2 != var3)\nreturn true\nend"
128
+ # s(:if, s(:call, s(:call, nil, :var2, s(:arglist)), :==, s(:arglist, s(:call, nil, :var3, s(:arglist)))), nil, s(:return, s(:true)))
129
+ #
130
+ internal_statements = (2...sexp.length).inject([]) do |total,x|
131
+ total << sexp[x] unless sexp[x].nil?
132
+ total
133
+ end
134
+ return OpenStatement.new(
135
+ IfContainer.new(
136
+ parse_token(sexp[1])
137
+ ),
138
+ *internal_statements.collect {|x| parse_token(x)}
139
+ )
140
+
141
+ end
142
+
143
+ if sexp[0] == :attrasgn
144
+ return parse_attrasgn(sexp)
145
+ end
146
+
147
+ if sexp[0] == :true
148
+ return True.new
149
+ end
150
+
151
+ if sexp[0] == :false
152
+ return False.new
153
+ end
154
+
155
+ if sexp[0] == :next
156
+ return Next.new
157
+ end
158
+
159
+ if sexp[0] == :const
160
+ return parse_const(sexp[1])
161
+ end
162
+
163
+ if sexp[0] == :lvar
164
+ return parse_simple_token(sexp[1])
165
+ end
166
+
167
+ if sexp[0] == :not
168
+ return parse_token(sexp[1],false)
169
+ end
170
+
171
+ # NOTE: This relates to blocks
172
+ # var1.any? { |x| x.include? var2.id } => [ [1] => :call, [2] => :lasgn, [3] => :call ]
173
+ # var1.any? do |x| var2 = var1.chop end => [ [1] => :call, [2] => :lasgn, [3] => :lasgn ]
174
+ if sexp[0] == :iter
175
+ if depth > 0
176
+ return Container.new(parse_iter(sexp))
177
+ else
178
+ return parse_iter(sexp)
179
+ end
180
+ end
181
+
182
+ raise StandardError.new("Could not find sexp '#{sexp[0].to_s}'")
183
+ end
184
+
185
+ def self.parse_simple_token(token)
186
+ if token.to_s.match(/^var(\d+)$/)
187
+ id = token.to_s.match(/^var(\d+)$/)[1].to_i
188
+ return Unknown.new(id)
189
+ end
190
+ return Equal.new if token == '='
191
+ return Return.new if token == :return
192
+ return LengthEqual.new if token == :length=
193
+ raise StandardError.new("Could not identify simple token '#{token.to_s}':#{token.class.to_s}")
194
+ end
195
+
196
+ def self.parse_iter(sexp)
197
+ # TODO Only supports one BlockVariable
198
+
199
+ # TODO Not sure this is the best way to detmine whether to use "do end" or "{}"
200
+ if sexp.length == 4
201
+ s= SingleLineBlockStatement.new(
202
+ parse_token(sexp[1]),
203
+ BlockContainer.new(parse_simple_token(sexp[2][1])),
204
+ *(3...sexp.length).collect {|x| parse_token(sexp[x])}
205
+ )
206
+ return s
207
+ else
208
+ return BlockStatement.new(
209
+ parse_token(sexp[1]),
210
+ BlockContainer.new(parse_simple_token(sexp[2][1])),
211
+ *(3...sexp.length).collect {|x| parse_token(sexp[x])}
212
+ )
213
+ end
214
+ end
215
+
216
+ def self.parse_const(token)
217
+ constants = {'Statement'=>'StatementClass','Return'=>'ReturnClass'}
218
+ raise StandardError.new('Unkown constant '+token.to_s) unless constants.has_key?(token.to_s)
219
+ eval(constants[token.to_s]+'.new')
220
+ end
221
+
222
+ def self.parse_lasgn(sexp)
223
+ return TheoryStatement.new(
224
+ *[sexp[1],'=',sexp[2]].collect {|x| parse_token(x)}
225
+ )
226
+ end
227
+
228
+ def self.parse_return(sexp)
229
+ return Statement.new(
230
+ *[sexp[0],sexp[1]].collect {|x| parse_token(x)}
231
+ )
232
+ end
233
+
234
+ def self.parse_attrasgn(sexp)
235
+
236
+ # TODO Make a note of this change - the equal(=) is with the method call here
237
+ return Statement.new(
238
+ InstanceCallContainer.new(
239
+ parse_token(sexp[1]),
240
+ parse_token(sexp[2])
241
+ ),
242
+ *parse_token(sexp[3])
243
+ )
244
+
245
+ end
246
+
247
+ def self.parse_custom_token(sexp)
248
+ if sexp[2].to_s.match(/^var(\d+)$/)
249
+ id = sexp[2].to_s.match(/^var(\d+)$/)[1].to_i
250
+ return Unknown.new {{:variable_id=>id}}
251
+ elsif sexp[2].to_s.match(/^var_(\d+)$/)
252
+ id = sexp[2].to_s.match(/^var_(\d+)$/)[1].to_i
253
+ return Unknown.new {{:variable_id=>id}}
254
+ elsif sexp[2].to_s.match(/^runtime_method$/)
255
+ return IntrinsicRuntimeMethod.new
256
+ elsif sexp[2].to_s.match(/^test_cases$/)
257
+ return IntrinsicTestCases.new
258
+ elsif sexp[2].to_s.match(/^last_runtime_method$/)
259
+ return IntrinsicLastRuntimeMethod.new
260
+ else
261
+ raise StandardError.new('Could not match '+sexp[2].to_s)
262
+ end
263
+ end
264
+
265
+ def self.identify_method(method_name,affirmative=true)
266
+ method_calls = {
267
+ 'length'=>'StringLength',
268
+ 'params'=>'Params',
269
+ 'value'=> 'Value',
270
+ 'all_pass?'=>'AllPass',
271
+ 'pass?'=>'Pass',
272
+ 'push'=>'Push',
273
+ '+'=>'Addition',
274
+ '==' => 'Equivalent',
275
+ 'chop' => 'Chop',
276
+ 'realise2' => 'Realise',
277
+ 'new' => 'New',
278
+ 'run' => 'Run',
279
+ 'kind_of?' => 'KindOf',
280
+ 'history' => 'HistoryCall',
281
+ 'history2' => 'History2Call',
282
+ 'any?' => 'Any',
283
+ 'include?' => 'Include',
284
+ 'statement_id' => 'StatementID',
285
+ 'last' => 'Last',
286
+ 'select' => 'Select',
287
+ '-' => 'Subtract'
288
+ }
289
+ # TODO Need to re-structure code to better suit the parser and how it handles != statements
290
+ if not affirmative
291
+ method_calls = {
292
+ '==' => 'NotEqual',
293
+ }
294
+ end
295
+ raise StandardError.new('Unkown method call "'+method_name.to_s+'"') unless method_calls.has_key?(method_name.to_s)
296
+ eval(method_calls[method_name.to_s]+'.new')
297
+ end
298
+
299
+ end
@@ -0,0 +1,42 @@
1
+ class StatementCheck
2
+
3
+ # This writes and evalutes the syntax of a statement to
4
+ # determine whether it can be used by it self.
5
+ #
6
+ # So something like var1 = var0.chop would fail since
7
+ # var0 doesn't exist. It needs to write to a different
8
+ # class to avoid the situation where the statement
9
+ # 'return false' would perceived as invalid syntax.
10
+ #
11
+ def valid_syntax?(statement)
12
+
13
+ # Create file to include the test method
14
+ filepath = $LOC+File.join(['tmp','runtime_statement_check.rb'])
15
+ file = File.open(filepath,'w+')
16
+
17
+ # Include the sytax for the statement in the file
18
+ file << 'class RuntimeStatementCheck'+"\n"
19
+ file << "\t"+'def check'+"\n"
20
+ file << "\t\t"+statement+"\n"
21
+ file << "\t"+'end'+"\n"
22
+ file << 'end'
23
+ file.close
24
+
25
+ # Load the newly created class and check the statement
26
+ begin
27
+ load filepath
28
+ RuntimeStatementCheck.new.check
29
+ rescue NameError => e
30
+ return false
31
+ rescue StandardError => e
32
+ StandardLogger.log e
33
+ return false
34
+ rescue SyntaxError => e
35
+ StandardLogger.log e
36
+ return false
37
+ end
38
+ return true
39
+
40
+ end
41
+
42
+ end
@@ -0,0 +1,119 @@
1
+ #
2
+ # var6 = 8
3
+ # s(:lasgn, :var6, s(:lit, 8))
4
+ #
5
+ # var6.length = 8
6
+ # s(:attrasgn, s(:call, nil, :var6, s(:arglist)), :length=, s(:arglist, s(:lit, 8)))
7
+ #
8
+ # return var8
9
+ # s(:return, s(:call, nil, :var8, s(:arglist)))
10
+ #
11
+ # var6[7]
12
+ # s(:call, s(:call, nil, :var6, s(:arglist)), :[], s(:arglist, s(:lit, 7)))
13
+ #
14
+ # var1.length = var2.length
15
+ # s(:attrasgn, s(:call, nil, :var1, s(:arglist)), :length=, s(:arglist, s(:call, s(:call, nil, :var2, s(:arglist)), :length, s(:arglist))))
16
+ #
17
+ # var6 == 7
18
+ # s(:call, s(:call, nil, :var6, s(:arglist)), :==, s(:arglist, s(:lit, 7)))
19
+ #
20
+ # if(var6 == 7)
21
+ # end
22
+ # s(:if, s(:call, s(:call, nil, :var6, s(:arglist)), :==, s(:arglist, s(:lit, 7))), nil, nil)
23
+ #
24
+ # Statement.new(Return.new,var1.params[0])
25
+ # s(:call, s(:const, :Statement), :new, s(:arglist, s(:call, s(:const, :Return), :new, s(:arglist)), s(:call, s(:call, s(:call, nil, :var1, s(:arglist)), :params, s(:arglist)), :[], s(:arglist, s(:lit, 0)))))
26
+ #
27
+ # var1.any? { |x| x.include? var2.id }
28
+ # s(:iter, s(:call, s(:call, nil, :var1, s(:arglist)), :any?, s(:arglist)), s(:lasgn, :x), s(:call, s(:lvar, :x), :include?, s(:arglist, s(:call, s(:call, nil, :var2, s(:arglist)), :id, s(:arglist)))))
29
+ #
30
+ # var1.any? do |x|
31
+ # var2 = var1.chop
32
+ # end
33
+ # s(:iter, s(:call, s(:call, nil, :var1, s(:arglist)), :any?, s(:arglist)), s(:lasgn, :x), s(:lasgn, :var2, s(:call, s(:call, nil, :var1, s(:arglist)), :chop, s(:arglist))))
34
+ #
35
+ class StringToTheory < Parser
36
+
37
+ # Converts a string into a theory statement.
38
+ #
39
+ # e.g. "var8 = 7" -> TheoryStatement.new(...)
40
+ #
41
+ def self.run(statement_string)
42
+ statement_string.gsub!(/<runtime_method>/,'runtime_method')
43
+ return super(statement_string)
44
+
45
+ end
46
+
47
+ # TODO This method is very similar to the Parser
48
+ def self.parse_simple_token(token)
49
+ if token.to_s.match(/^var(\d+)$/)
50
+ id = token.to_s.match(/^var(\d+)$/)[1].to_i
51
+ return TheoryVariable.new(id)
52
+ end
53
+ if token.to_s.match(/^[x|y|z]$/) then return BlockToken.new(token.to_s) end
54
+ return Equal.new if token == '='
55
+ return Return.new if token == :return
56
+ return LengthEqual.new if token == :length=
57
+ return Equivalent.new if token == :==
58
+ raise StandardError.new("Could not identify simple token '#{token.to_s}'")
59
+ end
60
+
61
+ def self.parse_const(token)
62
+ constants = {
63
+ 'Statement'=>'StatementClass',
64
+ 'IfStatement'=>'IfStatementClass',
65
+ 'Return'=>'ReturnClass',
66
+ 'InstanceCallContainer'=>'InstanceCallContainerClass',
67
+ 'StringLength'=>'StringLengthClass',
68
+ 'Parser'=>'ParserClass',
69
+ 'Unknown'=>'UnknownClass',
70
+ 'Addition'=>'AdditionClass',
71
+ 'Equal'=>'EqualClass',
72
+ 'RuntimeMethod'=>'RuntimeMethodClass',
73
+ 'CTestCase'=>'CTestCaseClass',
74
+ 'Fixnum'=>'FixnumClass',
75
+ 'Equivalent'=>'EquivalentClass',
76
+ 'OpenStatement'=>'OpenStatementClass',
77
+ 'IfContainer'=>'IfContainerClass',
78
+ 'BlockStatement'=> 'BlockStatementClass',
79
+ 'Container'=> 'ContainerClass',
80
+ 'Subtract'=> 'SubtractClass',
81
+ 'Times'=> 'TimesClass',
82
+ 'Chop'=> 'ChopClass'
83
+ }
84
+ raise StandardError.new('Unkown constant '+token.to_s) unless constants.has_key?(token.to_s)
85
+ eval(constants[token.to_s]+'.new')
86
+ end
87
+
88
+ def self.parse_custom_token(sexp)
89
+ if sexp[2].to_s.match(/^var(\d+)$/)
90
+ id = sexp[2].to_s.match(/^var(\d+)$/)[1].to_i
91
+ return TheoryVariable.new(id)
92
+ elsif sexp[2].to_s.match(/^runtime_method$/)
93
+ return IntrinsicRuntimeMethod.new
94
+ elsif sexp[2].to_s.match(/^test_cases$/)
95
+ return IntrinsicTestCases.new
96
+ else
97
+ raise StandardError.new('Could not match '+sexp[2].to_s)
98
+ end
99
+ end
100
+
101
+ def self.parse_return(sexp)
102
+ return TheoryStatement.new(
103
+ *[sexp[0],sexp[1]].collect {|x| parse_token(x)}
104
+ )
105
+ end
106
+
107
+ def self.parse_attrasgn(sexp)
108
+ # TODO Make a note of this change - the equal(=) is with the method call here
109
+ return TheoryStatement.new(
110
+ InstanceCallContainer.new(
111
+ parse_token(sexp[1]),
112
+ parse_token(sexp[2])
113
+ ),
114
+ *parse_token(sexp[3])
115
+ )
116
+
117
+ end
118
+
119
+ end