taskjuggler 0.0.6 → 0.0.7

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 (545) hide show
  1. data/CHANGELOG +160 -0
  2. data/benchmarks/UTF-8-Strings.rb +58 -0
  3. data/data/css/tjreport.css +7 -2
  4. data/doc/AppConfig.html +10 -4
  5. data/doc/Arguments.html +10 -4
  6. data/doc/CHANGELOG.html +171 -5
  7. data/doc/COPYING.html +10 -4
  8. data/doc/Object.html +11 -107
  9. data/doc/README.html +10 -4
  10. data/doc/RuntimeConfig.html +10 -4
  11. data/doc/String.html +16 -11
  12. data/doc/StringIO.html +10 -4
  13. data/doc/TaskJuggler.html +506 -435
  14. data/doc/TaskJuggler/Account.html +10 -4
  15. data/doc/TaskJuggler/AccountAttribute.html +10 -4
  16. data/doc/TaskJuggler/AccountScenario.html +10 -4
  17. data/doc/TaskJuggler/Allocation.html +69 -60
  18. data/doc/TaskJuggler/AllocationAttribute.html +10 -4
  19. data/doc/TaskJuggler/AttributeBase.html +10 -4
  20. data/doc/TaskJuggler/AttributeDefinition.html +10 -4
  21. data/doc/TaskJuggler/BatchProcessor.html +202 -192
  22. data/doc/TaskJuggler/Booking.html +10 -4
  23. data/doc/TaskJuggler/BookingListAttribute.html +10 -4
  24. data/doc/TaskJuggler/BooleanAttribute.html +10 -4
  25. data/doc/TaskJuggler/CSVFile.html +10 -4
  26. data/doc/TaskJuggler/CellSettingPattern.html +10 -4
  27. data/doc/TaskJuggler/CellSettingPatternList.html +10 -4
  28. data/doc/TaskJuggler/Charge.html +10 -4
  29. data/doc/TaskJuggler/ChargeListAttribute.html +10 -4
  30. data/doc/TaskJuggler/ChargeSet.html +10 -4
  31. data/doc/TaskJuggler/ChargeSetListAttribute.html +10 -4
  32. data/doc/TaskJuggler/ColumnListAttribute.html +10 -4
  33. data/doc/TaskJuggler/ColumnTable.html +10 -4
  34. data/doc/TaskJuggler/Daemon.html +71 -52
  35. data/doc/TaskJuggler/DateAttribute.html +10 -4
  36. data/doc/TaskJuggler/DefinitionListAttribute.html +10 -4
  37. data/doc/TaskJuggler/DependencyListAttribute.html +10 -4
  38. data/doc/TaskJuggler/DurationAttribute.html +10 -4
  39. data/doc/TaskJuggler/{MacroParser.html → FileList.html} +58 -173
  40. data/doc/TaskJuggler/{RichTextException.html → FileRecord.html} +59 -80
  41. data/doc/TaskJuggler/FixnumAttribute.html +10 -4
  42. data/doc/TaskJuggler/FlagListAttribute.html +10 -4
  43. data/doc/TaskJuggler/FloatAttribute.html +10 -4
  44. data/doc/TaskJuggler/FormatListAttribute.html +10 -4
  45. data/doc/TaskJuggler/GanttChart.html +10 -4
  46. data/doc/TaskJuggler/GanttContainer.html +14 -8
  47. data/doc/TaskJuggler/GanttHeader.html +10 -4
  48. data/doc/TaskJuggler/GanttHeaderScaleItem.html +10 -4
  49. data/doc/TaskJuggler/GanttLine.html +29 -24
  50. data/doc/TaskJuggler/GanttLoadStack.html +10 -4
  51. data/doc/TaskJuggler/GanttMilestone.html +10 -4
  52. data/doc/TaskJuggler/GanttRouter.html +10 -4
  53. data/doc/TaskJuggler/GanttTaskBar.html +20 -10
  54. data/doc/TaskJuggler/HTMLDocument.html +10 -4
  55. data/doc/TaskJuggler/HTMLGraphics.html +10 -4
  56. data/doc/TaskJuggler/Interval.html +10 -4
  57. data/doc/TaskJuggler/IntervalListAttribute.html +10 -4
  58. data/doc/TaskJuggler/JobInfo.html +10 -4
  59. data/doc/TaskJuggler/Journal.html +227 -160
  60. data/doc/TaskJuggler/JournalEntry.html +10 -4
  61. data/doc/TaskJuggler/JournalEntryList.html +158 -72
  62. data/doc/TaskJuggler/KeywordArray.html +21 -9
  63. data/doc/TaskJuggler/KeywordDocumentation.html +612 -475
  64. data/doc/TaskJuggler/Limits.html +13 -8
  65. data/doc/TaskJuggler/Limits/Limit.html +10 -4
  66. data/doc/TaskJuggler/LimitsAttribute.html +10 -4
  67. data/doc/TaskJuggler/ListAttributeBase.html +10 -4
  68. data/doc/TaskJuggler/Log.html +10 -4
  69. data/doc/TaskJuggler/LogFile.html +10 -4
  70. data/doc/TaskJuggler/LogicalAttribute.html +10 -4
  71. data/doc/TaskJuggler/LogicalExpression.html +11 -5
  72. data/doc/TaskJuggler/LogicalExpressionAttribute.html +10 -4
  73. data/doc/TaskJuggler/LogicalFlag.html +10 -4
  74. data/doc/TaskJuggler/LogicalFunction.html +132 -124
  75. data/doc/TaskJuggler/LogicalOperation.html +10 -4
  76. data/doc/TaskJuggler/Macro.html +16 -10
  77. data/doc/TaskJuggler/MacroTable.html +44 -38
  78. data/doc/TaskJuggler/ManagerResponsibilities.html +10 -4
  79. data/doc/TaskJuggler/ManagerStatusRecord.html +10 -4
  80. data/doc/TaskJuggler/Message.html +92 -68
  81. data/doc/TaskJuggler/MessageHandler.html +349 -28
  82. data/doc/TaskJuggler/Navigator.html +10 -4
  83. data/doc/TaskJuggler/NavigatorElement.html +10 -4
  84. data/doc/TaskJuggler/NikuProject.html +10 -4
  85. data/doc/TaskJuggler/NikuReport.html +10 -4
  86. data/doc/TaskJuggler/NikuResource.html +10 -4
  87. data/doc/TaskJuggler/NodeListAttribute.html +10 -4
  88. data/doc/TaskJuggler/OnShiftCache.html +10 -4
  89. data/doc/TaskJuggler/ProcessIntercom.html +118 -111
  90. data/doc/TaskJuggler/ProcessIntercomIface.html +75 -22
  91. data/doc/TaskJuggler/Project.html +886 -913
  92. data/doc/TaskJuggler/ProjectBroker.html +442 -331
  93. data/doc/TaskJuggler/ProjectBrokerIface.html +95 -38
  94. data/doc/TaskJuggler/ProjectFileParser.html +320 -317
  95. data/doc/TaskJuggler/ProjectFileScanner.html +336 -339
  96. data/doc/TaskJuggler/ProjectRecord.html +119 -56
  97. data/doc/TaskJuggler/ProjectServer.html +282 -237
  98. data/doc/TaskJuggler/ProjectServerIface.html +45 -39
  99. data/doc/TaskJuggler/PropertyAttribute.html +10 -4
  100. data/doc/TaskJuggler/PropertyList.html +177 -173
  101. data/doc/TaskJuggler/PropertySet.html +11 -5
  102. data/doc/TaskJuggler/PropertyTreeNode.html +194 -191
  103. data/doc/TaskJuggler/Query.html +280 -256
  104. data/doc/TaskJuggler/RTFHandlers.html +10 -4
  105. data/doc/TaskJuggler/RTFNavigator.html +33 -26
  106. data/doc/TaskJuggler/RTFQuery.html +135 -169
  107. data/doc/TaskJuggler/RTFReport.html +63 -56
  108. data/doc/TaskJuggler/RTFReportLink.html +58 -47
  109. data/doc/TaskJuggler/RTFWithQuerySupport.html +666 -0
  110. data/doc/TaskJuggler/RealFormat.html +10 -4
  111. data/doc/TaskJuggler/RealFormatAttribute.html +10 -4
  112. data/doc/TaskJuggler/ReferenceAttribute.html +10 -4
  113. data/doc/TaskJuggler/Report.html +333 -290
  114. data/doc/TaskJuggler/ReportBase.html +182 -174
  115. data/doc/TaskJuggler/ReportContext.html +10 -4
  116. data/doc/TaskJuggler/ReportServer.html +144 -126
  117. data/doc/TaskJuggler/ReportServerIface.html +50 -44
  118. data/doc/TaskJuggler/ReportServerRecord.html +38 -32
  119. data/doc/TaskJuggler/ReportServlet.html +144 -137
  120. data/doc/TaskJuggler/ReportTable.html +10 -4
  121. data/doc/TaskJuggler/ReportTableCell.html +169 -164
  122. data/doc/TaskJuggler/ReportTableColumn.html +10 -4
  123. data/doc/TaskJuggler/ReportTableLegend.html +10 -4
  124. data/doc/TaskJuggler/ReportTableLine.html +10 -4
  125. data/doc/TaskJuggler/Resource.html +121 -115
  126. data/doc/TaskJuggler/ResourceListAttribute.html +10 -4
  127. data/doc/TaskJuggler/ResourceListRE.html +10 -4
  128. data/doc/TaskJuggler/ResourceScenario.html +13 -7
  129. data/doc/TaskJuggler/RichText.html +61 -37
  130. data/doc/TaskJuggler/RichTextAttribute.html +10 -4
  131. data/doc/TaskJuggler/RichTextDocument.html +91 -81
  132. data/doc/TaskJuggler/RichTextElement.html +378 -317
  133. data/doc/TaskJuggler/RichTextFunctionExample.html +10 -4
  134. data/doc/TaskJuggler/RichTextFunctionHandler.html +16 -11
  135. data/doc/TaskJuggler/RichTextImage.html +10 -4
  136. data/doc/TaskJuggler/RichTextIntermediate.html +138 -70
  137. data/doc/TaskJuggler/RichTextParser.html +48 -40
  138. data/doc/TaskJuggler/RichTextScanner.html +328 -906
  139. data/doc/TaskJuggler/RichTextSnip.html +59 -57
  140. data/doc/TaskJuggler/RichTextSyntaxRules.html +458 -369
  141. data/doc/TaskJuggler/Scenario.html +10 -4
  142. data/doc/TaskJuggler/ScenarioData.html +33 -30
  143. data/doc/TaskJuggler/ScenarioListAttribute.html +10 -4
  144. data/doc/TaskJuggler/Scoreboard.html +10 -4
  145. data/doc/TaskJuggler/SheetHandlerBase.html +315 -191
  146. data/doc/TaskJuggler/SheetReceiver.html +334 -313
  147. data/doc/TaskJuggler/SheetSender.html +10 -4
  148. data/doc/TaskJuggler/Shift.html +10 -4
  149. data/doc/TaskJuggler/ShiftAssignment.html +10 -4
  150. data/doc/TaskJuggler/ShiftAssignments.html +10 -4
  151. data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +10 -4
  152. data/doc/TaskJuggler/ShiftScenario.html +10 -4
  153. data/doc/TaskJuggler/SimpleQueryExpander.html +697 -0
  154. data/doc/TaskJuggler/SortListAttribute.html +10 -4
  155. data/doc/TaskJuggler/SourceFileInfo.html +10 -4
  156. data/doc/TaskJuggler/StatusSheetReceiver.html +10 -4
  157. data/doc/TaskJuggler/StatusSheetReport.html +10 -4
  158. data/doc/TaskJuggler/StatusSheetSender.html +10 -4
  159. data/doc/TaskJuggler/StringAttribute.html +10 -4
  160. data/doc/TaskJuggler/SymbolAttribute.html +10 -4
  161. data/doc/TaskJuggler/SyntaxReference.html +260 -230
  162. data/doc/TaskJuggler/TOCEntry.html +99 -42
  163. data/doc/TaskJuggler/TSResourceRecord.html +10 -4
  164. data/doc/TaskJuggler/TSTaskRecord.html +10 -4
  165. data/doc/TaskJuggler/TableColumnDefinition.html +10 -4
  166. data/doc/TaskJuggler/TableOfContents.html +54 -12
  167. data/doc/TaskJuggler/TableReport.html +877 -872
  168. data/doc/TaskJuggler/Task.html +117 -68
  169. data/doc/TaskJuggler/TaskDependency.html +10 -4
  170. data/doc/TaskJuggler/TaskListAttribute.html +10 -4
  171. data/doc/TaskJuggler/TaskListRE.html +10 -4
  172. data/doc/TaskJuggler/TaskScenario.html +1681 -1563
  173. data/doc/TaskJuggler/TextFormatter.html +10 -4
  174. data/doc/TaskJuggler/TextParser.html +567 -534
  175. data/doc/TaskJuggler/TextParser/Pattern.html +128 -118
  176. data/doc/TaskJuggler/TextParser/Rule.html +26 -15
  177. data/doc/TaskJuggler/TextParser/StackElement.html +10 -4
  178. data/doc/TaskJuggler/TextParser/TextParserResultArray.html +22 -16
  179. data/doc/TaskJuggler/TextParser/TokenDoc.html +10 -4
  180. data/doc/TaskJuggler/TextReport.html +15 -6
  181. data/doc/TaskJuggler/TextScanner.html +319 -287
  182. data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +16 -10
  183. data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +23 -17
  184. data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +17 -11
  185. data/doc/TaskJuggler/TextScanner/StreamHandle.html +102 -96
  186. data/doc/TaskJuggler/TimeSheet.html +138 -175
  187. data/doc/TaskJuggler/TimeSheetReceiver.html +10 -4
  188. data/doc/TaskJuggler/TimeSheetRecord.html +65 -58
  189. data/doc/TaskJuggler/TimeSheetReport.html +47 -42
  190. data/doc/TaskJuggler/TimeSheetSender.html +10 -4
  191. data/doc/TaskJuggler/TimeSheetSummary.html +91 -83
  192. data/doc/TaskJuggler/TimeSheets.html +22 -16
  193. data/doc/TaskJuggler/Tj3AppBase.html +10 -4
  194. data/doc/TaskJuggler/Tj3Client.html +399 -365
  195. data/doc/TaskJuggler/Tj3Daemon.html +107 -94
  196. data/doc/TaskJuggler/Tj3SheetAppBase.html +10 -4
  197. data/doc/TaskJuggler/Tj3SsReceiver.html +10 -4
  198. data/doc/TaskJuggler/Tj3SsSender.html +10 -4
  199. data/doc/TaskJuggler/Tj3TsReceiver.html +10 -4
  200. data/doc/TaskJuggler/Tj3TsSender.html +10 -4
  201. data/doc/TaskJuggler/Tj3TsSummary.html +10 -4
  202. data/doc/TaskJuggler/TjException.html +10 -4
  203. data/doc/TaskJuggler/TjTime.html +145 -140
  204. data/doc/TaskJuggler/TjpExample.html +10 -4
  205. data/doc/TaskJuggler/TjpExportRE.html +122 -118
  206. data/doc/TaskJuggler/TjpSyntaxRules.html +4065 -4052
  207. data/doc/TaskJuggler/URLParameter.html +10 -4
  208. data/doc/TaskJuggler/UserManual.html +162 -155
  209. data/doc/TaskJuggler/VimSyntax.html +1028 -0
  210. data/doc/TaskJuggler/WebServer.html +45 -27
  211. data/doc/TaskJuggler/WorkingHours.html +10 -4
  212. data/doc/TaskJuggler/WorkingHoursAttribute.html +10 -4
  213. data/doc/TaskJuggler/XMLBlob.html +10 -4
  214. data/doc/TaskJuggler/XMLComment.html +10 -4
  215. data/doc/TaskJuggler/XMLDocument.html +10 -4
  216. data/doc/TaskJuggler/XMLElement.html +10 -4
  217. data/doc/TaskJuggler/XMLNamedText.html +10 -4
  218. data/doc/TaskJuggler/XMLText.html +10 -4
  219. data/doc/index.html +735 -677
  220. data/doc/lib/AccountScenario_rb.html +1 -1
  221. data/doc/lib/Account_rb.html +1 -1
  222. data/doc/lib/Allocation_rb.html +1 -1
  223. data/doc/lib/AppConfig_rb.html +1 -1
  224. data/doc/lib/AttributeBase_rb.html +1 -1
  225. data/doc/lib/AttributeDefinition_rb.html +1 -1
  226. data/doc/lib/Attributes_rb.html +1 -1
  227. data/doc/lib/BatchProcessor_rb.html +1 -1
  228. data/doc/lib/Booking_rb.html +1 -1
  229. data/doc/lib/ChargeSet_rb.html +1 -1
  230. data/doc/lib/Charge_rb.html +1 -1
  231. data/doc/lib/{Message_rb.html → FileList_rb.html} +3 -5
  232. data/doc/lib/HTMLDocument_rb.html +1 -1
  233. data/doc/lib/Interval_rb.html +1 -1
  234. data/doc/lib/Journal_rb.html +1 -1
  235. data/doc/lib/KeywordArray_rb.html +1 -1
  236. data/doc/lib/KeywordDocumentation_rb.html +1 -1
  237. data/doc/lib/Limits_rb.html +1 -1
  238. data/doc/lib/LogFile_rb.html +1 -1
  239. data/doc/lib/Log_rb.html +1 -1
  240. data/doc/lib/LogicalExpression_rb.html +1 -1
  241. data/doc/lib/LogicalFunction_rb.html +1 -1
  242. data/doc/lib/LogicalOperation_rb.html +1 -1
  243. data/doc/lib/MacroTable_rb.html +1 -3
  244. data/doc/lib/MessageHandler_rb.html +1 -1
  245. data/doc/lib/ProjectFileParser_rb.html +1 -1
  246. data/doc/lib/ProjectFileScanner_rb.html +1 -1
  247. data/doc/lib/Project_rb.html +4 -2
  248. data/doc/lib/PropertyList_rb.html +1 -1
  249. data/doc/lib/PropertySet_rb.html +1 -1
  250. data/doc/lib/PropertyTreeNode_rb.html +1 -1
  251. data/doc/lib/Query_rb.html +1 -1
  252. data/doc/lib/RTFHandlers_rb.html +1 -1
  253. data/doc/lib/RTFNavigator_rb.html +1 -1
  254. data/doc/lib/RTFQuery_rb.html +2 -2
  255. data/doc/lib/RTFReportLink_rb.html +4 -2
  256. data/doc/lib/RTFReport_rb.html +1 -1
  257. data/doc/lib/{MacroParser_rb.html → RTFWithQuerySupport_rb.html} +4 -6
  258. data/doc/lib/RealFormat_rb.html +1 -1
  259. data/doc/lib/ResourceScenario_rb.html +1 -1
  260. data/doc/lib/Resource_rb.html +1 -1
  261. data/doc/lib/RichTextDocument_rb.html +1 -1
  262. data/doc/lib/RichTextElement_rb.html +1 -1
  263. data/doc/lib/RichTextFunctionExample_rb.html +1 -1
  264. data/doc/lib/RichTextFunctionHandler_rb.html +1 -1
  265. data/doc/lib/RichTextParser_rb.html +1 -1
  266. data/doc/lib/RichTextScanner_rb.html +3 -1
  267. data/doc/lib/RichTextSnip_rb.html +1 -1
  268. data/doc/lib/RichTextSyntaxRules_rb.html +1 -1
  269. data/doc/lib/RichText_rb.html +3 -1
  270. data/doc/lib/RuntimeConfig_rb.html +1 -1
  271. data/doc/lib/ScenarioData_rb.html +2 -2
  272. data/doc/lib/Scenario_rb.html +1 -1
  273. data/doc/lib/Scoreboard_rb.html +1 -1
  274. data/doc/lib/SheetHandlerBase_rb.html +5 -1
  275. data/doc/lib/SheetReceiver_rb.html +3 -1
  276. data/doc/lib/SheetSender_rb.html +1 -1
  277. data/doc/lib/ShiftAssignments_rb.html +1 -1
  278. data/doc/lib/ShiftScenario_rb.html +1 -1
  279. data/doc/lib/Shift_rb.html +1 -1
  280. data/doc/lib/SimpleQueryExpander_rb.html +67 -0
  281. data/doc/lib/SourceFileInfo_rb.html +1 -1
  282. data/doc/lib/StatusSheetReceiver_rb.html +1 -1
  283. data/doc/lib/StatusSheetSender_rb.html +1 -1
  284. data/doc/lib/SyntaxReference_rb.html +1 -1
  285. data/doc/lib/TOCEntry_rb.html +1 -1
  286. data/doc/lib/TableColumnDefinition_rb.html +1 -1
  287. data/doc/lib/TableOfContents_rb.html +1 -1
  288. data/doc/lib/TaskDependency_rb.html +1 -1
  289. data/doc/lib/TaskJuggler_rb.html +1 -1
  290. data/doc/lib/TaskScenario_rb.html +1 -1
  291. data/doc/lib/Task_rb.html +1 -1
  292. data/doc/lib/TextFormatter_rb.html +1 -1
  293. data/doc/lib/TextParser/Pattern_rb.html +1 -1
  294. data/doc/lib/TextParser/Rule_rb.html +1 -1
  295. data/doc/lib/TextParser/StackElement_rb.html +1 -1
  296. data/doc/lib/TextParser/TokenDoc_rb.html +1 -1
  297. data/doc/lib/TextParser_rb.html +3 -1
  298. data/doc/lib/TextScanner_rb.html +1 -3
  299. data/doc/lib/TimeSheetReceiver_rb.html +1 -1
  300. data/doc/lib/TimeSheetSender_rb.html +1 -1
  301. data/doc/lib/TimeSheetSummary_rb.html +1 -1
  302. data/doc/lib/TimeSheets_rb.html +1 -1
  303. data/doc/lib/Tj3AppBase_rb.html +1 -1
  304. data/doc/lib/Tj3Config_rb.html +1 -1
  305. data/doc/lib/Tj3SheetAppBase_rb.html +1 -1
  306. data/doc/lib/TjException_rb.html +1 -1
  307. data/doc/lib/TjTime_rb.html +1 -1
  308. data/doc/lib/TjpExample_rb.html +1 -1
  309. data/doc/lib/TjpSyntaxRules_rb.html +1 -1
  310. data/doc/lib/URLParameter_rb.html +1 -1
  311. data/doc/lib/UTF8String_rb.html +1 -1
  312. data/doc/lib/UserManual_rb.html +1 -1
  313. data/doc/lib/{ruby-signal-bug_rb.html → VimSyntax_rb.html} +17 -4
  314. data/doc/lib/WorkingHours_rb.html +1 -1
  315. data/doc/lib/XMLDocument_rb.html +1 -1
  316. data/doc/lib/XMLElement_rb.html +1 -1
  317. data/doc/lib/daemon/Daemon_rb.html +1 -1
  318. data/doc/lib/daemon/ProcessIntercom_rb.html +1 -1
  319. data/doc/lib/daemon/ProjectBroker_rb.html +1 -1
  320. data/doc/lib/daemon/ProjectServer_rb.html +1 -1
  321. data/doc/lib/daemon/ReportServer_rb.html +1 -3
  322. data/doc/lib/daemon/WebServer_rb.html +1 -1
  323. data/doc/lib/deep_copy_rb.html +1 -1
  324. data/doc/lib/reports/CSVFile_rb.html +1 -1
  325. data/doc/lib/reports/ColumnTable_rb.html +1 -1
  326. data/doc/lib/reports/GanttChart_rb.html +1 -1
  327. data/doc/lib/reports/GanttContainer_rb.html +1 -1
  328. data/doc/lib/reports/GanttHeaderScaleItem_rb.html +1 -1
  329. data/doc/lib/reports/GanttHeader_rb.html +1 -1
  330. data/doc/lib/reports/GanttLine_rb.html +1 -1
  331. data/doc/lib/reports/GanttLoadStack_rb.html +1 -1
  332. data/doc/lib/reports/GanttMilestone_rb.html +1 -1
  333. data/doc/lib/reports/GanttRouter_rb.html +1 -1
  334. data/doc/lib/reports/GanttTaskBar_rb.html +1 -1
  335. data/doc/lib/reports/HTMLGraphics_rb.html +1 -1
  336. data/doc/lib/reports/Navigator_rb.html +1 -1
  337. data/doc/lib/reports/NikuReport_rb.html +1 -1
  338. data/doc/lib/reports/ReportBase_rb.html +1 -1
  339. data/doc/lib/reports/ReportContext_rb.html +1 -1
  340. data/doc/lib/reports/ReportTableCell_rb.html +1 -1
  341. data/doc/lib/reports/ReportTableColumn_rb.html +1 -1
  342. data/doc/lib/reports/ReportTableLegend_rb.html +1 -1
  343. data/doc/lib/reports/ReportTableLine_rb.html +1 -1
  344. data/doc/lib/reports/ReportTable_rb.html +1 -1
  345. data/doc/lib/reports/Report_rb.html +1 -1
  346. data/doc/lib/reports/ResourceListRE_rb.html +1 -1
  347. data/doc/lib/reports/StatusSheetReport_rb.html +1 -1
  348. data/doc/lib/reports/TableReport_rb.html +1 -1
  349. data/doc/lib/reports/TaskListRE_rb.html +1 -1
  350. data/doc/lib/reports/TextReport_rb.html +1 -1
  351. data/doc/lib/reports/TimeSheetReport_rb.html +1 -1
  352. data/doc/lib/reports/TjpExportRE_rb.html +1 -1
  353. data/doc/lib/taskjuggler3_rb.html +1 -1
  354. data/doc/lib/tj3client_rb.html +1 -1
  355. data/doc/lib/tj3d_rb.html +1 -1
  356. data/doc/lib/tj3man_rb.html +1 -1
  357. data/doc/lib/tj3ss_receiver_rb.html +1 -1
  358. data/doc/lib/tj3ss_sender_rb.html +1 -1
  359. data/doc/lib/tj3ts_receiver_rb.html +1 -1
  360. data/doc/lib/tj3ts_sender_rb.html +1 -1
  361. data/doc/lib/tj3ts_summary_rb.html +1 -1
  362. data/lib/Allocation.rb +8 -5
  363. data/lib/BatchProcessor.rb +7 -3
  364. data/lib/FileList.rb +58 -0
  365. data/lib/Journal.rb +73 -33
  366. data/lib/KeywordArray.rb +4 -0
  367. data/lib/KeywordDocumentation.rb +45 -11
  368. data/lib/Limits.rb +0 -1
  369. data/lib/LogicalExpression.rb +1 -1
  370. data/lib/LogicalFunction.rb +14 -12
  371. data/lib/MacroTable.rb +3 -4
  372. data/lib/MessageHandler.rb +136 -7
  373. data/lib/Project.rb +72 -86
  374. data/lib/ProjectFileParser.rb +30 -33
  375. data/lib/ProjectFileScanner.rb +7 -16
  376. data/lib/PropertyList.rb +25 -27
  377. data/lib/PropertySet.rb +1 -1
  378. data/lib/PropertyTreeNode.rb +9 -12
  379. data/lib/Query.rb +5 -4
  380. data/lib/RTFNavigator.rb +2 -1
  381. data/lib/RTFQuery.rb +4 -11
  382. data/lib/RTFReport.rb +2 -1
  383. data/lib/RTFReportLink.rb +10 -4
  384. data/lib/RTFWithQuerySupport.rb +45 -0
  385. data/lib/Resource.rb +20 -20
  386. data/lib/ResourceScenario.rb +3 -3
  387. data/lib/RichText.rb +15 -7
  388. data/lib/RichTextDocument.rb +8 -4
  389. data/lib/RichTextElement.rb +35 -12
  390. data/lib/RichTextFunctionHandler.rb +11 -12
  391. data/lib/RichTextParser.rb +5 -3
  392. data/lib/RichTextScanner.rb +144 -565
  393. data/lib/RichTextSnip.rb +3 -7
  394. data/lib/RichTextSyntaxRules.rb +51 -32
  395. data/lib/ScenarioData.rb +16 -25
  396. data/lib/SheetHandlerBase.rb +59 -2
  397. data/lib/SheetReceiver.rb +36 -18
  398. data/lib/SimpleQueryExpander.rb +58 -0
  399. data/lib/SyntaxReference.rb +9 -5
  400. data/lib/TOCEntry.rb +2 -0
  401. data/lib/TableOfContents.rb +4 -0
  402. data/lib/Task.rb +23 -12
  403. data/lib/TaskJuggler.rb +72 -33
  404. data/lib/TaskScenario.rb +131 -53
  405. data/lib/TextParser.rb +43 -30
  406. data/lib/TextParser/Pattern.rb +17 -13
  407. data/lib/TextParser/Rule.rb +5 -0
  408. data/lib/TextScanner.rb +46 -25
  409. data/lib/TimeSheetSummary.rb +9 -7
  410. data/lib/TimeSheets.rb +14 -23
  411. data/lib/Tj3Config.rb +1 -1
  412. data/lib/TjTime.rb +1 -2
  413. data/lib/TjpSyntaxRules.rb +128 -104
  414. data/lib/UTF8String.rb +0 -1
  415. data/lib/UserManual.rb +5 -4
  416. data/lib/VimSyntax.rb +223 -0
  417. data/lib/daemon/Daemon.rb +9 -0
  418. data/lib/daemon/ProcessIntercom.rb +19 -4
  419. data/lib/daemon/ProjectBroker.rb +149 -68
  420. data/lib/daemon/ProjectServer.rb +119 -79
  421. data/lib/daemon/ReportServer.rb +42 -31
  422. data/lib/daemon/WebServer.rb +21 -2
  423. data/lib/deep_copy.rb +1 -1
  424. data/lib/reports/GanttContainer.rb +2 -2
  425. data/lib/reports/GanttLine.rb +2 -3
  426. data/lib/reports/GanttTaskBar.rb +7 -3
  427. data/lib/reports/Report.rb +62 -57
  428. data/lib/reports/ReportBase.rb +6 -4
  429. data/lib/reports/ReportTableCell.rb +13 -14
  430. data/lib/reports/TableReport.rb +2 -1
  431. data/lib/reports/TextReport.rb +3 -0
  432. data/lib/reports/TimeSheetReport.rb +2 -3
  433. data/lib/reports/TjpExportRE.rb +0 -2
  434. data/lib/tj3client.rb +31 -3
  435. data/lib/tj3d.rb +8 -1
  436. data/manual/Day_To_Day_Juggling +2 -95
  437. data/manual/How_To_Contribute +2 -1
  438. data/manual/Rich_Text_Attributes +37 -3
  439. data/manual/Software +203 -0
  440. data/test/MessageChecker.rb +4 -4
  441. data/test/TestSuite/HTML-Reports/Alerts.html +172 -0
  442. data/test/TestSuite/HTML-Reports/CellText.html +758 -0
  443. data/test/TestSuite/HTML-Reports/ColumnPeriods.html +156 -0
  444. data/test/TestSuite/HTML-Reports/IsOngoing.html +172 -0
  445. data/test/TestSuite/HTML-Reports/LogicalFunctions.html +245 -0
  446. data/test/TestSuite/HTML-Reports/Query.html +31 -0
  447. data/test/TestSuite/HTML-Reports/css/tjmanual.css +14 -0
  448. data/test/TestSuite/HTML-Reports/css/tjreport.css +233 -21
  449. data/test/TestSuite/HTML-Reports/depArrows.html +842 -0
  450. data/test/TestSuite/HTML-Reports/scripts/scripts/wz_tooltip.js +1301 -0
  451. data/test/TestSuite/HTML-Reports/scripts/wz_tooltip.js +20 -20
  452. data/test/TestSuite/ReportGenerator/Correct/Alerts.tjp +48 -0
  453. data/test/TestSuite/ReportGenerator/Correct/Macros.tjp +57 -0
  454. data/test/TestSuite/ReportGenerator/Correct/refs/Alerts-1.csv +386 -0
  455. data/test/TestSuite/ReportGenerator/Correct/refs/Macros-1.csv +6 -0
  456. data/test/TestSuite/ReportGenerator/{Correct → Errors}/css/tjmanual.css +0 -0
  457. data/test/TestSuite/ReportGenerator/{Correct → Errors}/css/tjreport.css +0 -0
  458. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/details.png +0 -0
  459. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/flag-green.png +0 -0
  460. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/flag-red.png +0 -0
  461. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/flag-yellow.png +0 -0
  462. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/resource.png +0 -0
  463. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/resourcegroup.png +0 -0
  464. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/task.png +0 -0
  465. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/taskgroup.png +0 -0
  466. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/trend-down.png +0 -0
  467. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/trend-flat.png +0 -0
  468. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/trend-up.png +0 -0
  469. data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.html +26 -0
  470. data/test/TestSuite/ReportGenerator/{Correct → Errors}/scripts/wz_tooltip.js +0 -0
  471. data/test/TestSuite/Scheduler/Correct/Allocate.html +3210 -0
  472. data/test/TestSuite/Scheduler/Correct/Allocate.tjp +19 -0
  473. data/test/TestSuite/Scheduler/Correct/Container.html +22 -22
  474. data/test/TestSuite/Scheduler/Correct/Limits.html +4964 -0
  475. data/test/TestSuite/Scheduler/Correct/Shift.html +1707 -417
  476. data/test/TestSuite/Scheduler/Correct/Shift2.html +9 -9
  477. data/test/TestSuite/Scheduler/Correct/css/tjreport.css +6 -2
  478. data/test/TestSuite/Scheduler/Errors/css/tjmanual.css +66 -0
  479. data/test/TestSuite/Scheduler/Errors/css/tjreport.css +407 -0
  480. data/test/TestSuite/Scheduler/Errors/icons/details.png +0 -0
  481. data/test/TestSuite/Scheduler/Errors/icons/flag-green.png +0 -0
  482. data/test/TestSuite/Scheduler/Errors/icons/flag-red.png +0 -0
  483. data/test/TestSuite/Scheduler/Errors/icons/flag-yellow.png +0 -0
  484. data/test/TestSuite/Scheduler/Errors/icons/resource.png +0 -0
  485. data/test/TestSuite/Scheduler/Errors/icons/resourcegroup.png +0 -0
  486. data/test/TestSuite/Scheduler/Errors/icons/task.png +0 -0
  487. data/test/TestSuite/Scheduler/Errors/icons/taskgroup.png +0 -0
  488. data/test/TestSuite/Scheduler/Errors/icons/trend-down.png +0 -0
  489. data/test/TestSuite/Scheduler/Errors/icons/trend-flat.png +0 -0
  490. data/test/TestSuite/Scheduler/Errors/icons/trend-up.png +0 -0
  491. data/test/TestSuite/Scheduler/Errors/loop_detected_1.tjp +1 -1
  492. data/test/TestSuite/Scheduler/Errors/loop_detected_10.tjp +1 -1
  493. data/test/TestSuite/Scheduler/Errors/loop_detected_11.tjp +1 -1
  494. data/test/TestSuite/Scheduler/Errors/loop_detected_12.tjp +1 -1
  495. data/test/TestSuite/Scheduler/Errors/loop_detected_13.tjp +1 -1
  496. data/test/TestSuite/Scheduler/Errors/loop_detected_14.tjp +1 -1
  497. data/test/TestSuite/Scheduler/Errors/loop_detected_2.tjp +1 -1
  498. data/test/TestSuite/Scheduler/Errors/loop_detected_3.tjp +1 -1
  499. data/test/TestSuite/Scheduler/Errors/loop_detected_4.tjp +1 -1
  500. data/test/TestSuite/Scheduler/Errors/loop_detected_5.tjp +1 -1
  501. data/test/TestSuite/Scheduler/Errors/loop_detected_6.tjp +1 -1
  502. data/test/TestSuite/Scheduler/Errors/loop_detected_7.tjp +1 -1
  503. data/test/TestSuite/Scheduler/Errors/loop_detected_8.tjp +1 -1
  504. data/test/TestSuite/Scheduler/Errors/loop_detected_9.tjp +1 -1
  505. data/test/TestSuite/Scheduler/Errors/scripts/wz_tooltip.js +1301 -0
  506. data/test/TestSuite/Scheduler/Errors/task_pred_before.tjp +11 -0
  507. data/test/TestSuite/Scheduler/Errors/task_pred_before_gd.tjp +11 -0
  508. data/test/TestSuite/Scheduler/Errors/task_pred_before_gl.tjp +11 -0
  509. data/test/TestSuite/Scheduler/Errors/task_succ_after.tjp +12 -0
  510. data/test/TestSuite/Scheduler/Errors/task_succ_after_gd.tjp +12 -0
  511. data/test/TestSuite/Scheduler/Errors/task_succ_after_gl.tjp +12 -0
  512. data/test/TestSuite/StatusSheets/dev2.tji +22 -0
  513. data/test/TestSuite/StatusSheets/resrep.tji +7 -0
  514. data/test/TestSuite/StatusSheets/run +6 -4
  515. data/test/TestSuite/StatusSheets/tj3d.log +312 -0
  516. data/test/TestSuite/Syntax/Correct/Managers.html +263 -0
  517. data/test/TestSuite/Syntax/Correct/tutorial.tjp +1 -2
  518. data/test/TestSuite/Syntax/Errors/empty.tjp +1 -1
  519. data/test/TestSuite/Syntax/Errors/macro_stack_overflow.tjp +1 -1
  520. data/test/TestSuite/TimeSheets/acceptable_intervals +1 -0
  521. data/test/TestSuite/TimeSheets/resrep.tji +7 -0
  522. data/test/TestSuite/TimeSheets/run +6 -5
  523. data/test/TestSuite/TimeSheets/statussheets.log +1 -0
  524. data/test/TestSuite/TimeSheets/ts.tji +351 -0
  525. data/test/TestSuite/TimeSheets/tsdef.tji +2 -0
  526. data/test/test_PropertySet.rb +2 -2
  527. data/test/test_RichText.rb +178 -387
  528. data/test/test_SimpleQueryExpander.rb +55 -0
  529. data/test/test_deep_copy.rb +2 -2
  530. metadata +854 -834
  531. data/lib/MacroParser.rb +0 -77
  532. data/lib/Message.rb +0 -56
  533. data/lib/ruby-signal-bug.rb +0 -43
  534. data/test/TestSuite/HTML-Reports/TimeSheet.html +0 -79
  535. data/test/TestSuite/HTML-Reports/reference.html +0 -51
  536. data/test/TestSuite/ReportGenerator/Correct/Journal.html +0 -63
  537. data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.csv +0 -3
  538. data/test/TestSuite/ReportGenerator/Correct/opennodes.csv +0 -2
  539. data/test/TestSuite/ReportGenerator/Correct/opennodes.tjp +0 -26
  540. data/test/TestSuite/ReportGenerator/Correct/refs/opennodes-1.csv +0 -2
  541. data/test/TestSuite/Scheduler/Correct/Booking2.html +0 -603
  542. data/test/TestSuite/Scheduler/Correct/TimeSheet2.html +0 -108
  543. data/test/TestSuite/StatusSheetTemplates/project.tji +0 -35
  544. data/test/TestSuite/StatusSheetTemplates/project.tjp +0 -56
  545. data/test/TestSuite/Syntax/Correct/ResourcePrefix.html +0 -32
@@ -169,6 +169,10 @@
169
169
 
170
170
  <li><a href="../TaskJuggler/DurationAttribute.html">TaskJuggler::DurationAttribute</a></li>
171
171
 
172
+ <li><a href="../TaskJuggler/FileList.html">TaskJuggler::FileList</a></li>
173
+
174
+ <li><a href="../TaskJuggler/FileRecord.html">TaskJuggler::FileRecord</a></li>
175
+
172
176
  <li><a href="../TaskJuggler/FixnumAttribute.html">TaskJuggler::FixnumAttribute</a></li>
173
177
 
174
178
  <li><a href="../TaskJuggler/FlagListAttribute.html">TaskJuggler::FlagListAttribute</a></li>
@@ -241,8 +245,6 @@
241
245
 
242
246
  <li><a href="../TaskJuggler/Macro.html">TaskJuggler::Macro</a></li>
243
247
 
244
- <li><a href="../TaskJuggler/MacroParser.html">TaskJuggler::MacroParser</a></li>
245
-
246
248
  <li><a href="../TaskJuggler/MacroTable.html">TaskJuggler::MacroTable</a></li>
247
249
 
248
250
  <li><a href="../TaskJuggler/ManagerResponsibilities.html">TaskJuggler::ManagerResponsibilities</a></li>
@@ -307,6 +309,8 @@
307
309
 
308
310
  <li><a href="../TaskJuggler/RTFReportLink.html">TaskJuggler::RTFReportLink</a></li>
309
311
 
312
+ <li><a href="../TaskJuggler/RTFWithQuerySupport.html">TaskJuggler::RTFWithQuerySupport</a></li>
313
+
310
314
  <li><a href="../TaskJuggler/RealFormat.html">TaskJuggler::RealFormat</a></li>
311
315
 
312
316
  <li><a href="../TaskJuggler/RealFormatAttribute.html">TaskJuggler::RealFormatAttribute</a></li>
@@ -353,8 +357,6 @@
353
357
 
354
358
  <li><a href="../TaskJuggler/RichTextElement.html">TaskJuggler::RichTextElement</a></li>
355
359
 
356
- <li><a href="../TaskJuggler/RichTextException.html">TaskJuggler::RichTextException</a></li>
357
-
358
360
  <li><a href="../TaskJuggler/RichTextFunctionExample.html">TaskJuggler::RichTextFunctionExample</a></li>
359
361
 
360
362
  <li><a href="../TaskJuggler/RichTextFunctionHandler.html">TaskJuggler::RichTextFunctionHandler</a></li>
@@ -395,6 +397,8 @@
395
397
 
396
398
  <li><a href="../TaskJuggler/ShiftScenario.html">TaskJuggler::ShiftScenario</a></li>
397
399
 
400
+ <li><a href="../TaskJuggler/SimpleQueryExpander.html">TaskJuggler::SimpleQueryExpander</a></li>
401
+
398
402
  <li><a href="../TaskJuggler/SortListAttribute.html">TaskJuggler::SortListAttribute</a></li>
399
403
 
400
404
  <li><a href="../TaskJuggler/SourceFileInfo.html">TaskJuggler::SourceFileInfo</a></li>
@@ -505,6 +509,8 @@
505
509
 
506
510
  <li><a href="../TaskJuggler/UserManual.html">TaskJuggler::UserManual</a></li>
507
511
 
512
+ <li><a href="../TaskJuggler/VimSyntax.html">TaskJuggler::VimSyntax</a></li>
513
+
508
514
  <li><a href="../TaskJuggler/WebServer.html">TaskJuggler::WebServer</a></li>
509
515
 
510
516
  <li><a href="../TaskJuggler/WorkingHours.html">TaskJuggler::WorkingHours</a></li>
@@ -38,20 +38,20 @@
38
38
  <div class="section-body">
39
39
  <ul>
40
40
 
41
- <li><a href="../lib/TextParser/StackElement_rb.html?TB_iframe=true&amp;height=550&amp;width=785"
42
- class="thickbox" title="lib/TextParser/StackElement.rb">lib/TextParser/StackElement.rb</a></li>
41
+ <li><a href="../lib/TextParser_rb.html?TB_iframe=true&amp;height=550&amp;width=785"
42
+ class="thickbox" title="lib/TextParser.rb">lib/TextParser.rb</a></li>
43
43
 
44
- <li><a href="../lib/TextParser/TokenDoc_rb.html?TB_iframe=true&amp;height=550&amp;width=785"
45
- class="thickbox" title="lib/TextParser/TokenDoc.rb">lib/TextParser/TokenDoc.rb</a></li>
44
+ <li><a href="../lib/TextParser/Pattern_rb.html?TB_iframe=true&amp;height=550&amp;width=785"
45
+ class="thickbox" title="lib/TextParser/Pattern.rb">lib/TextParser/Pattern.rb</a></li>
46
46
 
47
47
  <li><a href="../lib/TextParser/Rule_rb.html?TB_iframe=true&amp;height=550&amp;width=785"
48
48
  class="thickbox" title="lib/TextParser/Rule.rb">lib/TextParser/Rule.rb</a></li>
49
49
 
50
- <li><a href="../lib/TextParser/Pattern_rb.html?TB_iframe=true&amp;height=550&amp;width=785"
51
- class="thickbox" title="lib/TextParser/Pattern.rb">lib/TextParser/Pattern.rb</a></li>
50
+ <li><a href="../lib/TextParser/TokenDoc_rb.html?TB_iframe=true&amp;height=550&amp;width=785"
51
+ class="thickbox" title="lib/TextParser/TokenDoc.rb">lib/TextParser/TokenDoc.rb</a></li>
52
52
 
53
- <li><a href="../lib/TextParser_rb.html?TB_iframe=true&amp;height=550&amp;width=785"
54
- class="thickbox" title="lib/TextParser.rb">lib/TextParser.rb</a></li>
53
+ <li><a href="../lib/TextParser/StackElement_rb.html?TB_iframe=true&amp;height=550&amp;width=785"
54
+ class="thickbox" title="lib/TextParser/StackElement.rb">lib/TextParser/StackElement.rb</a></li>
55
55
 
56
56
  </ul>
57
57
  </div>
@@ -230,6 +230,10 @@
230
230
 
231
231
  <li><a href="../TaskJuggler/DurationAttribute.html">TaskJuggler::DurationAttribute</a></li>
232
232
 
233
+ <li><a href="../TaskJuggler/FileList.html">TaskJuggler::FileList</a></li>
234
+
235
+ <li><a href="../TaskJuggler/FileRecord.html">TaskJuggler::FileRecord</a></li>
236
+
233
237
  <li><a href="../TaskJuggler/FixnumAttribute.html">TaskJuggler::FixnumAttribute</a></li>
234
238
 
235
239
  <li><a href="../TaskJuggler/FlagListAttribute.html">TaskJuggler::FlagListAttribute</a></li>
@@ -302,8 +306,6 @@
302
306
 
303
307
  <li><a href="../TaskJuggler/Macro.html">TaskJuggler::Macro</a></li>
304
308
 
305
- <li><a href="../TaskJuggler/MacroParser.html">TaskJuggler::MacroParser</a></li>
306
-
307
309
  <li><a href="../TaskJuggler/MacroTable.html">TaskJuggler::MacroTable</a></li>
308
310
 
309
311
  <li><a href="../TaskJuggler/ManagerResponsibilities.html">TaskJuggler::ManagerResponsibilities</a></li>
@@ -368,6 +370,8 @@
368
370
 
369
371
  <li><a href="../TaskJuggler/RTFReportLink.html">TaskJuggler::RTFReportLink</a></li>
370
372
 
373
+ <li><a href="../TaskJuggler/RTFWithQuerySupport.html">TaskJuggler::RTFWithQuerySupport</a></li>
374
+
371
375
  <li><a href="../TaskJuggler/RealFormat.html">TaskJuggler::RealFormat</a></li>
372
376
 
373
377
  <li><a href="../TaskJuggler/RealFormatAttribute.html">TaskJuggler::RealFormatAttribute</a></li>
@@ -414,8 +418,6 @@
414
418
 
415
419
  <li><a href="../TaskJuggler/RichTextElement.html">TaskJuggler::RichTextElement</a></li>
416
420
 
417
- <li><a href="../TaskJuggler/RichTextException.html">TaskJuggler::RichTextException</a></li>
418
-
419
421
  <li><a href="../TaskJuggler/RichTextFunctionExample.html">TaskJuggler::RichTextFunctionExample</a></li>
420
422
 
421
423
  <li><a href="../TaskJuggler/RichTextFunctionHandler.html">TaskJuggler::RichTextFunctionHandler</a></li>
@@ -456,6 +458,8 @@
456
458
 
457
459
  <li><a href="../TaskJuggler/ShiftScenario.html">TaskJuggler::ShiftScenario</a></li>
458
460
 
461
+ <li><a href="../TaskJuggler/SimpleQueryExpander.html">TaskJuggler::SimpleQueryExpander</a></li>
462
+
459
463
  <li><a href="../TaskJuggler/SortListAttribute.html">TaskJuggler::SortListAttribute</a></li>
460
464
 
461
465
  <li><a href="../TaskJuggler/SourceFileInfo.html">TaskJuggler::SourceFileInfo</a></li>
@@ -566,6 +570,8 @@
566
570
 
567
571
  <li><a href="../TaskJuggler/UserManual.html">TaskJuggler::UserManual</a></li>
568
572
 
573
+ <li><a href="../TaskJuggler/VimSyntax.html">TaskJuggler::VimSyntax</a></li>
574
+
569
575
  <li><a href="../TaskJuggler/WebServer.html">TaskJuggler::WebServer</a></li>
570
576
 
571
577
  <li><a href="../TaskJuggler/WorkingHours.html">TaskJuggler::WorkingHours</a></li>
@@ -609,9 +615,42 @@
609
615
 
610
616
  <div id="description">
611
617
  <p>
618
+ The <a href="TextParser.html">TextParser</a> implements a regular LALR
619
+ parser. But it uses a recursive rule traversor instead of the more commonly
620
+ found state machine generated by yacc-like tools. Since stack depths is not
621
+ really an issue with a Ruby implementation this approach has one big
622
+ advantage. The syntax of the parser can be modified during parsing. This
623
+ allows support for languages that can extend themself. The <a
624
+ href="../TaskJuggler.html">TaskJuggler</a> syntax is such an beast.
625
+ Traditional yacc generated parsers would fail with such a syntax.
626
+ </p>
627
+ <p>
628
+ This class is just a base class. A complete parser would derive from this
629
+ class and implement the rule set and the functions _nextToken()_ and
630
+ _returnToken()_. It also needs to set the array <em>variables</em> to
631
+ declare all variables ($SOMENAME) that the scanner may deliver.
632
+ </p>
633
+ <p>
634
+ To describe the syntax the functions <a
635
+ href="TextParser.html#method-i-pattern">TextParser#pattern</a>, <a
636
+ href="TextParser.html#method-i-optional">TextParser#optional</a> and <a
637
+ href="TextParser.html#method-i-repeatable">TextParser#repeatable</a> can be
638
+ used. When the rule set is changed during parsing, <a
639
+ href="TextParser.html#method-i-updateParserTables">TextParser#updateParserTables</a>
640
+ must be called to make the changes effective. The parser can also document
641
+ the syntax automatically. To document a pattern, the functions
642
+ TextParser#doc, TextParser#descr, TextParser#also and TextParser#arg can be
643
+ used.
644
+ </p>
645
+ <p>
646
+ To start parsing the input the function <a
647
+ href="TextParser.html#method-i-parse">TextParser#parse</a> needs to be
648
+ called with the name of the start rule.
649
+ </p>
650
+ <hr style="height: 1px"></hr><p>
612
651
  encoding: UTF-8
613
652
  </p>
614
- <h1>StackElement.rb &#8212; The <a href="../TaskJuggler.html">TaskJuggler</a> III <a href="Project.html">Project</a> Management Software</h1>
653
+ <h1>Rule.rb &#8212; The <a href="../TaskJuggler.html">TaskJuggler</a> III <a href="Project.html">Project</a> Management Software</h1>
615
654
  <p>
616
655
  Copyright &#169; 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger
617
656
  <cs@kde.org>
@@ -637,7 +676,7 @@ by the Free Software Foundation.
637
676
  <hr style="height: 1px"></hr><p>
638
677
  encoding: UTF-8
639
678
  </p>
640
- <h1>Rule.rb &#8212; The <a href="../TaskJuggler.html">TaskJuggler</a> III <a href="Project.html">Project</a> Management Software</h1>
679
+ <h1>StackElement.rb &#8212; The <a href="../TaskJuggler.html">TaskJuggler</a> III <a href="Project.html">Project</a> Management Software</h1>
641
680
  <p>
642
681
  Copyright &#169; 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger
643
682
  <cs@kde.org>
@@ -646,39 +685,6 @@ Copyright &#169; 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger
646
685
  This program is free software; you can redistribute it and/or modify it
647
686
  under the terms of version 2 of the GNU General Public License as published
648
687
  by the Free Software Foundation.
649
- </p>
650
- <hr style="height: 1px"></hr><p>
651
- The <a href="TextParser.html">TextParser</a> implements a regular LALR
652
- parser. But it uses a recursive rule traversor instead of the more commonly
653
- found state machine generated by yacc-like tools. Since stack depths is not
654
- really an issue with a Ruby implementation this approach has one big
655
- advantage. The syntax of the parser can be modified during parsing. This
656
- allows support for languages that can extend themself. The <a
657
- href="../TaskJuggler.html">TaskJuggler</a> syntax is such an beast.
658
- Traditional yacc generated parsers would fail with such a syntax.
659
- </p>
660
- <p>
661
- This class is just a base class. A complete parser would derive from this
662
- class and implement the rule set and the functions _nextToken()_ and
663
- _returnToken()_. It also needs to set the array <em>variables</em> to
664
- declare all variables ($SOMENAME) that the scanner may deliver.
665
- </p>
666
- <p>
667
- To describe the syntax the functions <a
668
- href="TextParser.html#method-i-pattern">TextParser#pattern</a>, <a
669
- href="TextParser.html#method-i-optional">TextParser#optional</a> and <a
670
- href="TextParser.html#method-i-repeatable">TextParser#repeatable</a> can be
671
- used. When the rule set is changed during parsing, <a
672
- href="TextParser.html#method-i-updateParserTables">TextParser#updateParserTables</a>
673
- must be called to make the changes effective. The parser can also document
674
- the syntax automatically. To document a pattern, the functions
675
- TextParser#doc, TextParser#descr, TextParser#also and TextParser#arg can be
676
- used.
677
- </p>
678
- <p>
679
- To start parsing the input the function <a
680
- href="TextParser.html#method-i-parse">TextParser#parse</a> needs to be
681
- called with the name of the start rule.
682
688
  </p>
683
689
 
684
690
  </div>
@@ -704,6 +710,21 @@ called with the name of the start rule.
704
710
 
705
711
 
706
712
 
713
+ </div>
714
+ </div>
715
+
716
+ <div id="message-andler-attribute-method" class="method-detail">
717
+ <a name="messageHandler"></a>
718
+
719
+ <div class="method-heading attribute-method-heading">
720
+ <span class="method-name">messageHandler</span><span
721
+ class="attribute-access-type">[R]</span>
722
+ </div>
723
+
724
+ <div class="method-description">
725
+
726
+
727
+
707
728
  </div>
708
729
  </div>
709
730
 
@@ -722,7 +743,7 @@ called with the name of the start rule.
722
743
  <div class="method-heading">
723
744
 
724
745
  <span class="method-name">new</span><span
725
- class="method-args">()</span>
746
+ class="method-args">(messageHandler)</span>
726
747
  <span class="method-click-advice">click to toggle source</span>
727
748
 
728
749
  </div>
@@ -738,16 +759,19 @@ Create a new <a href="TextParser.html">TextParser</a> object.
738
759
  <div class="method-source-code"
739
760
  id="new-source">
740
761
  <pre>
741
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 70</span>
742
- 70: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>
743
- 71: <span class="ruby-ivar">@rules</span> = { }
744
- 72: <span class="ruby-comment cmt"># Array to hold the token types that the scanner can return.</span>
745
- 73: <span class="ruby-ivar">@variables</span> = []
746
- 74: <span class="ruby-comment cmt"># An list of token types that are not allowed in the current context.</span>
747
- 75: <span class="ruby-ivar">@badVariables</span> = []
748
- 76: <span class="ruby-comment cmt"># The currently processed rule.</span>
749
- 77: <span class="ruby-ivar">@cr</span> = <span class="ruby-keyword kw">nil</span>
750
- 78: <span class="ruby-keyword kw">end</span></pre>
762
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 71</span>
763
+ 71: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">messageHandler</span>)
764
+ 72: <span class="ruby-comment cmt"># The message handler will collect all error messages.</span>
765
+ 73: <span class="ruby-ivar">@messageHandler</span> = <span class="ruby-identifier">messageHandler</span>
766
+ 74: <span class="ruby-comment cmt"># This Hash will store the ruleset that the parser is operating on.</span>
767
+ 75: <span class="ruby-ivar">@rules</span> = { }
768
+ 76: <span class="ruby-comment cmt"># Array to hold the token types that the scanner can return.</span>
769
+ 77: <span class="ruby-ivar">@variables</span> = []
770
+ 78: <span class="ruby-comment cmt"># An list of token types that are not allowed in the current context.</span>
771
+ 79: <span class="ruby-ivar">@badVariables</span> = []
772
+ 80: <span class="ruby-comment cmt"># The currently processed rule.</span>
773
+ 81: <span class="ruby-ivar">@cr</span> = <span class="ruby-keyword kw">nil</span>
774
+ 82: <span class="ruby-keyword kw">end</span></pre>
751
775
  </div>
752
776
 
753
777
  </div>
@@ -770,7 +794,7 @@ Create a new <a href="TextParser.html">TextParser</a> object.
770
794
  <div class="method-heading">
771
795
 
772
796
  <span class="method-name">error</span><span
773
- class="method-args">(id, text, property = nil, sfi = nil)</span>
797
+ class="method-args">(id, text, sfi = nil, data = nil)</span>
774
798
  <span class="method-click-advice">click to toggle source</span>
775
799
 
776
800
  </div>
@@ -784,16 +808,17 @@ Create a new <a href="TextParser.html">TextParser</a> object.
784
808
  <div class="method-source-code"
785
809
  id="error-source">
786
810
  <pre>
787
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 190</span>
788
- 190: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">error</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">text</span>, <span class="ruby-identifier">property</span> = <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">sfi</span> = <span class="ruby-keyword kw">nil</span>)
789
- 191: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@scanner</span>
790
- 192: <span class="ruby-ivar">@scanner</span>.<span class="ruby-identifier">error</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">text</span>, <span class="ruby-identifier">property</span>, <span class="ruby-identifier">sfi</span>)
791
- 193: <span class="ruby-keyword kw">else</span>
792
- 194: <span class="ruby-identifier">message</span> = <span class="ruby-constant">Message</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">id</span>, <span class="ruby-value str">'error'</span>, <span class="ruby-identifier">text</span>, <span class="ruby-identifier">property</span>, <span class="ruby-identifier">sfi</span>)
793
- 195: <span class="ruby-ivar">@messageHandler</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">message</span>)
794
- 196: <span class="ruby-identifier">raise</span> <span class="ruby-constant">TjException</span>.<span class="ruby-identifier">new</span>, <span class="ruby-value str">''</span>
795
- 197: <span class="ruby-keyword kw">end</span>
796
- 198: <span class="ruby-keyword kw">end</span></pre>
811
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 197</span>
812
+ 197: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">error</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">text</span>, <span class="ruby-identifier">sfi</span> = <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">data</span> = <span class="ruby-keyword kw">nil</span>)
813
+ 198: <span class="ruby-identifier">sfi</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">sourceFileInfo</span>
814
+ 199: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@scanner</span>
815
+ 200: <span class="ruby-comment cmt"># The scanner has some more context information, so we pass the error</span>
816
+ 201: <span class="ruby-comment cmt"># on to the TextScanner.</span>
817
+ 202: <span class="ruby-ivar">@scanner</span>.<span class="ruby-identifier">error</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">text</span>, <span class="ruby-identifier">sfi</span>, <span class="ruby-identifier">data</span>)
818
+ 203: <span class="ruby-keyword kw">else</span>
819
+ 204: <span class="ruby-ivar">@messageHandler</span>.<span class="ruby-identifier">error</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">text</span>, <span class="ruby-identifier">sfi</span>, <span class="ruby-identifier">data</span>)
820
+ 205: <span class="ruby-keyword kw">end</span>
821
+ 206: <span class="ruby-keyword kw">end</span></pre>
797
822
  </div>
798
823
 
799
824
  </div>
@@ -827,17 +852,17 @@ rules.
827
852
  <div class="method-source-code"
828
853
  id="init-ules-source">
829
854
  <pre>
830
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 90</span>
831
- 90: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initRules</span>
832
- 91: <span class="ruby-identifier">methods</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">m</span><span class="ruby-operator">|</span>
833
- 92: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">m</span>[<span class="ruby-value">0</span>, <span class="ruby-value">5</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">'rule_'</span>
834
- 93: <span class="ruby-comment cmt"># Create a new rule with the suffix of the function name as name.</span>
835
- 94: <span class="ruby-identifier">newRule</span>(<span class="ruby-identifier">m</span>[<span class="ruby-value">5</span><span class="ruby-operator">..</span><span class="ruby-value">1</span>])
836
- 95: <span class="ruby-comment cmt"># Call the function.</span>
837
- 96: <span class="ruby-identifier">send</span>(<span class="ruby-identifier">m</span>)
838
- 97: <span class="ruby-keyword kw">end</span>
839
- 98: <span class="ruby-keyword kw">end</span>
840
- 99: <span class="ruby-keyword kw">end</span></pre>
855
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 94</span>
856
+ 94: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initRules</span>
857
+ 95: <span class="ruby-identifier">methods</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">m</span><span class="ruby-operator">|</span>
858
+ 96: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">m</span>[<span class="ruby-value">0</span>, <span class="ruby-value">5</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">'rule_'</span>
859
+ 97: <span class="ruby-comment cmt"># Create a new rule with the suffix of the function name as name.</span>
860
+ 98: <span class="ruby-identifier">newRule</span>(<span class="ruby-identifier">m</span>[<span class="ruby-value">5</span><span class="ruby-operator">..</span><span class="ruby-value">1</span>])
861
+ 99: <span class="ruby-comment cmt"># Call the function.</span>
862
+ 100: <span class="ruby-identifier">send</span>(<span class="ruby-identifier">m</span>)
863
+ 101: <span class="ruby-keyword kw">end</span>
864
+ 102: <span class="ruby-keyword kw">end</span>
865
+ 103: <span class="ruby-keyword kw">end</span></pre>
841
866
  </div>
842
867
 
843
868
  </div>
@@ -871,13 +896,13 @@ Limit the allowed tokens of the scanner to the subset passed by the
871
896
  <div class="method-source-code"
872
897
  id="limit-oken-et-source">
873
898
  <pre>
874
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 82</span>
875
- 82: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">limitTokenSet</span>(<span class="ruby-identifier">tokenSet</span>)
876
- 83: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">tokenSet</span>
877
- 84:
878
- 85: <span class="ruby-ivar">@badVariables</span> = <span class="ruby-ivar">@variables</span>.<span class="ruby-identifier">dup</span>
879
- 86: <span class="ruby-ivar">@badVariables</span>.<span class="ruby-identifier">delete_if</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">tokenSet</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">v</span>) }
880
- 87: <span class="ruby-keyword kw">end</span></pre>
899
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 86</span>
900
+ 86: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">limitTokenSet</span>(<span class="ruby-identifier">tokenSet</span>)
901
+ 87: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">tokenSet</span>
902
+ 88:
903
+ 89: <span class="ruby-ivar">@badVariables</span> = <span class="ruby-ivar">@variables</span>.<span class="ruby-identifier">dup</span>
904
+ 90: <span class="ruby-ivar">@badVariables</span>.<span class="ruby-identifier">delete_if</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">tokenSet</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">v</span>) }
905
+ 91: <span class="ruby-keyword kw">end</span></pre>
881
906
  </div>
882
907
 
883
908
  </div>
@@ -908,15 +933,15 @@ Limit the allowed tokens of the scanner to the subset passed by the
908
933
  <div class="method-source-code"
909
934
  id="matching-ules-source">
910
935
  <pre>
911
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 181</span>
912
- 181: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">matchingRules</span>(<span class="ruby-identifier">keyword</span>)
913
- 182: <span class="ruby-identifier">matches</span> = []
914
- 183: <span class="ruby-ivar">@rules</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">name</span>, <span class="ruby-identifier">rule</span><span class="ruby-operator">|</span>
915
- 184: <span class="ruby-identifier">patIdx</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">matchingPatternIndex</span>(<span class="ruby-value str">'_'</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">keyword</span>)
916
- 185: <span class="ruby-identifier">matches</span> <span class="ruby-operator">&lt;&lt;</span> [ <span class="ruby-identifier">rule</span>, <span class="ruby-identifier">patIdx</span> ] <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">patIdx</span>
917
- 186: <span class="ruby-keyword kw">end</span>
918
- 187: <span class="ruby-identifier">matches</span>
919
- 188: <span class="ruby-keyword kw">end</span></pre>
936
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 188</span>
937
+ 188: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">matchingRules</span>(<span class="ruby-identifier">keyword</span>)
938
+ 189: <span class="ruby-identifier">matches</span> = []
939
+ 190: <span class="ruby-ivar">@rules</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">name</span>, <span class="ruby-identifier">rule</span><span class="ruby-operator">|</span>
940
+ 191: <span class="ruby-identifier">patIdx</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">matchingPatternIndex</span>(<span class="ruby-value str">'_'</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">keyword</span>)
941
+ 192: <span class="ruby-identifier">matches</span> <span class="ruby-operator">&lt;&lt;</span> [ <span class="ruby-identifier">rule</span>, <span class="ruby-identifier">patIdx</span> ] <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">patIdx</span>
942
+ 193: <span class="ruby-keyword kw">end</span>
943
+ 194: <span class="ruby-identifier">matches</span>
944
+ 195: <span class="ruby-keyword kw">end</span></pre>
920
945
  </div>
921
946
 
922
947
  </div>
@@ -954,19 +979,19 @@ then implicitely operate on the most recently added rule.
954
979
  <div class="method-source-code"
955
980
  id="new-ule-source">
956
981
  <pre>
957
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 106</span>
958
- 106: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">newRule</span>(<span class="ruby-identifier">name</span>)
959
- 107: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Fatal Error: Rule #{name} already exists&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@rules</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-identifier">name</span>)
960
- 108:
961
- 109: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">block_given?</span>
962
- 110: <span class="ruby-identifier">saveCr</span> = <span class="ruby-ivar">@cr</span>
963
- 111: <span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">name</span>] = <span class="ruby-ivar">@cr</span> = <span class="ruby-constant">TextParser</span><span class="ruby-operator">::</span><span class="ruby-constant">Rule</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">name</span>)
964
- 112: <span class="ruby-keyword kw">yield</span>
965
- 113: <span class="ruby-ivar">@cr</span> = <span class="ruby-identifier">saveCr</span>
966
- 114: <span class="ruby-keyword kw">else</span>
982
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 110</span>
983
+ 110: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">newRule</span>(<span class="ruby-identifier">name</span>)
984
+ 111: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Fatal Error: Rule #{name} already exists&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@rules</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-identifier">name</span>)
985
+ 112:
986
+ 113: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">block_given?</span>
987
+ 114: <span class="ruby-identifier">saveCr</span> = <span class="ruby-ivar">@cr</span>
967
988
  115: <span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">name</span>] = <span class="ruby-ivar">@cr</span> = <span class="ruby-constant">TextParser</span><span class="ruby-operator">::</span><span class="ruby-constant">Rule</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">name</span>)
968
- 116: <span class="ruby-keyword kw">end</span>
969
- 117: <span class="ruby-keyword kw">end</span></pre>
989
+ 116: <span class="ruby-keyword kw">yield</span>
990
+ 117: <span class="ruby-ivar">@cr</span> = <span class="ruby-identifier">saveCr</span>
991
+ 118: <span class="ruby-keyword kw">else</span>
992
+ 119: <span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">name</span>] = <span class="ruby-ivar">@cr</span> = <span class="ruby-constant">TextParser</span><span class="ruby-operator">::</span><span class="ruby-constant">Rule</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">name</span>)
993
+ 120: <span class="ruby-keyword kw">end</span>
994
+ 121: <span class="ruby-keyword kw">end</span></pre>
970
995
  </div>
971
996
 
972
997
  </div>
@@ -1000,10 +1025,10 @@ elements.
1000
1025
  <div class="method-source-code"
1001
1026
  id="optional-source">
1002
1027
  <pre>
1003
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 136</span>
1004
- 136: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">optional</span>
1005
- 137: <span class="ruby-ivar">@cr</span>.<span class="ruby-identifier">setOptional</span>
1006
- 138: <span class="ruby-keyword kw">end</span></pre>
1028
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 140</span>
1029
+ 140: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">optional</span>
1030
+ 141: <span class="ruby-ivar">@cr</span>.<span class="ruby-identifier">setOptional</span>
1031
+ 142: <span class="ruby-keyword kw">end</span></pre>
1007
1032
  </div>
1008
1033
 
1009
1034
  </div>
@@ -1030,7 +1055,8 @@ elements.
1030
1055
  <p>
1031
1056
  To parse the input this function needs to be called with the name of the
1032
1057
  rule to start with. It returns the result of the processing function of the
1033
- top-level parser rule that was specified by <em>ruleName</em>.
1058
+ top-level parser rule that was specified by <em>ruleName</em>. In case of
1059
+ an error, the result is false.
1034
1060
  </p>
1035
1061
 
1036
1062
 
@@ -1038,20 +1064,22 @@ top-level parser rule that was specified by <em>ruleName</em>.
1038
1064
  <div class="method-source-code"
1039
1065
  id="parse-source">
1040
1066
  <pre>
1041
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 159</span>
1042
- 159: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">parse</span>(<span class="ruby-identifier">ruleName</span>)
1043
- 160: <span class="ruby-ivar">@stack</span> = []
1044
- 161: <span class="ruby-identifier">@@expectedTokens</span> = []
1045
- 162: <span class="ruby-identifier">updateParserTables</span>
1046
- 163: <span class="ruby-keyword kw">begin</span>
1047
- 164: <span class="ruby-identifier">result</span> = <span class="ruby-identifier">parseRuleR</span>(<span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">ruleName</span>])
1048
- 165: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">TjException</span>
1049
- 166: <span class="ruby-comment cmt"># error('parse_error', $!.message)</span>
1050
- 167: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span>
1051
- 168: <span class="ruby-keyword kw">end</span>
1052
- 169:
1053
- 170: <span class="ruby-identifier">result</span>
1054
- 171: <span class="ruby-keyword kw">end</span></pre>
1067
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 164</span>
1068
+ 164: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">parse</span>(<span class="ruby-identifier">ruleName</span>)
1069
+ 165: <span class="ruby-ivar">@stack</span> = []
1070
+ 166: <span class="ruby-identifier">@@expectedTokens</span> = []
1071
+ 167: <span class="ruby-identifier">updateParserTables</span>
1072
+ 168: <span class="ruby-keyword kw">begin</span>
1073
+ 169: <span class="ruby-identifier">result</span> = <span class="ruby-identifier">parseRuleR</span>(<span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">ruleName</span>])
1074
+ 170: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">TjException</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">msg</span>
1075
+ 171: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">msg</span>.<span class="ruby-identifier">message</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-identifier">msg</span>.<span class="ruby-identifier">message</span>.<span class="ruby-identifier">empty?</span>
1076
+ 172: <span class="ruby-ivar">@messageHandler</span>.<span class="ruby-identifier">critical</span>(<span class="ruby-value str">'parse'</span>, <span class="ruby-identifier">msg</span>.<span class="ruby-identifier">message</span>)
1077
+ 173: <span class="ruby-keyword kw">end</span>
1078
+ 174: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
1079
+ 175: <span class="ruby-keyword kw">end</span>
1080
+ 176:
1081
+ 177: <span class="ruby-identifier">result</span>
1082
+ 178: <span class="ruby-keyword kw">end</span></pre>
1055
1083
  </div>
1056
1084
 
1057
1085
  </div>
@@ -1105,10 +1133,10 @@ completed the processing of this rule.
1105
1133
  <div class="method-source-code"
1106
1134
  id="pattern-source">
1107
1135
  <pre>
1108
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 130</span>
1109
- 130: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">pattern</span>(<span class="ruby-identifier">tokens</span>, <span class="ruby-identifier">func</span> = <span class="ruby-keyword kw">nil</span>)
1110
- 131: <span class="ruby-ivar">@cr</span>.<span class="ruby-identifier">addPattern</span>(<span class="ruby-constant">TextParser</span><span class="ruby-operator">::</span><span class="ruby-constant">Pattern</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">tokens</span>, <span class="ruby-identifier">func</span>))
1111
- 132: <span class="ruby-keyword kw">end</span></pre>
1136
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 134</span>
1137
+ 134: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">pattern</span>(<span class="ruby-identifier">tokens</span>, <span class="ruby-identifier">func</span> = <span class="ruby-keyword kw">nil</span>)
1138
+ 135: <span class="ruby-ivar">@cr</span>.<span class="ruby-identifier">addPattern</span>(<span class="ruby-constant">TextParser</span><span class="ruby-operator">::</span><span class="ruby-constant">Pattern</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">tokens</span>, <span class="ruby-identifier">func</span>))
1139
+ 136: <span class="ruby-keyword kw">end</span></pre>
1112
1140
  </div>
1113
1141
 
1114
1142
  </div>
@@ -1142,10 +1170,10 @@ elements.
1142
1170
  <div class="method-source-code"
1143
1171
  id="repeatable-source">
1144
1172
  <pre>
1145
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 142</span>
1146
- 142: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">repeatable</span>
1147
- 143: <span class="ruby-ivar">@cr</span>.<span class="ruby-identifier">setRepeatable</span>
1148
- 144: <span class="ruby-keyword kw">end</span></pre>
1173
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 146</span>
1174
+ 146: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">repeatable</span>
1175
+ 147: <span class="ruby-ivar">@cr</span>.<span class="ruby-identifier">setRepeatable</span>
1176
+ 148: <span class="ruby-keyword kw">end</span></pre>
1149
1177
  </div>
1150
1178
 
1151
1179
  </div>
@@ -1181,11 +1209,11 @@ nil if we don&#8217;t have a current position.
1181
1209
  <div class="method-source-code"
1182
1210
  id="source-ile-nfo-source">
1183
1211
  <pre>
1184
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 176</span>
1185
- 176: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sourceFileInfo</span>
1186
- 177: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">empty?</span>
1187
- 178: <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">sourceFileInfo</span>[<span class="ruby-value">0</span>]
1188
- 179: <span class="ruby-keyword kw">end</span></pre>
1212
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 183</span>
1213
+ 183: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sourceFileInfo</span>
1214
+ 184: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">empty?</span>
1215
+ 185: <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">sourceFileInfo</span>[<span class="ruby-value">0</span>]
1216
+ 186: <span class="ruby-keyword kw">end</span></pre>
1189
1217
  </div>
1190
1218
 
1191
1219
  </div>
@@ -1220,14 +1248,14 @@ href="TextParser.html#method-i-parse">TextParser#parse</a>.
1220
1248
  <div class="method-source-code"
1221
1249
  id="update-arser-ables-source">
1222
1250
  <pre>
1223
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 148</span>
1224
- 148: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">updateParserTables</span>
1225
- 149: <span class="ruby-ivar">@rules</span>.<span class="ruby-identifier">each_value</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">rule</span><span class="ruby-operator">|</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">transitions</span> = {} }
1226
- 150: <span class="ruby-ivar">@rules</span>.<span class="ruby-identifier">each_value</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">rule</span><span class="ruby-operator">|</span>
1227
- 151: <span class="ruby-identifier">getTransitions</span>(<span class="ruby-identifier">rule</span>)
1228
- 152: <span class="ruby-identifier">checkRule</span>(<span class="ruby-identifier">rule</span>)
1229
- 153: <span class="ruby-keyword kw">end</span>
1230
- 154: <span class="ruby-keyword kw">end</span></pre>
1251
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 152</span>
1252
+ 152: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">updateParserTables</span>
1253
+ 153: <span class="ruby-ivar">@rules</span>.<span class="ruby-identifier">each_value</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">rule</span><span class="ruby-operator">|</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">transitions</span> = {} }
1254
+ 154: <span class="ruby-ivar">@rules</span>.<span class="ruby-identifier">each_value</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">rule</span><span class="ruby-operator">|</span>
1255
+ 155: <span class="ruby-identifier">getTransitions</span>(<span class="ruby-identifier">rule</span>)
1256
+ 156: <span class="ruby-identifier">checkRule</span>(<span class="ruby-identifier">rule</span>)
1257
+ 157: <span class="ruby-keyword kw">end</span>
1258
+ 158: <span class="ruby-keyword kw">end</span></pre>
1231
1259
  </div>
1232
1260
 
1233
1261
  </div>
@@ -1244,7 +1272,7 @@ href="TextParser.html#method-i-parse">TextParser#parse</a>.
1244
1272
  <div class="method-heading">
1245
1273
 
1246
1274
  <span class="method-name">warning</span><span
1247
- class="method-args">(id, text, property = nil, sfi = nil)</span>
1275
+ class="method-args">(id, text, sfi = nil, data = nil)</span>
1248
1276
  <span class="method-click-advice">click to toggle source</span>
1249
1277
 
1250
1278
  </div>
@@ -1258,10 +1286,17 @@ href="TextParser.html#method-i-parse">TextParser#parse</a>.
1258
1286
  <div class="method-source-code"
1259
1287
  id="warning-source">
1260
1288
  <pre>
1261
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 200</span>
1262
- 200: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">warning</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">text</span>, <span class="ruby-identifier">property</span> = <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">sfi</span> = <span class="ruby-keyword kw">nil</span>)
1263
- 201: <span class="ruby-ivar">@scanner</span>.<span class="ruby-identifier">warning</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">text</span>, <span class="ruby-identifier">property</span>, <span class="ruby-identifier">sfi</span>)
1264
- 202: <span class="ruby-keyword kw">end</span></pre>
1289
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 208</span>
1290
+ 208: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">warning</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">text</span>, <span class="ruby-identifier">sfi</span> = <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">data</span> = <span class="ruby-keyword kw">nil</span>)
1291
+ 209: <span class="ruby-identifier">sfi</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">sourceFileInfo</span>
1292
+ 210: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@scanner</span>
1293
+ 211: <span class="ruby-comment cmt"># The scanner has some more context information, so we pass the</span>
1294
+ 212: <span class="ruby-comment cmt"># warning on to the TextScanner.</span>
1295
+ 213: <span class="ruby-ivar">@scanner</span>.<span class="ruby-identifier">warning</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">text</span>, <span class="ruby-identifier">sfi</span>, <span class="ruby-identifier">data</span>)
1296
+ 214: <span class="ruby-keyword kw">else</span>
1297
+ 215: <span class="ruby-ivar">@messageHandler</span>.<span class="ruby-identifier">warning</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">text</span>, <span class="ruby-identifier">sfi</span>, <span class="ruby-identifier">data</span>)
1298
+ 216: <span class="ruby-keyword kw">end</span>
1299
+ 217: <span class="ruby-keyword kw">end</span></pre>
1265
1300
  </div>
1266
1301
 
1267
1302
  </div>
@@ -1298,31 +1333,30 @@ href="TextParser.html#method-i-parse">TextParser#parse</a>.
1298
1333
  <div class="method-source-code"
1299
1334
  id="check-ule-source">
1300
1335
  <pre>
1301
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 262</span>
1302
- 262: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">checkRule</span>(<span class="ruby-identifier">rule</span>)
1303
- 263: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">patterns</span>.<span class="ruby-identifier">empty?</span>
1304
- 264: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Rule #{rule.name} must have at least one pattern&quot;</span>
1305
- 265: <span class="ruby-keyword kw">end</span>
1306
- 266:
1307
- 267: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">patterns</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">pat</span><span class="ruby-operator">|</span>
1308
- 268: <span class="ruby-identifier">pat</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">tok</span><span class="ruby-operator">|</span>
1309
- 269: <span class="ruby-identifier">type</span> = <span class="ruby-identifier">tok</span>[<span class="ruby-value">0</span>]
1310
- 270: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">tok</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">1</span>]
1311
- 271: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">type</span> <span class="ruby-operator">==</span> <span class="ruby-value">$$</span>
1312
- 272: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@variables</span>.<span class="ruby-identifier">index</span>(<span class="ruby-identifier">token</span>).<span class="ruby-identifier">nil?</span>
1313
- 273: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'unsupported_token'</span>,
1314
- 274: <span class="ruby-node">&quot;The token #{token} is not supported here.&quot;</span>, <span class="ruby-keyword kw">nil</span>,
1315
- 275: <span class="ruby-identifier">token</span>[<span class="ruby-value">2</span>])
1316
- 276: <span class="ruby-keyword kw">end</span>
1317
- 277: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">type</span> <span class="ruby-operator">==</span> <span class="ruby-value">!!</span>
1318
- 278: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">token</span>].<span class="ruby-identifier">nil?</span>
1319
- 279: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Fatal Error: Reference to unknown rule #{token} in &quot;</span> <span class="ruby-operator">+</span>
1320
- 280: <span class="ruby-node">&quot;pattern '#{pat}' of rule #{rule.name}&quot;</span>
1321
- 281: <span class="ruby-keyword kw">end</span>
1322
- 282: <span class="ruby-keyword kw">end</span>
1323
- 283: <span class="ruby-keyword kw">end</span>
1324
- 284: <span class="ruby-keyword kw">end</span>
1325
- 285: <span class="ruby-keyword kw">end</span></pre>
1336
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 277</span>
1337
+ 277: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">checkRule</span>(<span class="ruby-identifier">rule</span>)
1338
+ 278: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">patterns</span>.<span class="ruby-identifier">empty?</span>
1339
+ 279: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Rule #{rule.name} must have at least one pattern&quot;</span>
1340
+ 280: <span class="ruby-keyword kw">end</span>
1341
+ 281:
1342
+ 282: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">patterns</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">pat</span><span class="ruby-operator">|</span>
1343
+ 283: <span class="ruby-identifier">pat</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">tok</span><span class="ruby-operator">|</span>
1344
+ 284: <span class="ruby-identifier">type</span> = <span class="ruby-identifier">tok</span>[<span class="ruby-value">0</span>]
1345
+ 285: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">tok</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">1</span>]
1346
+ 286: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">type</span> <span class="ruby-operator">==</span> <span class="ruby-value">$$</span>
1347
+ 287: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@variables</span>.<span class="ruby-identifier">index</span>(<span class="ruby-identifier">token</span>).<span class="ruby-identifier">nil?</span>
1348
+ 288: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'unsupported_token'</span>,
1349
+ 289: <span class="ruby-node">&quot;The token #{token} is not supported here.&quot;</span>, <span class="ruby-identifier">token</span>[<span class="ruby-value">2</span>])
1350
+ 290: <span class="ruby-keyword kw">end</span>
1351
+ 291: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">type</span> <span class="ruby-operator">==</span> <span class="ruby-value">!!</span>
1352
+ 292: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">token</span>].<span class="ruby-identifier">nil?</span>
1353
+ 293: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Fatal Error: Reference to unknown rule #{token} in &quot;</span> <span class="ruby-operator">+</span>
1354
+ 294: <span class="ruby-node">&quot;pattern '#{pat}' of rule #{rule.name}&quot;</span>
1355
+ 295: <span class="ruby-keyword kw">end</span>
1356
+ 296: <span class="ruby-keyword kw">end</span>
1357
+ 297: <span class="ruby-keyword kw">end</span>
1358
+ 298: <span class="ruby-keyword kw">end</span>
1359
+ 299: <span class="ruby-keyword kw">end</span></pre>
1326
1360
  </div>
1327
1361
 
1328
1362
  </div>
@@ -1353,55 +1387,55 @@ href="TextParser.html#method-i-parse">TextParser#parse</a>.
1353
1387
  <div class="method-source-code"
1354
1388
  id="find-attern-source">
1355
1389
  <pre>
1356
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 524</span>
1357
- 524: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">findPattern</span>(<span class="ruby-identifier">rule</span>, <span class="ruby-identifier">token</span>, <span class="ruby-identifier">repeatMode</span>)
1358
- 525: <span class="ruby-comment cmt"># The scanner cannot differentiate between keywords and identifiers. So</span>
1359
- 526: <span class="ruby-comment cmt"># whenever an identifier is returned we have to see if we have a</span>
1360
- 527: <span class="ruby-comment cmt"># matching keyword first. If none is found, then look for normal</span>
1361
- 528: <span class="ruby-comment cmt"># identifiers.</span>
1362
- 529: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">'ID'</span>
1363
- 530: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">patIdx</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">matchingPatternIndex</span>(<span class="ruby-value str">'_'</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">1</span>])).<span class="ruby-identifier">nil?</span>
1364
- 531: <span class="ruby-identifier">patIdx</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">matchingPatternIndex</span>(<span class="ruby-value str">&quot;$ID&quot;</span>)
1365
- 532: <span class="ruby-keyword kw">end</span>
1366
- 533: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">'LITERAL'</span>
1367
- 534: <span class="ruby-identifier">patIdx</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">matchingPatternIndex</span>(<span class="ruby-value str">'_'</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">1</span>])
1368
- 535: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-keyword kw">false</span>
1369
- 536: <span class="ruby-identifier">patIdx</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">matchingPatternIndex</span>(<span class="ruby-value str">'.'</span>)
1370
- 537: <span class="ruby-keyword kw">else</span>
1371
- 538: <span class="ruby-identifier">patIdx</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">matchingPatternIndex</span>(<span class="ruby-value str">'$'</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>])
1372
- 539: <span class="ruby-keyword kw">end</span>
1373
- 540:
1374
- 541: <span class="ruby-comment cmt"># If no matching pattern is found for the token we have to check if the</span>
1375
- 542: <span class="ruby-comment cmt"># rule is optional or we are in repeat mode. If this is the case, return</span>
1376
- 543: <span class="ruby-comment cmt"># the token back to the scanner. Otherwise, we have found a token we</span>
1377
- 544: <span class="ruby-comment cmt"># cannot handle at this point.</span>
1378
- 545: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">patIdx</span>.<span class="ruby-identifier">nil?</span>
1379
- 546: <span class="ruby-comment cmt"># Append the list of expected tokens to the @@expectedToken array.</span>
1380
- 547: <span class="ruby-comment cmt"># This may be used in a later rule to provide more details when an</span>
1381
- 548: <span class="ruby-comment cmt"># error occured.</span>
1382
- 549: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">transitions</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">transition</span><span class="ruby-operator">|</span>
1383
- 550: <span class="ruby-identifier">keys</span> = <span class="ruby-identifier">transition</span>.<span class="ruby-identifier">keys</span>
1384
- 551: <span class="ruby-identifier">keys</span>.<span class="ruby-identifier">collect!</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">key</span><span class="ruby-operator">|</span> <span class="ruby-identifier">key</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">1</span>] }
1385
- 552: <span class="ruby-identifier">@@expectedTokens</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">keys</span>
1386
- 553: <span class="ruby-identifier">@@expectedTokens</span>.<span class="ruby-identifier">sort!</span>
1387
- 554: <span class="ruby-keyword kw">end</span>
1388
- 555:
1389
- 556: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">optional?</span>(<span class="ruby-ivar">@rules</span>) <span class="ruby-operator">||</span> <span class="ruby-identifier">repeatMode</span>
1390
- 557: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'unexpctd_token'</span>,
1391
- 558: (<span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">!=</span> <span class="ruby-keyword kw">false</span> <span class="ruby-operator">?</span>
1392
- 559: <span class="ruby-node">&quot;Unexpected token '#{token[1]}' of type &quot;</span> <span class="ruby-operator">+</span>
1393
- 560: <span class="ruby-node">&quot;'#{token[0]}'. &quot;</span> <span class="ruby-operator">:</span>
1394
- 561: <span class="ruby-node">&quot;Unexpected end of file in #{@scanner.fileName}. &quot;</span>) <span class="ruby-operator">+</span>
1395
- 562: (<span class="ruby-identifier">@@expectedTokens</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">1</span> <span class="ruby-operator">?</span>
1396
- 563: <span class="ruby-node">&quot;Expecting one of #{@@expectedTokens.join(', ')}&quot;</span> <span class="ruby-operator">:</span>
1397
- 564: <span class="ruby-node">&quot;Expecting #{@@expectedTokens[0]}&quot;</span>))
1398
- 565: <span class="ruby-keyword kw">end</span>
1399
- 566: <span class="ruby-identifier">returnToken</span>(<span class="ruby-identifier">token</span>)
1400
- 567: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span>
1401
- 568: <span class="ruby-keyword kw">end</span>
1402
- 569:
1403
- 570: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">pattern</span>(<span class="ruby-identifier">patIdx</span>)
1404
- 571: <span class="ruby-keyword kw">end</span></pre>
1390
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 537</span>
1391
+ 537: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">findPattern</span>(<span class="ruby-identifier">rule</span>, <span class="ruby-identifier">token</span>, <span class="ruby-identifier">repeatMode</span>)
1392
+ 538: <span class="ruby-comment cmt"># The scanner cannot differentiate between keywords and identifiers. So</span>
1393
+ 539: <span class="ruby-comment cmt"># whenever an identifier is returned we have to see if we have a</span>
1394
+ 540: <span class="ruby-comment cmt"># matching keyword first. If none is found, then look for normal</span>
1395
+ 541: <span class="ruby-comment cmt"># identifiers.</span>
1396
+ 542: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">'ID'</span>
1397
+ 543: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">patIdx</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">matchingPatternIndex</span>(<span class="ruby-value str">'_'</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">1</span>])).<span class="ruby-identifier">nil?</span>
1398
+ 544: <span class="ruby-identifier">patIdx</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">matchingPatternIndex</span>(<span class="ruby-value str">&quot;$ID&quot;</span>)
1399
+ 545: <span class="ruby-keyword kw">end</span>
1400
+ 546: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">'LITERAL'</span>
1401
+ 547: <span class="ruby-identifier">patIdx</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">matchingPatternIndex</span>(<span class="ruby-value str">'_'</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">1</span>])
1402
+ 548: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-keyword kw">false</span>
1403
+ 549: <span class="ruby-identifier">patIdx</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">matchingPatternIndex</span>(<span class="ruby-value str">'.'</span>)
1404
+ 550: <span class="ruby-keyword kw">else</span>
1405
+ 551: <span class="ruby-identifier">patIdx</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">matchingPatternIndex</span>(<span class="ruby-value str">'$'</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>])
1406
+ 552: <span class="ruby-keyword kw">end</span>
1407
+ 553:
1408
+ 554: <span class="ruby-comment cmt"># If no matching pattern is found for the token we have to check if the</span>
1409
+ 555: <span class="ruby-comment cmt"># rule is optional or we are in repeat mode. If this is the case, return</span>
1410
+ 556: <span class="ruby-comment cmt"># the token back to the scanner. Otherwise, we have found a token we</span>
1411
+ 557: <span class="ruby-comment cmt"># cannot handle at this point.</span>
1412
+ 558: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">patIdx</span>.<span class="ruby-identifier">nil?</span>
1413
+ 559: <span class="ruby-comment cmt"># Append the list of expected tokens to the @@expectedToken array.</span>
1414
+ 560: <span class="ruby-comment cmt"># This may be used in a later rule to provide more details when an</span>
1415
+ 561: <span class="ruby-comment cmt"># error occured.</span>
1416
+ 562: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">transitions</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">transition</span><span class="ruby-operator">|</span>
1417
+ 563: <span class="ruby-identifier">keys</span> = <span class="ruby-identifier">transition</span>.<span class="ruby-identifier">keys</span>
1418
+ 564: <span class="ruby-identifier">keys</span>.<span class="ruby-identifier">collect!</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">key</span><span class="ruby-operator">|</span> <span class="ruby-identifier">key</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">1</span>] }
1419
+ 565: <span class="ruby-identifier">@@expectedTokens</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">keys</span>
1420
+ 566: <span class="ruby-identifier">@@expectedTokens</span>.<span class="ruby-identifier">sort!</span>
1421
+ 567: <span class="ruby-keyword kw">end</span>
1422
+ 568:
1423
+ 569: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">optional?</span>(<span class="ruby-ivar">@rules</span>) <span class="ruby-operator">||</span> <span class="ruby-identifier">repeatMode</span>
1424
+ 570: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'unexpctd_token'</span>,
1425
+ 571: (<span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">!=</span> <span class="ruby-keyword kw">false</span> <span class="ruby-operator">?</span>
1426
+ 572: <span class="ruby-node">&quot;Unexpected token '#{token[1]}' of type &quot;</span> <span class="ruby-operator">+</span>
1427
+ 573: <span class="ruby-node">&quot;'#{token[0]}'. &quot;</span> <span class="ruby-operator">:</span>
1428
+ 574: <span class="ruby-node">&quot;Unexpected end of file in #{@scanner.fileName}. &quot;</span>) <span class="ruby-operator">+</span>
1429
+ 575: (<span class="ruby-identifier">@@expectedTokens</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">1</span> <span class="ruby-operator">?</span>
1430
+ 576: <span class="ruby-node">&quot;Expecting one of #{@@expectedTokens.join(', ')}&quot;</span> <span class="ruby-operator">:</span>
1431
+ 577: <span class="ruby-node">&quot;Expecting #{@@expectedTokens[0]}&quot;</span>), <span class="ruby-identifier">token</span>[<span class="ruby-value">2</span>])
1432
+ 578: <span class="ruby-keyword kw">end</span>
1433
+ 579: <span class="ruby-identifier">returnToken</span>(<span class="ruby-identifier">token</span>)
1434
+ 580: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span>
1435
+ 581: <span class="ruby-keyword kw">end</span>
1436
+ 582:
1437
+ 583: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">pattern</span>(<span class="ruby-identifier">patIdx</span>)
1438
+ 584: <span class="ruby-keyword kw">end</span></pre>
1405
1439
  </div>
1406
1440
 
1407
1441
  </div>
@@ -1432,21 +1466,17 @@ href="TextParser.html#method-i-parse">TextParser#parse</a>.
1432
1466
  <div class="method-source-code"
1433
1467
  id="get-ext-oken-source">
1434
1468
  <pre>
1435
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 509</span>
1436
- 509: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getNextToken</span>
1437
- 510: <span class="ruby-keyword kw">begin</span>
1438
- 511: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">nextToken</span>
1439
- 512: <span class="ruby-comment cmt">#Log &lt;&lt; &quot;Token: [#{token[0]}][#{token[1]}]&quot;</span>
1440
- 513: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">TjException</span>
1441
- 514: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'parse_rule'</span>, <span class="ruby-identifier">$!</span>.<span class="ruby-identifier">message</span>)
1442
- 515: <span class="ruby-keyword kw">end</span>
1443
- 516: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@badVariables</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>])
1444
- 517: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'unsupported_token'</span>,
1445
- 518: <span class="ruby-node">&quot;The token #{token[1]} is not supported in this context.&quot;</span>,
1446
- 519: <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">token</span>[<span class="ruby-value">2</span>])
1447
- 520: <span class="ruby-keyword kw">end</span>
1448
- 521: <span class="ruby-identifier">token</span>
1449
- 522: <span class="ruby-keyword kw">end</span></pre>
1469
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 526</span>
1470
+ 526: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getNextToken</span>
1471
+ 527: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">nextToken</span>
1472
+ 528: <span class="ruby-comment cmt">#Log &lt;&lt; &quot;Token: [#{token[0]}][#{token[1]}]&quot;</span>
1473
+ 529: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@badVariables</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>])
1474
+ 530: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'unsupported_token'</span>,
1475
+ 531: <span class="ruby-node">&quot;The token #{token[1]} is not supported in this context.&quot;</span>,
1476
+ 532: <span class="ruby-identifier">token</span>[<span class="ruby-value">2</span>])
1477
+ 533: <span class="ruby-keyword kw">end</span>
1478
+ 534: <span class="ruby-identifier">token</span>
1479
+ 535: <span class="ruby-keyword kw">end</span></pre>
1450
1480
  </div>
1451
1481
 
1452
1482
  </div>
@@ -1484,56 +1514,56 @@ in a token -> rule hash.
1484
1514
  <div class="method-source-code"
1485
1515
  id="get-ransitions-source">
1486
1516
  <pre>
1487
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 212</span>
1488
- 212: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getTransitions</span>(<span class="ruby-identifier">rule</span>)
1489
- 213: <span class="ruby-comment cmt"># If we have processed this rule before we can just return a copy</span>
1490
- 214: <span class="ruby-comment cmt"># of the transitions of this rule. This avoids endless recursions.</span>
1491
- 215: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">transitions</span>.<span class="ruby-identifier">dup</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">transitions</span>.<span class="ruby-identifier">empty?</span>
1492
- 216:
1493
- 217: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">transitions</span> = []
1494
- 218: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">patterns</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">pat</span><span class="ruby-operator">|</span>
1495
- 219: <span class="ruby-identifier">allTokensOptional</span> = <span class="ruby-keyword kw">true</span>
1496
- 220: <span class="ruby-identifier">transitions</span> = { }
1497
- 221: <span class="ruby-identifier">pat</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">token</span><span class="ruby-operator">|</span>
1498
- 222: <span class="ruby-identifier">tokenId</span> = <span class="ruby-identifier">token</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">1</span>]
1499
- 223: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">!!</span>
1500
- 224: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@rules</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-identifier">tokenId</span>)
1501
- 225: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Fatal Error: Unknown reference to #{tokenId} in pattern &quot;</span> <span class="ruby-operator">+</span>
1502
- 226: <span class="ruby-node">&quot;#{pat} + of rule #{rule.name}&quot;</span>
1503
- 227: <span class="ruby-keyword kw">end</span>
1504
- 228: <span class="ruby-identifier">refRule</span> = <span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">tokenId</span>]
1505
- 229: <span class="ruby-comment cmt"># If the referenced rule describes optional content, we need to look</span>
1506
- 230: <span class="ruby-comment cmt"># at the next token as well.</span>
1507
- 231: <span class="ruby-identifier">res</span> = <span class="ruby-identifier">getTransitions</span>(<span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">tokenId</span>])
1508
- 232: <span class="ruby-identifier">allTokensOptional</span> = <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">refRule</span>.<span class="ruby-identifier">optional?</span>(<span class="ruby-ivar">@rules</span>)
1509
- 233: <span class="ruby-comment cmt"># Combine the hashes for each pattern into a single hash</span>
1510
- 234: <span class="ruby-identifier">res</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">pat_i</span><span class="ruby-operator">|</span>
1511
- 235: <span class="ruby-identifier">pat_i</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">tok</span>, <span class="ruby-identifier">r</span><span class="ruby-operator">|</span> <span class="ruby-identifier">transitions</span>[<span class="ruby-identifier">tok</span>] = <span class="ruby-identifier">r</span> }
1512
- 236: <span class="ruby-keyword kw">end</span>
1513
- 237: <span class="ruby-identifier">optional</span> = <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">refRule</span>.<span class="ruby-identifier">optional</span>
1514
- 238: <span class="ruby-keyword kw">elsif</span> <span class="ruby-value str">'_$.'</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>])
1515
- 239: <span class="ruby-identifier">transitions</span>[<span class="ruby-identifier">token</span>] = <span class="ruby-identifier">rule</span>
1516
- 240: <span class="ruby-identifier">allTokensOptional</span> = <span class="ruby-keyword kw">false</span>
1517
- 241: <span class="ruby-keyword kw">else</span>
1518
- 242: <span class="ruby-identifier">raise</span> <span class="ruby-value str">'Fatal Error: Illegal token type specifier used for token'</span> <span class="ruby-operator">+</span>
1519
- 243: <span class="ruby-node">&quot;: #{tokenId}&quot;</span>
1520
- 244: <span class="ruby-keyword kw">end</span>
1521
- 245: <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">allTokensOptional</span>
1522
- 246: <span class="ruby-keyword kw">end</span>
1523
- 247: <span class="ruby-comment cmt"># Make sure that we only have one possible transition for each</span>
1524
- 248: <span class="ruby-comment cmt"># target.</span>
1525
- 249: <span class="ruby-identifier">transitions</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">key</span>, <span class="ruby-identifier">value</span><span class="ruby-operator">|</span>
1526
- 250: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">transitions</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">trans</span><span class="ruby-operator">|</span>
1527
- 251: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">trans</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-identifier">key</span>)
1528
- 252: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Fatal Error: Rule #{rule.name} has ambiguous &quot;</span> <span class="ruby-operator">+</span>
1529
- 253: <span class="ruby-node">&quot;transitions for target #{key}&quot;</span>
1530
- 254: <span class="ruby-keyword kw">end</span>
1531
- 255: <span class="ruby-keyword kw">end</span>
1532
- 256: <span class="ruby-keyword kw">end</span>
1533
- 257: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">transitions</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">transitions</span>
1534
- 258: <span class="ruby-keyword kw">end</span>
1535
- 259: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">transitions</span>.<span class="ruby-identifier">dup</span>
1536
- 260: <span class="ruby-keyword kw">end</span></pre>
1517
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 227</span>
1518
+ 227: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getTransitions</span>(<span class="ruby-identifier">rule</span>)
1519
+ 228: <span class="ruby-comment cmt"># If we have processed this rule before we can just return a copy</span>
1520
+ 229: <span class="ruby-comment cmt"># of the transitions of this rule. This avoids endless recursions.</span>
1521
+ 230: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">transitions</span>.<span class="ruby-identifier">dup</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">transitions</span>.<span class="ruby-identifier">empty?</span>
1522
+ 231:
1523
+ 232: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">transitions</span> = []
1524
+ 233: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">patterns</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">pat</span><span class="ruby-operator">|</span>
1525
+ 234: <span class="ruby-identifier">allTokensOptional</span> = <span class="ruby-keyword kw">true</span>
1526
+ 235: <span class="ruby-identifier">transitions</span> = { }
1527
+ 236: <span class="ruby-identifier">pat</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">token</span><span class="ruby-operator">|</span>
1528
+ 237: <span class="ruby-identifier">tokenId</span> = <span class="ruby-identifier">token</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">1</span>]
1529
+ 238: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">!!</span>
1530
+ 239: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@rules</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-identifier">tokenId</span>)
1531
+ 240: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Fatal Error: Unknown reference to #{tokenId} in pattern &quot;</span> <span class="ruby-operator">+</span>
1532
+ 241: <span class="ruby-node">&quot;#{pat} + of rule #{rule.name}&quot;</span>
1533
+ 242: <span class="ruby-keyword kw">end</span>
1534
+ 243: <span class="ruby-identifier">refRule</span> = <span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">tokenId</span>]
1535
+ 244: <span class="ruby-comment cmt"># If the referenced rule describes optional content, we need to look</span>
1536
+ 245: <span class="ruby-comment cmt"># at the next token as well.</span>
1537
+ 246: <span class="ruby-identifier">res</span> = <span class="ruby-identifier">getTransitions</span>(<span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">tokenId</span>])
1538
+ 247: <span class="ruby-identifier">allTokensOptional</span> = <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">refRule</span>.<span class="ruby-identifier">optional?</span>(<span class="ruby-ivar">@rules</span>)
1539
+ 248: <span class="ruby-comment cmt"># Combine the hashes for each pattern into a single hash</span>
1540
+ 249: <span class="ruby-identifier">res</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">pat_i</span><span class="ruby-operator">|</span>
1541
+ 250: <span class="ruby-identifier">pat_i</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">tok</span>, <span class="ruby-identifier">r</span><span class="ruby-operator">|</span> <span class="ruby-identifier">transitions</span>[<span class="ruby-identifier">tok</span>] = <span class="ruby-identifier">r</span> }
1542
+ 251: <span class="ruby-keyword kw">end</span>
1543
+ 252: <span class="ruby-keyword kw">elsif</span> <span class="ruby-value str">'_$.'</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>])
1544
+ 253: <span class="ruby-identifier">transitions</span>[<span class="ruby-identifier">token</span>] = <span class="ruby-identifier">rule</span>
1545
+ 254: <span class="ruby-identifier">allTokensOptional</span> = <span class="ruby-keyword kw">false</span>
1546
+ 255: <span class="ruby-keyword kw">else</span>
1547
+ 256: <span class="ruby-identifier">raise</span> <span class="ruby-value str">'Fatal Error: Illegal token type specifier used for token'</span> <span class="ruby-operator">+</span>
1548
+ 257: <span class="ruby-node">&quot;: #{tokenId}&quot;</span>
1549
+ 258: <span class="ruby-keyword kw">end</span>
1550
+ 259: <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">allTokensOptional</span>
1551
+ 260: <span class="ruby-keyword kw">end</span>
1552
+ 261: <span class="ruby-comment cmt"># Make sure that we only have one possible transition for each</span>
1553
+ 262: <span class="ruby-comment cmt"># target.</span>
1554
+ 263: <span class="ruby-identifier">transitions</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">key</span>, <span class="ruby-identifier">value</span><span class="ruby-operator">|</span>
1555
+ 264: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">transitions</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">trans</span><span class="ruby-operator">|</span>
1556
+ 265: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">trans</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-identifier">key</span>)
1557
+ 266: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">dump</span>
1558
+ 267: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Fatal Error: Rule #{rule.name} has ambiguous &quot;</span> <span class="ruby-operator">+</span>
1559
+ 268: <span class="ruby-node">&quot;transitions for target #{key}&quot;</span>
1560
+ 269: <span class="ruby-keyword kw">end</span>
1561
+ 270: <span class="ruby-keyword kw">end</span>
1562
+ 271: <span class="ruby-keyword kw">end</span>
1563
+ 272: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">transitions</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">transitions</span>
1564
+ 273: <span class="ruby-keyword kw">end</span>
1565
+ 274: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">transitions</span>.<span class="ruby-identifier">dup</span>
1566
+ 275: <span class="ruby-keyword kw">end</span></pre>
1537
1567
  </div>
1538
1568
 
1539
1569
  </div>
@@ -1572,145 +1602,145 @@ code, we use that by default.
1572
1602
  <div class="method-source-code"
1573
1603
  id="parse-ule--source">
1574
1604
  <pre>
1575
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 370</span>
1576
- 370: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">parseRuleNR</span>(<span class="ruby-identifier">rule</span>)
1577
- 371: <span class="ruby-identifier">elementIdx</span> = <span class="ruby-value">0</span>
1578
- 372: <span class="ruby-identifier">recursionResult</span> = <span class="ruby-keyword kw">nil</span>
1579
- 373: <span class="ruby-comment cmt"># These flags are used to managed the control flow to and from the</span>
1580
- 374: <span class="ruby-comment cmt"># recursion point.</span>
1581
- 375: <span class="ruby-identifier">recur</span> = <span class="ruby-identifier">resume</span> = <span class="ruby-keyword kw">false</span>
1582
- 376: <span class="ruby-comment cmt"># The stack that holds the context for the recursion levels. It's either</span>
1583
- 377: <span class="ruby-comment cmt"># just a rule to start a new recursion or an Array of state variables.</span>
1584
- 378: <span class="ruby-identifier">recursionStack</span> = [ <span class="ruby-identifier">rule</span> ]
1585
- 379: <span class="ruby-keyword kw">begin</span>
1586
- 380: <span class="ruby-comment cmt"># Pop the top entry from the recursion stack.</span>
1587
- 381: <span class="ruby-identifier">se</span> = <span class="ruby-identifier">recursionStack</span>.<span class="ruby-identifier">pop</span>
1588
- 382: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">se</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Array</span>)
1589
- 383: <span class="ruby-comment cmt"># We have essentially finished a recursion level and need to get</span>
1590
- 384: <span class="ruby-comment cmt"># back to the place where we started the recursion. First, we need</span>
1591
- 385: <span class="ruby-comment cmt"># to restore the state again.</span>
1592
- 386: <span class="ruby-identifier">rule</span>, <span class="ruby-identifier">pattern</span>, <span class="ruby-identifier">elementIdx</span>, <span class="ruby-identifier">result</span>, <span class="ruby-identifier">repeatMode</span>, <span class="ruby-identifier">sfi</span> = <span class="ruby-identifier">se</span>
1593
- 387: <span class="ruby-comment cmt">#Log &lt;&lt; &quot;Recursion loop started in resume mode for rule #{rule.name}&quot;</span>
1594
- 388: <span class="ruby-comment cmt"># Now jump to the recursion point without doing anything else.</span>
1595
- 389: <span class="ruby-identifier">resume</span> = <span class="ruby-keyword kw">true</span>
1596
- 390: <span class="ruby-keyword kw">else</span>
1597
- 391: <span class="ruby-comment cmt"># Start a new recursion level. The rule tells us how to interpret</span>
1598
- 392: <span class="ruby-comment cmt"># the input text.</span>
1599
- 393: <span class="ruby-identifier">rule</span> = <span class="ruby-identifier">se</span>
1600
- 394: <span class="ruby-comment cmt">#Log.enter('parseRuleNR', &quot;Parsing with rule #{rule.name}&quot;)</span>
1601
- 395: <span class="ruby-identifier">resume</span> = <span class="ruby-keyword kw">false</span>
1602
- 396: <span class="ruby-keyword kw">end</span>
1603
- 397:
1604
- 398: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">resume</span>
1605
- 399: <span class="ruby-identifier">result</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">repeatable</span> <span class="ruby-operator">?</span> <span class="ruby-constant">TextParserResultArray</span>.<span class="ruby-identifier">new</span> <span class="ruby-operator">:</span> <span class="ruby-keyword kw">nil</span>
1606
- 400: <span class="ruby-comment cmt"># Rules can be marked 'repeatable'. This flag will be set to true</span>
1607
- 401: <span class="ruby-comment cmt"># after the first iteration has been completed.</span>
1608
- 402: <span class="ruby-identifier">repeatMode</span> = <span class="ruby-keyword kw">false</span>
1609
- 403: <span class="ruby-keyword kw">end</span>
1610
- 404:
1611
- 405: <span class="ruby-identifier">loop</span> <span class="ruby-keyword kw">do</span>
1612
- 406: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">resume</span>
1613
- 407: <span class="ruby-comment cmt"># At the beginning of a rule we need a token from the input to</span>
1614
- 408: <span class="ruby-comment cmt"># determine which pattern of the rule needs to be processed.</span>
1615
- 409: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">getNextToken</span>
1616
- 410:
1617
- 411: <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">pattern</span> = <span class="ruby-identifier">findPattern</span>(<span class="ruby-identifier">rule</span>, <span class="ruby-identifier">token</span>, <span class="ruby-identifier">repeatMode</span>))
1618
- 412: <span class="ruby-comment cmt"># The @stack will store the resulting value of each element in the</span>
1619
- 413: <span class="ruby-comment cmt"># pattern.</span>
1620
- 414: <span class="ruby-ivar">@stack</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">TextParser</span><span class="ruby-operator">::</span><span class="ruby-constant">StackElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">function</span>)
1621
- 415:
1622
- 416: <span class="ruby-comment cmt"># Once we've found the right pattern, we need to process each</span>
1623
- 417: <span class="ruby-comment cmt"># element.</span>
1624
- 418: <span class="ruby-identifier">elementIdx</span> = <span class="ruby-value">0</span>
1625
- 419: <span class="ruby-keyword kw">end</span>
1626
- 420:
1627
- 421: <span class="ruby-identifier">elementCount</span> = <span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">length</span>
1628
- 422: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">elementIdx</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">elementCount</span>
1629
- 423: <span class="ruby-identifier">element</span> = <span class="ruby-identifier">pattern</span>[<span class="ruby-identifier">elementIdx</span>]
1630
- 424: <span class="ruby-comment cmt"># Separate the type and token text for pattern element.</span>
1631
- 425: <span class="ruby-identifier">elType</span> = <span class="ruby-identifier">element</span>[<span class="ruby-value">0</span>]
1632
- 426: <span class="ruby-identifier">elToken</span> = <span class="ruby-identifier">element</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">1</span>]
1633
- 427: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">elType</span> <span class="ruby-operator">==</span> <span class="ruby-value">!!</span>
1634
- 428: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">resume</span>
1635
- 429: <span class="ruby-comment cmt"># The element is a reference to another rule. Return the token</span>
1636
- 430: <span class="ruby-comment cmt"># if we still have one and continue with the referenced rule.</span>
1637
- 431: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">token</span>
1638
- 432: <span class="ruby-identifier">sfi</span> = <span class="ruby-identifier">token</span>[<span class="ruby-value">2</span>]
1639
- 433: <span class="ruby-identifier">returnToken</span>(<span class="ruby-identifier">token</span>)
1640
- 434: <span class="ruby-identifier">token</span> = <span class="ruby-keyword kw">nil</span>
1641
- 435: <span class="ruby-keyword kw">else</span>
1642
- 436: <span class="ruby-identifier">sfi</span> = <span class="ruby-keyword kw">nil</span>
1643
- 437: <span class="ruby-keyword kw">end</span>
1644
- 438: <span class="ruby-comment cmt"># This is where the recursion would happen. Instead, we push</span>
1645
- 439: <span class="ruby-comment cmt"># the state variables and then the next rule onto the</span>
1646
- 440: <span class="ruby-comment cmt"># recursion stack.</span>
1647
- 441: <span class="ruby-identifier">recursionStack</span>.<span class="ruby-identifier">push</span>([ <span class="ruby-identifier">rule</span>, <span class="ruby-identifier">pattern</span>, <span class="ruby-identifier">elementIdx</span>, <span class="ruby-identifier">result</span>,
1648
- 442: <span class="ruby-identifier">repeatMode</span>, <span class="ruby-identifier">sfi</span> ])
1649
- 443: <span class="ruby-identifier">recursionStack</span>.<span class="ruby-identifier">push</span>(<span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">elToken</span>])
1650
- 444: <span class="ruby-comment cmt"># Now terminate all but the outer loops without doing anything</span>
1651
- 445: <span class="ruby-comment cmt"># else.</span>
1652
- 446: <span class="ruby-identifier">recur</span> = <span class="ruby-keyword kw">true</span>
1653
- 447: <span class="ruby-keyword kw">break</span>
1654
- 448: <span class="ruby-keyword kw">else</span>
1655
- 449: <span class="ruby-comment cmt"># We're back right after where the recursion started. Store</span>
1656
- 450: <span class="ruby-comment cmt"># the result and turn resume mode off again.</span>
1657
- 451: <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">store</span>(<span class="ruby-identifier">recursionResult</span>, <span class="ruby-identifier">sfi</span>)
1658
- 452: <span class="ruby-identifier">resume</span> = <span class="ruby-keyword kw">false</span>
1659
- 453: <span class="ruby-keyword kw">end</span>
1660
- 454: <span class="ruby-keyword kw">else</span>
1661
- 455: <span class="ruby-comment cmt"># In case the element is a keyword or variable we have to get a</span>
1662
- 456: <span class="ruby-comment cmt"># new token if we don't have one anymore.</span>
1663
- 457: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">getNextToken</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">token</span>
1664
- 458:
1665
- 459: <span class="ruby-identifier">processNormalElements</span>(<span class="ruby-identifier">elType</span>, <span class="ruby-identifier">elToken</span>, <span class="ruby-identifier">token</span>)
1666
- 460:
1667
- 461: <span class="ruby-comment cmt"># The token has been consumed. Reset the variable.</span>
1668
- 462: <span class="ruby-identifier">token</span> = <span class="ruby-keyword kw">nil</span>
1669
- 463: <span class="ruby-identifier">@@expectedTokens</span> = []
1670
- 464: <span class="ruby-keyword kw">end</span>
1671
- 465: <span class="ruby-identifier">elementIdx</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
1672
- 466: <span class="ruby-keyword kw">end</span> <span class="ruby-comment cmt"># of pattern while loop</span>
1673
- 467:
1674
- 468: <span class="ruby-comment cmt"># Skip the rest of the loop in recur mode.</span>
1675
- 469: <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">recur</span>
1676
- 470:
1677
- 471: <span class="ruby-identifier">elementIdx</span> = <span class="ruby-value">0</span>
1678
- 472:
1679
- 473: <span class="ruby-comment cmt"># Once the complete pattern has been processed we call the</span>
1680
- 474: <span class="ruby-comment cmt"># processing function for this pattern to operate on the value</span>
1681
- 475: <span class="ruby-comment cmt"># array. Then pop the entry for this rule from the stack. The</span>
1682
- 476: <span class="ruby-comment cmt"># called function will use @val and @sourceFileInfo to retrieve</span>
1683
- 477: <span class="ruby-comment cmt"># data from the parser.</span>
1684
- 478: <span class="ruby-ivar">@val</span> = <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">val</span>
1685
- 479: <span class="ruby-ivar">@sourceFileInfo</span> = <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">sourceFileInfo</span>
1686
- 480: <span class="ruby-identifier">res</span> = <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">function</span> <span class="ruby-operator">?</span> <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">function</span>.<span class="ruby-identifier">call</span> <span class="ruby-operator">:</span> <span class="ruby-keyword kw">nil</span>
1687
- 481: <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">pop</span>
1688
- 482:
1689
- 483: <span class="ruby-comment cmt"># If the rule is not repeatable we can store the result and break</span>
1690
- 484: <span class="ruby-comment cmt"># the outer loop to exit the function.</span>
1691
- 485: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">repeatable</span>
1692
- 486: <span class="ruby-identifier">result</span> = <span class="ruby-identifier">res</span>
1693
- 487: <span class="ruby-keyword kw">break</span>
1694
- 488: <span class="ruby-keyword kw">end</span>
1605
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 387</span>
1606
+ 387: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">parseRuleNR</span>(<span class="ruby-identifier">rule</span>)
1607
+ 388: <span class="ruby-identifier">elementIdx</span> = <span class="ruby-value">0</span>
1608
+ 389: <span class="ruby-identifier">recursionResult</span> = <span class="ruby-keyword kw">nil</span>
1609
+ 390: <span class="ruby-comment cmt"># These flags are used to managed the control flow to and from the</span>
1610
+ 391: <span class="ruby-comment cmt"># recursion point.</span>
1611
+ 392: <span class="ruby-identifier">recur</span> = <span class="ruby-identifier">resume</span> = <span class="ruby-keyword kw">false</span>
1612
+ 393: <span class="ruby-comment cmt"># The stack that holds the context for the recursion levels. It's either</span>
1613
+ 394: <span class="ruby-comment cmt"># just a rule to start a new recursion or an Array of state variables.</span>
1614
+ 395: <span class="ruby-identifier">recursionStack</span> = [ <span class="ruby-identifier">rule</span> ]
1615
+ 396: <span class="ruby-keyword kw">begin</span>
1616
+ 397: <span class="ruby-comment cmt"># Pop the top entry from the recursion stack.</span>
1617
+ 398: <span class="ruby-identifier">se</span> = <span class="ruby-identifier">recursionStack</span>.<span class="ruby-identifier">pop</span>
1618
+ 399: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">se</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Array</span>)
1619
+ 400: <span class="ruby-comment cmt"># We have essentially finished a recursion level and need to get</span>
1620
+ 401: <span class="ruby-comment cmt"># back to the place where we started the recursion. First, we need</span>
1621
+ 402: <span class="ruby-comment cmt"># to restore the state again.</span>
1622
+ 403: <span class="ruby-identifier">rule</span>, <span class="ruby-identifier">pattern</span>, <span class="ruby-identifier">elementIdx</span>, <span class="ruby-identifier">result</span>, <span class="ruby-identifier">repeatMode</span>, <span class="ruby-identifier">sfi</span> = <span class="ruby-identifier">se</span>
1623
+ 404: <span class="ruby-comment cmt">#Log &lt;&lt; &quot;Recursion loop started in resume mode for rule #{rule.name}&quot;</span>
1624
+ 405: <span class="ruby-comment cmt"># Now jump to the recursion point without doing anything else.</span>
1625
+ 406: <span class="ruby-identifier">resume</span> = <span class="ruby-keyword kw">true</span>
1626
+ 407: <span class="ruby-keyword kw">else</span>
1627
+ 408: <span class="ruby-comment cmt"># Start a new recursion level. The rule tells us how to interpret</span>
1628
+ 409: <span class="ruby-comment cmt"># the input text.</span>
1629
+ 410: <span class="ruby-identifier">rule</span> = <span class="ruby-identifier">se</span>
1630
+ 411: <span class="ruby-comment cmt">#Log.enter('parseRuleNR', &quot;Parsing with rule #{rule.name}&quot;)</span>
1631
+ 412: <span class="ruby-identifier">resume</span> = <span class="ruby-keyword kw">false</span>
1632
+ 413: <span class="ruby-keyword kw">end</span>
1633
+ 414:
1634
+ 415: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">resume</span>
1635
+ 416: <span class="ruby-identifier">result</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">repeatable</span> <span class="ruby-operator">?</span> <span class="ruby-constant">TextParserResultArray</span>.<span class="ruby-identifier">new</span> <span class="ruby-operator">:</span> <span class="ruby-keyword kw">nil</span>
1636
+ 417: <span class="ruby-comment cmt"># Rules can be marked 'repeatable'. This flag will be set to true</span>
1637
+ 418: <span class="ruby-comment cmt"># after the first iteration has been completed.</span>
1638
+ 419: <span class="ruby-identifier">repeatMode</span> = <span class="ruby-keyword kw">false</span>
1639
+ 420: <span class="ruby-keyword kw">end</span>
1640
+ 421:
1641
+ 422: <span class="ruby-identifier">loop</span> <span class="ruby-keyword kw">do</span>
1642
+ 423: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">resume</span>
1643
+ 424: <span class="ruby-comment cmt"># At the beginning of a rule we need a token from the input to</span>
1644
+ 425: <span class="ruby-comment cmt"># determine which pattern of the rule needs to be processed.</span>
1645
+ 426: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">getNextToken</span>
1646
+ 427:
1647
+ 428: <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">pattern</span> = <span class="ruby-identifier">findPattern</span>(<span class="ruby-identifier">rule</span>, <span class="ruby-identifier">token</span>, <span class="ruby-identifier">repeatMode</span>))
1648
+ 429: <span class="ruby-comment cmt"># The @stack will store the resulting value of each element in the</span>
1649
+ 430: <span class="ruby-comment cmt"># pattern.</span>
1650
+ 431: <span class="ruby-ivar">@stack</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">TextParser</span><span class="ruby-operator">::</span><span class="ruby-constant">StackElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">function</span>)
1651
+ 432:
1652
+ 433: <span class="ruby-comment cmt"># Once we've found the right pattern, we need to process each</span>
1653
+ 434: <span class="ruby-comment cmt"># element.</span>
1654
+ 435: <span class="ruby-identifier">elementIdx</span> = <span class="ruby-value">0</span>
1655
+ 436: <span class="ruby-keyword kw">end</span>
1656
+ 437:
1657
+ 438: <span class="ruby-identifier">elementCount</span> = <span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">length</span>
1658
+ 439: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">elementIdx</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">elementCount</span>
1659
+ 440: <span class="ruby-identifier">element</span> = <span class="ruby-identifier">pattern</span>[<span class="ruby-identifier">elementIdx</span>]
1660
+ 441: <span class="ruby-comment cmt"># Separate the type and token text for pattern element.</span>
1661
+ 442: <span class="ruby-identifier">elType</span> = <span class="ruby-identifier">element</span>[<span class="ruby-value">0</span>]
1662
+ 443: <span class="ruby-identifier">elToken</span> = <span class="ruby-identifier">element</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">1</span>]
1663
+ 444: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">elType</span> <span class="ruby-operator">==</span> <span class="ruby-value">!!</span>
1664
+ 445: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">resume</span>
1665
+ 446: <span class="ruby-comment cmt"># The element is a reference to another rule. Return the token</span>
1666
+ 447: <span class="ruby-comment cmt"># if we still have one and continue with the referenced rule.</span>
1667
+ 448: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">token</span>
1668
+ 449: <span class="ruby-identifier">sfi</span> = <span class="ruby-identifier">token</span>[<span class="ruby-value">2</span>]
1669
+ 450: <span class="ruby-identifier">returnToken</span>(<span class="ruby-identifier">token</span>)
1670
+ 451: <span class="ruby-identifier">token</span> = <span class="ruby-keyword kw">nil</span>
1671
+ 452: <span class="ruby-keyword kw">else</span>
1672
+ 453: <span class="ruby-identifier">sfi</span> = <span class="ruby-keyword kw">nil</span>
1673
+ 454: <span class="ruby-keyword kw">end</span>
1674
+ 455: <span class="ruby-comment cmt"># This is where the recursion would happen. Instead, we push</span>
1675
+ 456: <span class="ruby-comment cmt"># the state variables and then the next rule onto the</span>
1676
+ 457: <span class="ruby-comment cmt"># recursion stack.</span>
1677
+ 458: <span class="ruby-identifier">recursionStack</span>.<span class="ruby-identifier">push</span>([ <span class="ruby-identifier">rule</span>, <span class="ruby-identifier">pattern</span>, <span class="ruby-identifier">elementIdx</span>, <span class="ruby-identifier">result</span>,
1678
+ 459: <span class="ruby-identifier">repeatMode</span>, <span class="ruby-identifier">sfi</span> ])
1679
+ 460: <span class="ruby-identifier">recursionStack</span>.<span class="ruby-identifier">push</span>(<span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">elToken</span>])
1680
+ 461: <span class="ruby-comment cmt"># Now terminate all but the outer loops without doing anything</span>
1681
+ 462: <span class="ruby-comment cmt"># else.</span>
1682
+ 463: <span class="ruby-identifier">recur</span> = <span class="ruby-keyword kw">true</span>
1683
+ 464: <span class="ruby-keyword kw">break</span>
1684
+ 465: <span class="ruby-keyword kw">else</span>
1685
+ 466: <span class="ruby-comment cmt"># We're back right after where the recursion started. Store</span>
1686
+ 467: <span class="ruby-comment cmt"># the result and turn resume mode off again.</span>
1687
+ 468: <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">store</span>(<span class="ruby-identifier">recursionResult</span>, <span class="ruby-identifier">sfi</span>)
1688
+ 469: <span class="ruby-identifier">resume</span> = <span class="ruby-keyword kw">false</span>
1689
+ 470: <span class="ruby-keyword kw">end</span>
1690
+ 471: <span class="ruby-keyword kw">else</span>
1691
+ 472: <span class="ruby-comment cmt"># In case the element is a keyword or variable we have to get a</span>
1692
+ 473: <span class="ruby-comment cmt"># new token if we don't have one anymore.</span>
1693
+ 474: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">getNextToken</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">token</span>
1694
+ 475:
1695
+ 476: <span class="ruby-identifier">processNormalElements</span>(<span class="ruby-identifier">elType</span>, <span class="ruby-identifier">elToken</span>, <span class="ruby-identifier">token</span>)
1696
+ 477:
1697
+ 478: <span class="ruby-comment cmt"># The token has been consumed. Reset the variable.</span>
1698
+ 479: <span class="ruby-identifier">token</span> = <span class="ruby-keyword kw">nil</span>
1699
+ 480: <span class="ruby-identifier">@@expectedTokens</span> = []
1700
+ 481: <span class="ruby-keyword kw">end</span>
1701
+ 482: <span class="ruby-identifier">elementIdx</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
1702
+ 483: <span class="ruby-keyword kw">end</span> <span class="ruby-comment cmt"># of pattern while loop</span>
1703
+ 484:
1704
+ 485: <span class="ruby-comment cmt"># Skip the rest of the loop in recur mode.</span>
1705
+ 486: <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">recur</span>
1706
+ 487:
1707
+ 488: <span class="ruby-identifier">elementIdx</span> = <span class="ruby-value">0</span>
1695
1708
  489:
1696
- 490: <span class="ruby-comment cmt"># Otherwise we append the result to the result array and turn repeat</span>
1697
- 491: <span class="ruby-comment cmt"># mode on.</span>
1698
- 492: <span class="ruby-identifier">result</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">res</span>
1699
- 493: <span class="ruby-comment cmt"># We have completed the first iteration. Set the repeat mode flag to</span>
1700
- 494: <span class="ruby-comment cmt"># indicate that further iterations are already re-runs.</span>
1701
- 495: <span class="ruby-identifier">repeatMode</span> = <span class="ruby-keyword kw">true</span>
1702
- 496: <span class="ruby-keyword kw">end</span> <span class="ruby-comment cmt"># of rule processing loop</span>
1703
- 497:
1704
- 498: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">recur</span>
1705
- 499: <span class="ruby-identifier">recur</span> = <span class="ruby-keyword kw">false</span>
1706
- 500: <span class="ruby-keyword kw">else</span>
1707
- 501: <span class="ruby-comment cmt">#Log.exit('parseRuleNR', &quot;Finished rule #{rule.name}&quot;)</span>
1708
- 502: <span class="ruby-identifier">recursionResult</span> = <span class="ruby-identifier">result</span>
1709
- 503: <span class="ruby-keyword kw">end</span>
1710
- 504: <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">while</span> <span class="ruby-operator">!</span><span class="ruby-identifier">recursionStack</span>.<span class="ruby-identifier">empty?</span>
1711
- 505:
1712
- 506: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">result</span>
1713
- 507: <span class="ruby-keyword kw">end</span></pre>
1709
+ 490: <span class="ruby-comment cmt"># Once the complete pattern has been processed we call the</span>
1710
+ 491: <span class="ruby-comment cmt"># processing function for this pattern to operate on the value</span>
1711
+ 492: <span class="ruby-comment cmt"># array. Then pop the entry for this rule from the stack. The</span>
1712
+ 493: <span class="ruby-comment cmt"># called function will use @val and @sourceFileInfo to retrieve</span>
1713
+ 494: <span class="ruby-comment cmt"># data from the parser.</span>
1714
+ 495: <span class="ruby-ivar">@val</span> = <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">val</span>
1715
+ 496: <span class="ruby-ivar">@sourceFileInfo</span> = <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">sourceFileInfo</span>
1716
+ 497: <span class="ruby-identifier">res</span> = <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">function</span> <span class="ruby-operator">?</span> <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">function</span>.<span class="ruby-identifier">call</span> <span class="ruby-operator">:</span> <span class="ruby-keyword kw">nil</span>
1717
+ 498: <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">pop</span>
1718
+ 499:
1719
+ 500: <span class="ruby-comment cmt"># If the rule is not repeatable we can store the result and break</span>
1720
+ 501: <span class="ruby-comment cmt"># the outer loop to exit the function.</span>
1721
+ 502: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">repeatable</span>
1722
+ 503: <span class="ruby-identifier">result</span> = <span class="ruby-identifier">res</span>
1723
+ 504: <span class="ruby-keyword kw">break</span>
1724
+ 505: <span class="ruby-keyword kw">end</span>
1725
+ 506:
1726
+ 507: <span class="ruby-comment cmt"># Otherwise we append the result to the result array and turn repeat</span>
1727
+ 508: <span class="ruby-comment cmt"># mode on.</span>
1728
+ 509: <span class="ruby-identifier">result</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">res</span>
1729
+ 510: <span class="ruby-comment cmt"># We have completed the first iteration. Set the repeat mode flag to</span>
1730
+ 511: <span class="ruby-comment cmt"># indicate that further iterations are already re-runs.</span>
1731
+ 512: <span class="ruby-identifier">repeatMode</span> = <span class="ruby-keyword kw">true</span>
1732
+ 513: <span class="ruby-keyword kw">end</span> <span class="ruby-comment cmt"># of rule processing loop</span>
1733
+ 514:
1734
+ 515: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">recur</span>
1735
+ 516: <span class="ruby-identifier">recur</span> = <span class="ruby-keyword kw">false</span>
1736
+ 517: <span class="ruby-keyword kw">else</span>
1737
+ 518: <span class="ruby-comment cmt">#Log.exit('parseRuleNR', &quot;Finished rule #{rule.name}&quot;)</span>
1738
+ 519: <span class="ruby-identifier">recursionResult</span> = <span class="ruby-identifier">result</span>
1739
+ 520: <span class="ruby-keyword kw">end</span>
1740
+ 521: <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">while</span> <span class="ruby-operator">!</span><span class="ruby-identifier">recursionStack</span>.<span class="ruby-identifier">empty?</span>
1741
+ 522:
1742
+ 523: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">result</span>
1743
+ 524: <span class="ruby-keyword kw">end</span></pre>
1714
1744
  </div>
1715
1745
 
1716
1746
  </div>
@@ -1746,77 +1776,80 @@ has cleaner code and is about 8% faster than parseRuleNR.
1746
1776
  <div class="method-source-code"
1747
1777
  id="parse-ule--source">
1748
1778
  <pre>
1749
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 292</span>
1750
- 292: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">parseRuleR</span>(<span class="ruby-identifier">rule</span>)
1751
- 293: <span class="ruby-comment cmt">#Log.enter('parseRuleR', &quot;Parsing with rule #{rule.name}&quot;)</span>
1752
- 294: <span class="ruby-identifier">result</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">repeatable</span> <span class="ruby-operator">?</span> <span class="ruby-constant">TextParserResultArray</span>.<span class="ruby-identifier">new</span> <span class="ruby-operator">:</span> <span class="ruby-keyword kw">nil</span>
1753
- 295: <span class="ruby-comment cmt"># Rules can be marked 'repeatable'. This flag will be set to true after</span>
1754
- 296: <span class="ruby-comment cmt"># the first iteration has been completed.</span>
1755
- 297: <span class="ruby-identifier">repeatMode</span> = <span class="ruby-keyword kw">false</span>
1756
- 298: <span class="ruby-identifier">loop</span> <span class="ruby-keyword kw">do</span>
1757
- 299: <span class="ruby-comment cmt"># At the beginning of a rule we need a token from the input to determine</span>
1758
- 300: <span class="ruby-comment cmt"># which pattern of the rule needs to be processed.</span>
1759
- 301: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">getNextToken</span>
1760
- 302:
1761
- 303: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">result</span> <span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">pattern</span> = <span class="ruby-identifier">findPattern</span>(<span class="ruby-identifier">rule</span>, <span class="ruby-identifier">token</span>, <span class="ruby-identifier">repeatMode</span>))
1762
- 304: <span class="ruby-comment cmt"># The @stack will store the resulting value of each element in the</span>
1763
- 305: <span class="ruby-comment cmt"># pattern.</span>
1764
- 306: <span class="ruby-ivar">@stack</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">TextParser</span><span class="ruby-operator">::</span><span class="ruby-constant">StackElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">function</span>)
1765
- 307:
1766
- 308: <span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">element</span><span class="ruby-operator">|</span>
1767
- 309: <span class="ruby-comment cmt"># Separate the type and token text for pattern element.</span>
1768
- 310: <span class="ruby-identifier">elType</span> = <span class="ruby-identifier">element</span>[<span class="ruby-value">0</span>]
1769
- 311: <span class="ruby-identifier">elToken</span> = <span class="ruby-identifier">element</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">1</span>]
1770
- 312: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">elType</span> <span class="ruby-operator">==</span> <span class="ruby-value">!!</span>
1771
- 313: <span class="ruby-comment cmt"># The element is a reference to another rule. Return the token if</span>
1772
- 314: <span class="ruby-comment cmt"># we still have one and continue with the referenced rule.</span>
1773
- 315: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">token</span>.<span class="ruby-identifier">nil?</span>
1774
- 316: <span class="ruby-identifier">sfi</span> = <span class="ruby-identifier">token</span>[<span class="ruby-value">2</span>]
1775
- 317: <span class="ruby-identifier">returnToken</span>(<span class="ruby-identifier">token</span>)
1776
- 318: <span class="ruby-identifier">token</span> = <span class="ruby-keyword kw">nil</span>
1777
- 319: <span class="ruby-keyword kw">else</span>
1778
- 320: <span class="ruby-identifier">sfi</span> = <span class="ruby-keyword kw">nil</span>
1779
- 321: <span class="ruby-keyword kw">end</span>
1780
- 322: <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">store</span>(<span class="ruby-identifier">parseRuleR</span>(<span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">elToken</span>]), <span class="ruby-identifier">sfi</span>)
1781
- 323: <span class="ruby-comment cmt">#Log &lt;&lt; &quot;Resuming rule #{rule.name}&quot;</span>
1782
- 324: <span class="ruby-keyword kw">else</span>
1783
- 325: <span class="ruby-comment cmt"># In case the element is a keyword or variable we have to get a new</span>
1784
- 326: <span class="ruby-comment cmt"># token if we don't have one anymore.</span>
1785
- 327: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">getNextToken</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">token</span>
1786
- 328:
1787
- 329: <span class="ruby-identifier">processNormalElements</span>(<span class="ruby-identifier">elType</span>, <span class="ruby-identifier">elToken</span>, <span class="ruby-identifier">token</span>)
1788
- 330:
1789
- 331: <span class="ruby-comment cmt"># The token has been consumed. Reset the variable.</span>
1790
- 332: <span class="ruby-identifier">token</span> = <span class="ruby-keyword kw">nil</span>
1791
- 333: <span class="ruby-identifier">@@expectedTokens</span> = []
1792
- 334: <span class="ruby-keyword kw">end</span>
1793
- 335: <span class="ruby-keyword kw">end</span>
1794
- 336:
1795
- 337: <span class="ruby-comment cmt"># Once the complete pattern has been processed we call the processing</span>
1796
- 338: <span class="ruby-comment cmt"># function for this pattern to operate on the value array. Then pop the</span>
1797
- 339: <span class="ruby-comment cmt"># entry for this rule from the stack.</span>
1798
- 340: <span class="ruby-ivar">@val</span> = <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">val</span>
1799
- 341: <span class="ruby-ivar">@sourceFileInfo</span> = <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">sourceFileInfo</span>
1800
- 342: <span class="ruby-identifier">res</span> = <span class="ruby-keyword kw">nil</span>
1801
- 343: <span class="ruby-identifier">res</span> = <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">function</span>.<span class="ruby-identifier">call</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">function</span>.<span class="ruby-identifier">nil?</span>
1802
- 344: <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">pop</span>
1803
- 345:
1804
- 346: <span class="ruby-comment cmt"># If the rule is not repeatable we can store the result and break the</span>
1805
- 347: <span class="ruby-comment cmt"># outer loop to exit the function.</span>
1806
- 348: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">repeatable</span>
1807
- 349: <span class="ruby-identifier">result</span> = <span class="ruby-identifier">res</span>
1808
- 350: <span class="ruby-keyword kw">break</span>
1779
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 306</span>
1780
+ 306: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">parseRuleR</span>(<span class="ruby-identifier">rule</span>)
1781
+ 307: <span class="ruby-comment cmt">#Log.enter('parseRuleR', &quot;Parsing with rule #{rule.name}&quot;)</span>
1782
+ 308: <span class="ruby-comment cmt">#puts &quot;Parsing with rule #{rule.name}&quot;</span>
1783
+ 309: <span class="ruby-identifier">result</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">repeatable</span> <span class="ruby-operator">?</span> <span class="ruby-constant">TextParserResultArray</span>.<span class="ruby-identifier">new</span> <span class="ruby-operator">:</span> <span class="ruby-keyword kw">nil</span>
1784
+ 310: <span class="ruby-comment cmt"># Rules can be marked 'repeatable'. This flag will be set to true after</span>
1785
+ 311: <span class="ruby-comment cmt"># the first iteration has been completed.</span>
1786
+ 312: <span class="ruby-identifier">repeatMode</span> = <span class="ruby-keyword kw">false</span>
1787
+ 313: <span class="ruby-identifier">loop</span> <span class="ruby-keyword kw">do</span>
1788
+ 314: <span class="ruby-comment cmt"># At the beginning of a rule we need a token from the input to determine</span>
1789
+ 315: <span class="ruby-comment cmt"># which pattern of the rule needs to be processed.</span>
1790
+ 316: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">getNextToken</span>
1791
+ 317:
1792
+ 318: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">result</span> <span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">pattern</span> = <span class="ruby-identifier">findPattern</span>(<span class="ruby-identifier">rule</span>, <span class="ruby-identifier">token</span>, <span class="ruby-identifier">repeatMode</span>))
1793
+ 319: <span class="ruby-comment cmt"># The @stack will store the resulting value of each element in the</span>
1794
+ 320: <span class="ruby-comment cmt"># pattern.</span>
1795
+ 321: <span class="ruby-ivar">@stack</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">TextParser</span><span class="ruby-operator">::</span><span class="ruby-constant">StackElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">function</span>)
1796
+ 322:
1797
+ 323: <span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">element</span><span class="ruby-operator">|</span>
1798
+ 324: <span class="ruby-comment cmt"># Separate the type and token text for pattern element.</span>
1799
+ 325: <span class="ruby-identifier">elType</span> = <span class="ruby-identifier">element</span>[<span class="ruby-value">0</span>]
1800
+ 326: <span class="ruby-identifier">elToken</span> = <span class="ruby-identifier">element</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">1</span>]
1801
+ 327: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">elType</span> <span class="ruby-operator">==</span> <span class="ruby-value">!!</span>
1802
+ 328: <span class="ruby-comment cmt"># The element is a reference to another rule. Return the token if</span>
1803
+ 329: <span class="ruby-comment cmt"># we still have one and continue with the referenced rule.</span>
1804
+ 330: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">token</span>.<span class="ruby-identifier">nil?</span>
1805
+ 331: <span class="ruby-identifier">sfi</span> = <span class="ruby-identifier">token</span>[<span class="ruby-value">2</span>]
1806
+ 332: <span class="ruby-identifier">returnToken</span>(<span class="ruby-identifier">token</span>)
1807
+ 333: <span class="ruby-identifier">token</span> = <span class="ruby-keyword kw">nil</span>
1808
+ 334: <span class="ruby-keyword kw">else</span>
1809
+ 335: <span class="ruby-identifier">sfi</span> = <span class="ruby-keyword kw">nil</span>
1810
+ 336: <span class="ruby-keyword kw">end</span>
1811
+ 337: <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">store</span>(<span class="ruby-identifier">parseRuleR</span>(<span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">elToken</span>]), <span class="ruby-identifier">sfi</span>)
1812
+ 338: <span class="ruby-comment cmt">#Log &lt;&lt; &quot;Resuming rule #{rule.name}&quot;</span>
1813
+ 339: <span class="ruby-comment cmt">#puts &quot;Resuming rule #{rule.name}&quot;</span>
1814
+ 340: <span class="ruby-keyword kw">else</span>
1815
+ 341: <span class="ruby-comment cmt"># In case the element is a keyword or variable we have to get a new</span>
1816
+ 342: <span class="ruby-comment cmt"># token if we don't have one anymore.</span>
1817
+ 343: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">getNextToken</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">token</span>
1818
+ 344:
1819
+ 345: <span class="ruby-identifier">processNormalElements</span>(<span class="ruby-identifier">elType</span>, <span class="ruby-identifier">elToken</span>, <span class="ruby-identifier">token</span>)
1820
+ 346:
1821
+ 347: <span class="ruby-comment cmt"># The token has been consumed. Reset the variable.</span>
1822
+ 348: <span class="ruby-identifier">token</span> = <span class="ruby-keyword kw">nil</span>
1823
+ 349: <span class="ruby-identifier">@@expectedTokens</span> = []
1824
+ 350: <span class="ruby-keyword kw">end</span>
1809
1825
  351: <span class="ruby-keyword kw">end</span>
1810
1826
  352:
1811
- 353: <span class="ruby-comment cmt"># Otherwise we append the result to the result array and turn repeat</span>
1812
- 354: <span class="ruby-comment cmt"># mode on.</span>
1813
- 355: <span class="ruby-identifier">result</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">res</span>
1814
- 356: <span class="ruby-identifier">repeatMode</span> = <span class="ruby-keyword kw">true</span>
1815
- 357: <span class="ruby-keyword kw">end</span>
1816
- 358:
1817
- 359: <span class="ruby-comment cmt">#Log.exit('parseRuleR', &quot;Finished rule #{rule.name}&quot;)</span>
1818
- 360: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">result</span>
1819
- 361: <span class="ruby-keyword kw">end</span></pre>
1827
+ 353: <span class="ruby-comment cmt"># Once the complete pattern has been processed we call the processing</span>
1828
+ 354: <span class="ruby-comment cmt"># function for this pattern to operate on the value array. Then pop the</span>
1829
+ 355: <span class="ruby-comment cmt"># entry for this rule from the stack.</span>
1830
+ 356: <span class="ruby-ivar">@val</span> = <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">val</span>
1831
+ 357: <span class="ruby-ivar">@sourceFileInfo</span> = <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">sourceFileInfo</span>
1832
+ 358: <span class="ruby-identifier">res</span> = <span class="ruby-keyword kw">nil</span>
1833
+ 359: <span class="ruby-identifier">res</span> = <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">function</span>.<span class="ruby-identifier">call</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">function</span>.<span class="ruby-identifier">nil?</span>
1834
+ 360: <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">pop</span>
1835
+ 361:
1836
+ 362: <span class="ruby-comment cmt"># If the rule is not repeatable we can store the result and break the</span>
1837
+ 363: <span class="ruby-comment cmt"># outer loop to exit the function.</span>
1838
+ 364: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">repeatable</span>
1839
+ 365: <span class="ruby-identifier">result</span> = <span class="ruby-identifier">res</span>
1840
+ 366: <span class="ruby-keyword kw">break</span>
1841
+ 367: <span class="ruby-keyword kw">end</span>
1842
+ 368:
1843
+ 369: <span class="ruby-comment cmt"># Otherwise we append the result to the result array and turn repeat</span>
1844
+ 370: <span class="ruby-comment cmt"># mode on.</span>
1845
+ 371: <span class="ruby-identifier">result</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">res</span>
1846
+ 372: <span class="ruby-identifier">repeatMode</span> = <span class="ruby-keyword kw">true</span>
1847
+ 373: <span class="ruby-keyword kw">end</span>
1848
+ 374:
1849
+ 375: <span class="ruby-comment cmt">#Log.exit('parseRuleR', &quot;Finished rule #{rule.name}&quot;)</span>
1850
+ 376: <span class="ruby-comment cmt">#puts &quot;Finished rule #{rule.name}&quot;</span>
1851
+ 377: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">result</span>
1852
+ 378: <span class="ruby-keyword kw">end</span></pre>
1820
1853
  </div>
1821
1854
 
1822
1855
  </div>
@@ -1849,41 +1882,41 @@ Handle the elements that don&#8217;t trigger a recursion.
1849
1882
  <div class="method-source-code"
1850
1883
  id="process-ormal-lements-source">
1851
1884
  <pre>
1852
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 574</span>
1853
- 574: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">processNormalElements</span>(<span class="ruby-identifier">elType</span>, <span class="ruby-identifier">elToken</span>, <span class="ruby-identifier">token</span>)
1854
- 575: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">elType</span> <span class="ruby-operator">==</span> <span class="ruby-value">__</span>
1855
- 576: <span class="ruby-comment cmt"># If the element requires a keyword the token must match this</span>
1856
- 577: <span class="ruby-comment cmt"># keyword.</span>
1857
- 578: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">elToken</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">1</span>]
1858
- 579: <span class="ruby-identifier">text</span> = <span class="ruby-node">&quot;'#{elToken}' expected but found &quot;</span> <span class="ruby-operator">+</span>
1859
- 580: <span class="ruby-node">&quot;'#{token[1]}' (#{token[0]}).&quot;</span>
1860
- 581: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">@@expectedTokens</span>.<span class="ruby-identifier">empty?</span>
1861
- 582: <span class="ruby-identifier">text</span> = <span class="ruby-node">&quot;#{@@expectedTokens.join(', ')} or &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">text</span>
1862
- 583: <span class="ruby-keyword kw">end</span>
1863
- 584: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'spec_keywork_expctd'</span>, <span class="ruby-identifier">text</span>)
1864
- 585: <span class="ruby-keyword kw">end</span>
1865
- 586: <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">store</span>(<span class="ruby-identifier">elToken</span>, <span class="ruby-identifier">token</span>[<span class="ruby-value">2</span>])
1866
- 587: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">elType</span> <span class="ruby-operator">==</span> <span class="ruby-value">..</span>
1867
- 588: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span><span class="ruby-operator">..</span><span class="ruby-value">1</span>] <span class="ruby-operator">!=</span> [ <span class="ruby-value str">'.'</span>, <span class="ruby-value str">'&lt;END&gt;'</span> ]
1868
- 589: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'end_expected'</span>,
1869
- 590: <span class="ruby-node">&quot;Found garbage at expected end of file: #{token[1]}\n&quot;</span> <span class="ruby-operator">+</span>
1870
- 591: <span class="ruby-value str">&quot;If you see this in the middle of your file, you probably &quot;</span> <span class="ruby-operator">+</span>
1871
- 592: <span class="ruby-value str">&quot;have closed your context too early.&quot;</span>)
1872
- 593: <span class="ruby-keyword kw">end</span>
1873
- 594: <span class="ruby-keyword kw">else</span>
1874
- 595: <span class="ruby-comment cmt"># The token must match the expected variable type.</span>
1875
- 596: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">!=</span> <span class="ruby-identifier">elToken</span>
1876
- 597: <span class="ruby-identifier">text</span> = <span class="ruby-node">&quot;'#{elToken}' expected but found &quot;</span> <span class="ruby-operator">+</span>
1877
- 598: <span class="ruby-node">&quot;'#{token[1]}' (#{token[0]}).&quot;</span>
1878
- 599: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">@@expectedTokens</span>.<span class="ruby-identifier">empty?</span>
1879
- 600: <span class="ruby-identifier">text</span> = <span class="ruby-node">&quot;#{@@expectedTokens.join(', ')} or &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">text</span>
1880
- 601: <span class="ruby-keyword kw">end</span>
1881
- 602: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'spec_token_expctd'</span>, <span class="ruby-identifier">text</span>)
1882
- 603: <span class="ruby-keyword kw">end</span>
1883
- 604: <span class="ruby-comment cmt"># If the element is a variable store the value of the token.</span>
1884
- 605: <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">store</span>(<span class="ruby-identifier">token</span>[<span class="ruby-value">1</span>], <span class="ruby-identifier">token</span>[<span class="ruby-value">2</span>])
1885
- 606: <span class="ruby-keyword kw">end</span>
1886
- 607: <span class="ruby-keyword kw">end</span></pre>
1885
+ <span class="ruby-comment cmt"># File lib/TextParser.rb, line 587</span>
1886
+ 587: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">processNormalElements</span>(<span class="ruby-identifier">elType</span>, <span class="ruby-identifier">elToken</span>, <span class="ruby-identifier">token</span>)
1887
+ 588: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">elType</span> <span class="ruby-operator">==</span> <span class="ruby-value">__</span>
1888
+ 589: <span class="ruby-comment cmt"># If the element requires a keyword the token must match this</span>
1889
+ 590: <span class="ruby-comment cmt"># keyword.</span>
1890
+ 591: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">elToken</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">1</span>]
1891
+ 592: <span class="ruby-identifier">text</span> = <span class="ruby-node">&quot;'#{elToken}' expected but found &quot;</span> <span class="ruby-operator">+</span>
1892
+ 593: <span class="ruby-node">&quot;'#{token[1]}' (#{token[0]}).&quot;</span>
1893
+ 594: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">@@expectedTokens</span>.<span class="ruby-identifier">empty?</span>
1894
+ 595: <span class="ruby-identifier">text</span> = <span class="ruby-node">&quot;#{@@expectedTokens.join(', ')} or &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">text</span>
1895
+ 596: <span class="ruby-keyword kw">end</span>
1896
+ 597: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'spec_keywork_expctd'</span>, <span class="ruby-identifier">text</span>, <span class="ruby-identifier">token</span>[<span class="ruby-value">2</span>])
1897
+ 598: <span class="ruby-keyword kw">end</span>
1898
+ 599: <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">store</span>(<span class="ruby-identifier">elToken</span>, <span class="ruby-identifier">token</span>[<span class="ruby-value">2</span>])
1899
+ 600: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">elType</span> <span class="ruby-operator">==</span> <span class="ruby-value">..</span>
1900
+ 601: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span><span class="ruby-operator">..</span><span class="ruby-value">1</span>] <span class="ruby-operator">!=</span> [ <span class="ruby-value str">'.'</span>, <span class="ruby-value str">'&lt;END&gt;'</span> ]
1901
+ 602: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'end_expected'</span>,
1902
+ 603: <span class="ruby-node">&quot;Found garbage at expected end of text: #{token[1]}\n&quot;</span> <span class="ruby-operator">+</span>
1903
+ 604: <span class="ruby-value str">&quot;If you see this in the middle of your text, you probably &quot;</span> <span class="ruby-operator">+</span>
1904
+ 605: <span class="ruby-value str">&quot;have closed your context too early.&quot;</span>, <span class="ruby-identifier">token</span>[<span class="ruby-value">2</span>])
1905
+ 606: <span class="ruby-keyword kw">end</span>
1906
+ 607: <span class="ruby-keyword kw">else</span>
1907
+ 608: <span class="ruby-comment cmt"># The token must match the expected variable type.</span>
1908
+ 609: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">!=</span> <span class="ruby-identifier">elToken</span>
1909
+ 610: <span class="ruby-identifier">text</span> = <span class="ruby-node">&quot;'#{elToken}' expected but found &quot;</span> <span class="ruby-operator">+</span>
1910
+ 611: <span class="ruby-node">&quot;'#{token[1]}' (#{token[0]}).&quot;</span>
1911
+ 612: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">@@expectedTokens</span>.<span class="ruby-identifier">empty?</span>
1912
+ 613: <span class="ruby-identifier">text</span> = <span class="ruby-node">&quot;#{@@expectedTokens.join(', ')} or &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">text</span>
1913
+ 614: <span class="ruby-keyword kw">end</span>
1914
+ 615: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'spec_token_expctd'</span>, <span class="ruby-identifier">text</span>, <span class="ruby-identifier">token</span>[<span class="ruby-value">2</span>])
1915
+ 616: <span class="ruby-keyword kw">end</span>
1916
+ 617: <span class="ruby-comment cmt"># If the element is a variable store the value of the token.</span>
1917
+ 618: <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">store</span>(<span class="ruby-identifier">token</span>[<span class="ruby-value">1</span>], <span class="ruby-identifier">token</span>[<span class="ruby-value">2</span>])
1918
+ 619: <span class="ruby-keyword kw">end</span>
1919
+ 620: <span class="ruby-keyword kw">end</span></pre>
1887
1920
  </div>
1888
1921
 
1889
1922
  </div>