taskjuggler 0.0.5 → 0.0.6

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 (544) hide show
  1. data/CHANGELOG +2086 -0
  2. data/benchmarks/666tasks.tjp +3183 -0
  3. data/benchmarks/booking.tjp +14 -10
  4. data/doc/AppConfig.html +95 -73
  5. data/doc/Arguments.html +22 -2
  6. data/doc/CHANGELOG.html +2587 -0
  7. data/doc/COPYING.html +21 -1
  8. data/doc/Object.html +161 -122
  9. data/doc/README.html +21 -1
  10. data/doc/RuntimeConfig.html +26 -6
  11. data/doc/String.html +38 -18
  12. data/doc/StringIO.html +579 -0
  13. data/doc/TaskJuggler.html +251 -143
  14. data/doc/TaskJuggler/Account.html +26 -6
  15. data/doc/TaskJuggler/AccountAttribute.html +28 -8
  16. data/doc/TaskJuggler/AccountScenario.html +24 -4
  17. data/doc/TaskJuggler/Allocation.html +30 -10
  18. data/doc/TaskJuggler/AllocationAttribute.html +28 -8
  19. data/doc/TaskJuggler/AttributeBase.html +46 -26
  20. data/doc/TaskJuggler/AttributeDefinition.html +22 -2
  21. data/doc/TaskJuggler/BatchProcessor.html +40 -20
  22. data/doc/TaskJuggler/Booking.html +26 -6
  23. data/doc/TaskJuggler/BookingListAttribute.html +28 -8
  24. data/doc/TaskJuggler/BooleanAttribute.html +28 -8
  25. data/doc/TaskJuggler/CSVFile.html +308 -146
  26. data/doc/TaskJuggler/CellSettingPattern.html +22 -2
  27. data/doc/TaskJuggler/CellSettingPatternList.html +26 -6
  28. data/doc/TaskJuggler/Charge.html +26 -6
  29. data/doc/TaskJuggler/ChargeListAttribute.html +26 -6
  30. data/doc/TaskJuggler/ChargeSet.html +33 -13
  31. data/doc/TaskJuggler/ChargeSetListAttribute.html +28 -8
  32. data/doc/TaskJuggler/ColumnListAttribute.html +26 -6
  33. data/doc/TaskJuggler/ColumnTable.html +24 -4
  34. data/doc/TaskJuggler/Daemon.html +26 -6
  35. data/doc/TaskJuggler/DateAttribute.html +26 -6
  36. data/doc/TaskJuggler/DefinitionListAttribute.html +22 -2
  37. data/doc/TaskJuggler/DependencyListAttribute.html +28 -8
  38. data/doc/TaskJuggler/DurationAttribute.html +28 -8
  39. data/doc/TaskJuggler/FixnumAttribute.html +24 -4
  40. data/doc/TaskJuggler/FlagListAttribute.html +28 -8
  41. data/doc/TaskJuggler/FloatAttribute.html +26 -6
  42. data/doc/TaskJuggler/FormatListAttribute.html +24 -4
  43. data/doc/TaskJuggler/GanttChart.html +147 -126
  44. data/doc/TaskJuggler/GanttContainer.html +34 -14
  45. data/doc/TaskJuggler/GanttHeader.html +28 -8
  46. data/doc/TaskJuggler/GanttHeaderScaleItem.html +24 -4
  47. data/doc/TaskJuggler/GanttLine.html +38 -18
  48. data/doc/TaskJuggler/GanttLoadStack.html +26 -6
  49. data/doc/TaskJuggler/GanttMilestone.html +34 -14
  50. data/doc/TaskJuggler/GanttRouter.html +50 -30
  51. data/doc/TaskJuggler/GanttTaskBar.html +34 -14
  52. data/doc/TaskJuggler/HTMLDocument.html +26 -6
  53. data/doc/TaskJuggler/HTMLGraphics.html +30 -10
  54. data/doc/TaskJuggler/Interval.html +40 -22
  55. data/doc/TaskJuggler/IntervalListAttribute.html +28 -8
  56. data/doc/TaskJuggler/JobInfo.html +24 -4
  57. data/doc/TaskJuggler/Journal.html +226 -147
  58. data/doc/TaskJuggler/JournalEntry.html +22 -2
  59. data/doc/TaskJuggler/JournalEntryList.html +129 -112
  60. data/doc/TaskJuggler/KeywordArray.html +26 -6
  61. data/doc/TaskJuggler/KeywordDocumentation.html +46 -26
  62. data/doc/TaskJuggler/Limits.html +152 -123
  63. data/doc/TaskJuggler/Limits/Limit.html +149 -70
  64. data/doc/TaskJuggler/LimitsAttribute.html +36 -51
  65. data/doc/TaskJuggler/ListAttributeBase.html +24 -4
  66. data/doc/TaskJuggler/Log.html +50 -32
  67. data/doc/TaskJuggler/LogFile.html +37 -17
  68. data/doc/TaskJuggler/LogicalAttribute.html +53 -33
  69. data/doc/TaskJuggler/LogicalExpression.html +26 -6
  70. data/doc/TaskJuggler/LogicalExpressionAttribute.html +32 -12
  71. data/doc/TaskJuggler/LogicalFlag.html +42 -22
  72. data/doc/TaskJuggler/LogicalFunction.html +204 -140
  73. data/doc/TaskJuggler/LogicalOperation.html +135 -111
  74. data/doc/TaskJuggler/Macro.html +22 -2
  75. data/doc/TaskJuggler/MacroParser.html +32 -12
  76. data/doc/TaskJuggler/MacroTable.html +32 -12
  77. data/doc/TaskJuggler/ManagerResponsibilities.html +24 -4
  78. data/doc/TaskJuggler/ManagerStatusRecord.html +24 -4
  79. data/doc/TaskJuggler/Message.html +24 -4
  80. data/doc/TaskJuggler/MessageHandler.html +24 -4
  81. data/doc/TaskJuggler/Navigator.html +104 -71
  82. data/doc/TaskJuggler/NavigatorElement.html +32 -12
  83. data/doc/TaskJuggler/NikuProject.html +22 -2
  84. data/doc/TaskJuggler/NikuReport.html +310 -228
  85. data/doc/TaskJuggler/NikuResource.html +22 -2
  86. data/doc/TaskJuggler/NodeListAttribute.html +615 -0
  87. data/doc/TaskJuggler/OnShiftCache.html +32 -12
  88. data/doc/TaskJuggler/ProcessIntercom.html +205 -78
  89. data/doc/TaskJuggler/ProcessIntercomIface.html +26 -6
  90. data/doc/TaskJuggler/Project.html +708 -660
  91. data/doc/TaskJuggler/ProjectBroker.html +506 -304
  92. data/doc/TaskJuggler/ProjectBrokerIface.html +61 -41
  93. data/doc/TaskJuggler/ProjectFileParser.html +429 -373
  94. data/doc/TaskJuggler/ProjectFileScanner.html +1790 -0
  95. data/doc/TaskJuggler/ProjectRecord.html +80 -60
  96. data/doc/TaskJuggler/ProjectServer.html +312 -237
  97. data/doc/TaskJuggler/ProjectServerIface.html +101 -43
  98. data/doc/TaskJuggler/PropertyAttribute.html +32 -12
  99. data/doc/TaskJuggler/PropertyList.html +166 -145
  100. data/doc/TaskJuggler/PropertySet.html +254 -224
  101. data/doc/TaskJuggler/PropertyTreeNode.html +670 -536
  102. data/doc/TaskJuggler/Query.html +169 -148
  103. data/doc/TaskJuggler/RTFHandlers.html +622 -0
  104. data/doc/TaskJuggler/RTFNavigator.html +28 -8
  105. data/doc/TaskJuggler/RTFQuery.html +40 -20
  106. data/doc/TaskJuggler/RTFReport.html +62 -25
  107. data/doc/TaskJuggler/RTFReportLink.html +765 -0
  108. data/doc/TaskJuggler/RealFormat.html +26 -6
  109. data/doc/TaskJuggler/RealFormatAttribute.html +26 -6
  110. data/doc/TaskJuggler/ReferenceAttribute.html +59 -39
  111. data/doc/TaskJuggler/Report.html +402 -251
  112. data/doc/TaskJuggler/ReportBase.html +162 -137
  113. data/doc/TaskJuggler/ReportContext.html +112 -29
  114. data/doc/TaskJuggler/ReportServer.html +89 -64
  115. data/doc/TaskJuggler/ReportServerIface.html +75 -55
  116. data/doc/TaskJuggler/ReportServerRecord.html +54 -31
  117. data/doc/TaskJuggler/ReportServlet.html +980 -0
  118. data/doc/TaskJuggler/ReportTable.html +41 -21
  119. data/doc/TaskJuggler/ReportTableCell.html +214 -170
  120. data/doc/TaskJuggler/ReportTableColumn.html +30 -10
  121. data/doc/TaskJuggler/ReportTableLegend.html +36 -16
  122. data/doc/TaskJuggler/ReportTableLine.html +32 -12
  123. data/doc/TaskJuggler/Resource.html +99 -87
  124. data/doc/TaskJuggler/ResourceListAttribute.html +59 -39
  125. data/doc/TaskJuggler/ResourceListRE.html +47 -26
  126. data/doc/TaskJuggler/ResourceScenario.html +403 -437
  127. data/doc/TaskJuggler/RichText.html +26 -6
  128. data/doc/TaskJuggler/RichTextAttribute.html +50 -30
  129. data/doc/TaskJuggler/RichTextDocument.html +37 -17
  130. data/doc/TaskJuggler/RichTextElement.html +475 -413
  131. data/doc/TaskJuggler/RichTextException.html +22 -2
  132. data/doc/TaskJuggler/RichTextFunctionExample.html +28 -8
  133. data/doc/TaskJuggler/RichTextFunctionHandler.html +24 -4
  134. data/doc/TaskJuggler/RichTextImage.html +22 -2
  135. data/doc/TaskJuggler/RichTextIntermediate.html +38 -18
  136. data/doc/TaskJuggler/RichTextParser.html +56 -34
  137. data/doc/TaskJuggler/RichTextScanner.html +82 -61
  138. data/doc/TaskJuggler/RichTextSnip.html +34 -14
  139. data/doc/TaskJuggler/RichTextSyntaxRules.html +507 -353
  140. data/doc/TaskJuggler/Scenario.html +22 -2
  141. data/doc/TaskJuggler/ScenarioData.html +30 -46
  142. data/doc/TaskJuggler/ScenarioListAttribute.html +38 -18
  143. data/doc/TaskJuggler/Scoreboard.html +42 -22
  144. data/doc/TaskJuggler/SheetHandlerBase.html +40 -20
  145. data/doc/TaskJuggler/SheetReceiver.html +333 -295
  146. data/doc/TaskJuggler/SheetSender.html +253 -230
  147. data/doc/TaskJuggler/Shift.html +26 -6
  148. data/doc/TaskJuggler/ShiftAssignment.html +89 -73
  149. data/doc/TaskJuggler/ShiftAssignments.html +226 -234
  150. data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +39 -54
  151. data/doc/TaskJuggler/ShiftScenario.html +28 -8
  152. data/doc/TaskJuggler/SortListAttribute.html +34 -14
  153. data/doc/TaskJuggler/SourceFileInfo.html +24 -4
  154. data/doc/TaskJuggler/StatusSheetReceiver.html +24 -3
  155. data/doc/TaskJuggler/StatusSheetReport.html +168 -153
  156. data/doc/TaskJuggler/StatusSheetSender.html +24 -3
  157. data/doc/TaskJuggler/StringAttribute.html +38 -18
  158. data/doc/TaskJuggler/SymbolAttribute.html +32 -12
  159. data/doc/TaskJuggler/SyntaxReference.html +40 -20
  160. data/doc/TaskJuggler/TOCEntry.html +26 -6
  161. data/doc/TaskJuggler/TSResourceRecord.html +22 -2
  162. data/doc/TaskJuggler/TSTaskRecord.html +22 -2
  163. data/doc/TaskJuggler/TableColumnDefinition.html +59 -22
  164. data/doc/TaskJuggler/TableOfContents.html +26 -6
  165. data/doc/TaskJuggler/TableReport.html +937 -904
  166. data/doc/TaskJuggler/Task.html +55 -36
  167. data/doc/TaskJuggler/TaskDependency.html +24 -4
  168. data/doc/TaskJuggler/TaskListAttribute.html +50 -30
  169. data/doc/TaskJuggler/TaskListRE.html +27 -7
  170. data/doc/TaskJuggler/TaskScenario.html +1273 -1153
  171. data/doc/TaskJuggler/TextFormatter.html +28 -8
  172. data/doc/TaskJuggler/TextParser.html +585 -338
  173. data/doc/TaskJuggler/TextParser/Pattern.html +54 -34
  174. data/doc/TaskJuggler/TextParser/Rule.html +95 -73
  175. data/doc/TaskJuggler/TextParser/StackElement.html +39 -17
  176. data/doc/TaskJuggler/TextParser/TextParserResultArray.html +24 -4
  177. data/doc/TaskJuggler/TextParser/TokenDoc.html +22 -2
  178. data/doc/TaskJuggler/TextReport.html +28 -8
  179. data/doc/TaskJuggler/TextScanner.html +400 -1404
  180. data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +28 -240
  181. data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +37 -184
  182. data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +682 -0
  183. data/doc/TaskJuggler/TextScanner/StreamHandle.html +342 -67
  184. data/doc/TaskJuggler/TimeSheet.html +48 -28
  185. data/doc/TaskJuggler/TimeSheetReceiver.html +24 -3
  186. data/doc/TaskJuggler/TimeSheetRecord.html +47 -27
  187. data/doc/TaskJuggler/TimeSheetReport.html +154 -133
  188. data/doc/TaskJuggler/TimeSheetSender.html +24 -3
  189. data/doc/TaskJuggler/TimeSheetSummary.html +137 -91
  190. data/doc/TaskJuggler/TimeSheets.html +26 -6
  191. data/doc/TaskJuggler/Tj3AppBase.html +85 -58
  192. data/doc/TaskJuggler/Tj3Client.html +292 -238
  193. data/doc/TaskJuggler/Tj3Daemon.html +159 -74
  194. data/doc/TaskJuggler/Tj3SheetAppBase.html +26 -6
  195. data/doc/TaskJuggler/Tj3SsReceiver.html +26 -6
  196. data/doc/TaskJuggler/Tj3SsSender.html +53 -26
  197. data/doc/TaskJuggler/Tj3TsReceiver.html +28 -7
  198. data/doc/TaskJuggler/Tj3TsSender.html +26 -6
  199. data/doc/TaskJuggler/Tj3TsSummary.html +26 -6
  200. data/doc/TaskJuggler/TjException.html +22 -2
  201. data/doc/TaskJuggler/TjTime.html +216 -160
  202. data/doc/TaskJuggler/TjpExample.html +34 -14
  203. data/doc/TaskJuggler/TjpExportRE.html +403 -407
  204. data/doc/TaskJuggler/TjpSyntaxRules.html +4805 -4408
  205. data/doc/TaskJuggler/URLParameter.html +649 -0
  206. data/doc/TaskJuggler/UserManual.html +42 -22
  207. data/doc/TaskJuggler/WebServer.html +702 -0
  208. data/doc/TaskJuggler/WorkingHours.html +38 -18
  209. data/doc/TaskJuggler/WorkingHoursAttribute.html +61 -41
  210. data/doc/TaskJuggler/XMLBlob.html +24 -4
  211. data/doc/TaskJuggler/XMLComment.html +24 -4
  212. data/doc/TaskJuggler/XMLDocument.html +30 -10
  213. data/doc/TaskJuggler/XMLElement.html +34 -14
  214. data/doc/TaskJuggler/XMLNamedText.html +22 -2
  215. data/doc/TaskJuggler/XMLText.html +24 -4
  216. data/doc/index.html +1841 -1666
  217. data/doc/lib/AccountScenario_rb.html +1 -1
  218. data/doc/lib/Account_rb.html +1 -1
  219. data/doc/lib/Allocation_rb.html +1 -1
  220. data/doc/lib/AppConfig_rb.html +2 -2
  221. data/doc/lib/AttributeBase_rb.html +1 -1
  222. data/doc/lib/AttributeDefinition_rb.html +1 -1
  223. data/doc/lib/Attributes_rb.html +2 -2
  224. data/doc/lib/BatchProcessor_rb.html +1 -1
  225. data/doc/lib/Booking_rb.html +1 -1
  226. data/doc/lib/ChargeSet_rb.html +1 -1
  227. data/doc/lib/Charge_rb.html +1 -1
  228. data/doc/lib/HTMLDocument_rb.html +1 -1
  229. data/doc/lib/Interval_rb.html +1 -1
  230. data/doc/lib/Journal_rb.html +2 -2
  231. data/doc/lib/KeywordArray_rb.html +1 -1
  232. data/doc/lib/KeywordDocumentation_rb.html +1 -1
  233. data/doc/lib/Limits_rb.html +2 -2
  234. data/doc/lib/LogFile_rb.html +2 -2
  235. data/doc/lib/Log_rb.html +1 -1
  236. data/doc/lib/LogicalExpression_rb.html +1 -1
  237. data/doc/lib/LogicalFunction_rb.html +2 -2
  238. data/doc/lib/LogicalOperation_rb.html +2 -2
  239. data/doc/lib/MacroParser_rb.html +1 -1
  240. data/doc/lib/MacroTable_rb.html +1 -1
  241. data/doc/lib/MessageHandler_rb.html +1 -1
  242. data/doc/lib/Message_rb.html +1 -1
  243. data/doc/lib/ProjectFileParser_rb.html +4 -8
  244. data/doc/lib/ProjectFileScanner_rb.html +67 -0
  245. data/doc/lib/Project_rb.html +2 -2
  246. data/doc/lib/PropertyList_rb.html +2 -2
  247. data/doc/lib/PropertySet_rb.html +2 -2
  248. data/doc/lib/PropertyTreeNode_rb.html +2 -2
  249. data/doc/lib/Query_rb.html +2 -2
  250. data/doc/lib/RTFHandlers_rb.html +73 -0
  251. data/doc/lib/RTFNavigator_rb.html +1 -1
  252. data/doc/lib/RTFQuery_rb.html +1 -1
  253. data/doc/lib/RTFReportLink_rb.html +71 -0
  254. data/doc/lib/RTFReport_rb.html +2 -2
  255. data/doc/lib/RealFormat_rb.html +1 -1
  256. data/doc/lib/ResourceScenario_rb.html +2 -2
  257. data/doc/lib/Resource_rb.html +2 -2
  258. data/doc/lib/RichTextDocument_rb.html +1 -1
  259. data/doc/lib/RichTextElement_rb.html +2 -2
  260. data/doc/lib/RichTextFunctionExample_rb.html +1 -1
  261. data/doc/lib/RichTextFunctionHandler_rb.html +1 -1
  262. data/doc/lib/RichTextParser_rb.html +2 -2
  263. data/doc/lib/RichTextScanner_rb.html +2 -2
  264. data/doc/lib/RichTextSnip_rb.html +1 -1
  265. data/doc/lib/RichTextSyntaxRules_rb.html +2 -2
  266. data/doc/lib/RichText_rb.html +1 -1
  267. data/doc/lib/RuntimeConfig_rb.html +1 -1
  268. data/doc/lib/ScenarioData_rb.html +2 -2
  269. data/doc/lib/Scenario_rb.html +1 -1
  270. data/doc/lib/Scoreboard_rb.html +1 -1
  271. data/doc/lib/SheetHandlerBase_rb.html +1 -1
  272. data/doc/lib/SheetReceiver_rb.html +2 -2
  273. data/doc/lib/SheetSender_rb.html +4 -2
  274. data/doc/lib/ShiftAssignments_rb.html +4 -2
  275. data/doc/lib/ShiftScenario_rb.html +1 -1
  276. data/doc/lib/Shift_rb.html +1 -1
  277. data/doc/lib/SourceFileInfo_rb.html +1 -1
  278. data/doc/lib/StatusSheetReceiver_rb.html +2 -2
  279. data/doc/lib/StatusSheetSender_rb.html +2 -2
  280. data/doc/lib/SyntaxReference_rb.html +1 -1
  281. data/doc/lib/TOCEntry_rb.html +1 -1
  282. data/doc/lib/TableColumnDefinition_rb.html +2 -2
  283. data/doc/lib/TableOfContents_rb.html +1 -1
  284. data/doc/lib/TaskDependency_rb.html +1 -1
  285. data/doc/lib/TaskJuggler_rb.html +2 -2
  286. data/doc/lib/TaskScenario_rb.html +2 -2
  287. data/doc/lib/Task_rb.html +2 -2
  288. data/doc/lib/TextFormatter_rb.html +1 -1
  289. data/doc/lib/TextParser/Pattern_rb.html +1 -1
  290. data/doc/lib/TextParser/Rule_rb.html +2 -2
  291. data/doc/lib/TextParser/StackElement_rb.html +2 -2
  292. data/doc/lib/TextParser/TokenDoc_rb.html +1 -1
  293. data/doc/lib/TextParser_rb.html +2 -2
  294. data/doc/lib/TextScanner_rb.html +6 -2
  295. data/doc/lib/TimeSheetReceiver_rb.html +2 -2
  296. data/doc/lib/TimeSheetSender_rb.html +2 -2
  297. data/doc/lib/TimeSheetSummary_rb.html +2 -2
  298. data/doc/lib/TimeSheets_rb.html +2 -2
  299. data/doc/lib/Tj3AppBase_rb.html +2 -2
  300. data/doc/lib/Tj3Config_rb.html +2 -2
  301. data/doc/lib/Tj3SheetAppBase_rb.html +2 -2
  302. data/doc/lib/TjException_rb.html +1 -1
  303. data/doc/lib/TjTime_rb.html +2 -2
  304. data/doc/lib/TjpExample_rb.html +1 -1
  305. data/doc/lib/TjpSyntaxRules_rb.html +2 -2
  306. data/doc/lib/URLParameter_rb.html +67 -0
  307. data/doc/lib/UTF8String_rb.html +1 -1
  308. data/doc/lib/UserManual_rb.html +1 -1
  309. data/doc/lib/WorkingHours_rb.html +1 -1
  310. data/doc/lib/XMLDocument_rb.html +2 -2
  311. data/doc/lib/XMLElement_rb.html +1 -1
  312. data/doc/lib/daemon/Daemon_rb.html +1 -1
  313. data/doc/lib/daemon/ProcessIntercom_rb.html +2 -2
  314. data/doc/lib/daemon/ProjectBroker_rb.html +4 -2
  315. data/doc/lib/daemon/ProjectServer_rb.html +2 -2
  316. data/doc/lib/daemon/ReportServer_rb.html +2 -2
  317. data/doc/lib/daemon/WebServer_rb.html +75 -0
  318. data/doc/lib/deep_copy_rb.html +2 -2
  319. data/doc/lib/reports/CSVFile_rb.html +2 -2
  320. data/doc/lib/reports/ColumnTable_rb.html +1 -1
  321. data/doc/lib/reports/GanttChart_rb.html +2 -2
  322. data/doc/lib/reports/GanttContainer_rb.html +1 -1
  323. data/doc/lib/reports/GanttHeaderScaleItem_rb.html +1 -1
  324. data/doc/lib/reports/GanttHeader_rb.html +1 -1
  325. data/doc/lib/reports/GanttLine_rb.html +1 -1
  326. data/doc/lib/reports/GanttLoadStack_rb.html +1 -1
  327. data/doc/lib/reports/GanttMilestone_rb.html +1 -1
  328. data/doc/lib/reports/GanttRouter_rb.html +1 -1
  329. data/doc/lib/reports/GanttTaskBar_rb.html +1 -1
  330. data/doc/lib/reports/HTMLGraphics_rb.html +1 -1
  331. data/doc/lib/reports/Navigator_rb.html +2 -2
  332. data/doc/lib/reports/NikuReport_rb.html +2 -2
  333. data/doc/lib/reports/ReportBase_rb.html +2 -2
  334. data/doc/lib/reports/ReportContext_rb.html +2 -2
  335. data/doc/lib/reports/ReportTableCell_rb.html +2 -2
  336. data/doc/lib/reports/ReportTableColumn_rb.html +1 -1
  337. data/doc/lib/reports/ReportTableLegend_rb.html +1 -1
  338. data/doc/lib/reports/ReportTableLine_rb.html +1 -1
  339. data/doc/lib/reports/ReportTable_rb.html +2 -2
  340. data/doc/lib/reports/Report_rb.html +2 -2
  341. data/doc/lib/reports/ResourceListRE_rb.html +2 -2
  342. data/doc/lib/reports/StatusSheetReport_rb.html +2 -2
  343. data/doc/lib/reports/TableReport_rb.html +2 -2
  344. data/doc/lib/reports/TaskListRE_rb.html +2 -2
  345. data/doc/lib/reports/TextReport_rb.html +1 -1
  346. data/doc/lib/reports/TimeSheetReport_rb.html +2 -2
  347. data/doc/lib/reports/TjpExportRE_rb.html +2 -2
  348. data/doc/lib/ruby-signal-bug_rb.html +1 -1
  349. data/doc/lib/taskjuggler3_rb.html +2 -2
  350. data/doc/lib/tj3client_rb.html +2 -2
  351. data/doc/lib/tj3d_rb.html +2 -2
  352. data/doc/lib/tj3man_rb.html +1 -1
  353. data/doc/lib/tj3ss_receiver_rb.html +1 -1
  354. data/doc/lib/tj3ss_sender_rb.html +2 -2
  355. data/doc/lib/tj3ts_receiver_rb.html +2 -2
  356. data/doc/lib/tj3ts_sender_rb.html +1 -1
  357. data/doc/lib/tj3ts_summary_rb.html +1 -1
  358. data/doc/rdoc.css +9 -4
  359. data/examples/tutorial.tjp +17 -15
  360. data/gem_spec.rb +3 -0
  361. data/lib/AppConfig.rb +3 -1
  362. data/lib/Attributes.rb +10 -8
  363. data/lib/Journal.rb +55 -20
  364. data/lib/Limits.rb +72 -46
  365. data/lib/LogFile.rb +3 -3
  366. data/lib/LogicalFunction.rb +19 -6
  367. data/lib/LogicalOperation.rb +5 -1
  368. data/lib/Project.rb +37 -9
  369. data/lib/ProjectFileParser.rb +25 -22
  370. data/lib/ProjectFileScanner.rb +365 -0
  371. data/lib/PropertyList.rb +2 -1
  372. data/lib/PropertySet.rb +14 -4
  373. data/lib/PropertyTreeNode.rb +42 -29
  374. data/lib/Query.rb +3 -1
  375. data/lib/RTFHandlers.rb +35 -0
  376. data/lib/RTFReport.rb +23 -6
  377. data/lib/RTFReportLink.rb +72 -0
  378. data/lib/Resource.rb +8 -16
  379. data/lib/ResourceScenario.rb +1 -22
  380. data/lib/RichTextElement.rb +42 -0
  381. data/lib/RichTextParser.rb +6 -4
  382. data/lib/RichTextScanner.rb +5 -5
  383. data/lib/RichTextSyntaxRules.rb +48 -10
  384. data/lib/ScenarioData.rb +5 -3
  385. data/lib/SheetReceiver.rb +24 -6
  386. data/lib/SheetSender.rb +17 -13
  387. data/lib/ShiftAssignments.rb +56 -52
  388. data/lib/StatusSheetReceiver.rb +1 -0
  389. data/lib/StatusSheetSender.rb +1 -0
  390. data/lib/TableColumnDefinition.rb +4 -2
  391. data/lib/Task.rb +8 -9
  392. data/lib/TaskJuggler.rb +21 -11
  393. data/lib/TaskScenario.rb +61 -26
  394. data/lib/TextParser.rb +268 -106
  395. data/lib/TextParser/Rule.rb +4 -2
  396. data/lib/TextParser/StackElement.rb +6 -4
  397. data/lib/TextScanner.rb +283 -700
  398. data/lib/TimeSheetReceiver.rb +1 -0
  399. data/lib/TimeSheetSender.rb +1 -0
  400. data/lib/TimeSheetSummary.rb +51 -26
  401. data/lib/TimeSheets.rb +1 -1
  402. data/lib/Tj3AppBase.rb +8 -1
  403. data/lib/Tj3Config.rb +1 -1
  404. data/lib/TjTime.rb +5 -0
  405. data/lib/TjpSyntaxRules.rb +360 -144
  406. data/lib/URLParameter.rb +30 -0
  407. data/lib/XMLDocument.rb +2 -2
  408. data/lib/daemon/ProcessIntercom.rb +50 -9
  409. data/lib/daemon/ProjectBroker.rb +63 -10
  410. data/lib/daemon/ProjectServer.rb +47 -16
  411. data/lib/daemon/ReportServer.rb +9 -4
  412. data/lib/daemon/WebServer.rb +204 -0
  413. data/lib/deep_copy.rb +4 -1
  414. data/lib/reports/CSVFile.rb +150 -66
  415. data/lib/reports/GanttChart.rb +2 -1
  416. data/lib/reports/Navigator.rb +18 -5
  417. data/lib/reports/NikuReport.rb +32 -2
  418. data/lib/reports/Report.rb +65 -37
  419. data/lib/reports/ReportBase.rb +14 -9
  420. data/lib/reports/ReportContext.rb +19 -4
  421. data/lib/reports/ReportTable.rb +2 -2
  422. data/lib/reports/ReportTableCell.rb +54 -30
  423. data/lib/reports/ResourceListRE.rb +4 -3
  424. data/lib/reports/StatusSheetReport.rb +8 -13
  425. data/lib/reports/TableReport.rb +47 -32
  426. data/lib/reports/TaskListRE.rb +3 -3
  427. data/lib/reports/TimeSheetReport.rb +14 -5
  428. data/lib/reports/TjpExportRE.rb +14 -19
  429. data/lib/taskjuggler3.rb +15 -0
  430. data/lib/tj3client.rb +9 -7
  431. data/lib/tj3d.rb +38 -10
  432. data/lib/tj3ss_sender.rb +7 -0
  433. data/lib/tj3ts_receiver.rb +1 -0
  434. data/manual/Day_To_Day_Juggling +1 -1
  435. data/manual/Rich_Text_Attributes +8 -0
  436. data/manual/TaskJuggler_2x_Migration +7 -0
  437. data/manual/The_TaskJuggler_Syntax +20 -6
  438. data/prj_cfg.rb +3 -2
  439. data/tasks/changelog.rake +36 -0
  440. data/tasks/csts.rake +2 -3
  441. data/tasks/gem.rake +10 -0
  442. data/tasks/missing.rake +0 -17
  443. data/test/TestSuite/ReportGenerator/Correct/Journal.html +63 -0
  444. data/test/TestSuite/ReportGenerator/Correct/Journal.tjp +14 -0
  445. data/test/TestSuite/{HTML-Reports/LogicalFunctions.tjp → ReportGenerator/Correct/LogicalFunctions1.tjp} +2 -2
  446. data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.csv +3 -0
  447. data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.tjp +19 -0
  448. data/test/TestSuite/ReportGenerator/Correct/css/tjmanual.css +66 -0
  449. data/test/TestSuite/ReportGenerator/Correct/css/tjreport.css +407 -0
  450. data/test/TestSuite/ReportGenerator/Correct/icons/details.png +0 -0
  451. data/test/TestSuite/ReportGenerator/Correct/icons/flag-green.png +0 -0
  452. data/test/TestSuite/ReportGenerator/Correct/icons/flag-red.png +0 -0
  453. data/test/TestSuite/ReportGenerator/Correct/icons/flag-yellow.png +0 -0
  454. data/test/TestSuite/ReportGenerator/Correct/icons/resource.png +0 -0
  455. data/test/TestSuite/ReportGenerator/Correct/icons/resourcegroup.png +0 -0
  456. data/test/TestSuite/ReportGenerator/Correct/icons/task.png +0 -0
  457. data/test/TestSuite/ReportGenerator/Correct/icons/taskgroup.png +0 -0
  458. data/test/TestSuite/ReportGenerator/Correct/icons/trend-down.png +0 -0
  459. data/test/TestSuite/ReportGenerator/Correct/icons/trend-flat.png +0 -0
  460. data/test/TestSuite/ReportGenerator/Correct/icons/trend-up.png +0 -0
  461. data/test/TestSuite/ReportGenerator/Correct/opennodes.csv +2 -0
  462. data/test/TestSuite/ReportGenerator/Correct/opennodes.tjp +26 -0
  463. data/test/TestSuite/ReportGenerator/Correct/refs/Journal-1.csv +6 -0
  464. data/test/TestSuite/ReportGenerator/Correct/refs/LogicalFunctions1-1.csv +7 -0
  465. data/test/TestSuite/ReportGenerator/Correct/refs/LogicalFunctions2-1.csv +2 -0
  466. data/test/TestSuite/ReportGenerator/Correct/refs/opennodes-1.csv +2 -0
  467. data/test/TestSuite/ReportGenerator/Correct/scripts/wz_tooltip.js +1301 -0
  468. data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.tjp +20 -0
  469. data/test/TestSuite/Scheduler/Correct/Container.html +349 -0
  470. data/test/TestSuite/Scheduler/Correct/Limits.tjp +11 -4
  471. data/test/TestSuite/Scheduler/Correct/Shift2.html +464 -150
  472. data/test/TestSuite/Scheduler/Correct/TimeSheet2.html +108 -0
  473. data/test/TestSuite/Scheduler/Correct/TimeSheet2.tjp +7 -0
  474. data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +14 -0
  475. data/test/TestSuite/Scheduler/Correct/css/tjreport.css +233 -21
  476. data/test/TestSuite/Scheduler/Correct/scripts/wz_tooltip.js +20 -20
  477. data/test/TestSuite/StatusSheetTemplates/project.tji +35 -0
  478. data/test/TestSuite/StatusSheetTemplates/project.tjp +56 -0
  479. data/test/TestSuite/StatusSheets/run +3 -2
  480. data/test/TestSuite/Syntax/Correct/Include.tjp +1 -1
  481. data/test/TestSuite/Syntax/Correct/Macro-1.tjp +1 -1
  482. data/test/TestSuite/Syntax/Correct/Macro-2.tjp +6 -0
  483. data/test/TestSuite/Syntax/Correct/Macro-3.tjp +14 -0
  484. data/test/TestSuite/Syntax/Correct/ResourcePrefix.html +32 -0
  485. data/test/TestSuite/Syntax/Correct/css/tjmanual.css +66 -0
  486. data/test/TestSuite/Syntax/Correct/css/tjreport.css +407 -0
  487. data/test/TestSuite/Syntax/Correct/icons/details.png +0 -0
  488. data/test/TestSuite/Syntax/Correct/icons/flag-green.png +0 -0
  489. data/test/TestSuite/Syntax/Correct/icons/flag-red.png +0 -0
  490. data/test/TestSuite/Syntax/Correct/icons/flag-yellow.png +0 -0
  491. data/test/TestSuite/Syntax/Correct/icons/resource.png +0 -0
  492. data/test/TestSuite/Syntax/Correct/icons/resourcegroup.png +0 -0
  493. data/test/TestSuite/Syntax/Correct/icons/task.png +0 -0
  494. data/test/TestSuite/Syntax/Correct/icons/taskgroup.png +0 -0
  495. data/test/TestSuite/Syntax/Correct/icons/trend-down.png +0 -0
  496. data/test/TestSuite/Syntax/Correct/icons/trend-flat.png +0 -0
  497. data/test/TestSuite/Syntax/Correct/icons/trend-up.png +0 -0
  498. data/test/TestSuite/Syntax/Correct/include/dir1/file2.tji +3 -0
  499. data/test/TestSuite/Syntax/Correct/include/dir1/file5.tji +2 -0
  500. data/test/TestSuite/Syntax/Correct/include/dir3/all.tji +3 -0
  501. data/test/TestSuite/Syntax/Correct/include/dir3/file1.tji +2 -0
  502. data/test/TestSuite/Syntax/Correct/include/dir3/file2.tji +1 -0
  503. data/test/TestSuite/Syntax/Correct/scripts/wz_tooltip.js +1301 -0
  504. data/test/TestSuite/Syntax/Correct/tutorial.tjp +13 -13
  505. data/test/TestSuite/Syntax/Errors/empty.tjp +1 -1
  506. data/test/TestSuite/Syntax/Errors/include_recursion.tjp +1 -0
  507. data/test/TestSuite/Syntax/Errors/macro_stack_overflow.tjp +2 -1
  508. data/test/TestSuite/Syntax/Errors/{eof_in_istring1.tjp → no_token_match1.tjp} +2 -2
  509. data/test/TestSuite/Syntax/Errors/{eof_in_istring2.tjp → no_token_match2.tjp} +2 -2
  510. data/test/TestSuite/Syntax/Errors/{eof_in_istring3.tjp → no_token_match3.tjp} +1 -1
  511. data/test/TestSuite/Syntax/Errors/{eof_in_istring4.tjp → no_token_match4.tjp} +1 -1
  512. data/test/TestSuite/Syntax/Errors/{eof_in_istring5.tjp → no_token_match5.tjp} +1 -1
  513. data/test/TestSuite/Syntax/Errors/not_scheduled.tjp +13 -0
  514. data/test/TestSuite/Syntax/Errors/unsupported_token.tjp +1 -1
  515. data/test/TestSuite/TimeSheets/run +5 -5
  516. data/test/test_CSVFile.rb +75 -0
  517. data/test/test_Limits.rb +63 -5
  518. data/test/test_ProjectFileScanner.rb +163 -0
  519. data/test/test_ReportGenerator.rb +81 -0
  520. data/test/test_RichText.rb +21 -3
  521. data/test/test_Scheduler.rb +1 -1
  522. data/test/test_ShiftAssignments.rb +4 -4
  523. data/test/test_Syntax.rb +1 -1
  524. data/test/test_URLParameter.rb +30 -0
  525. metadata +126 -32
  526. data/test/TestSuite/Scheduler/Errors/not_scheduled.tjp +0 -8
  527. data/test/TestSuite/Syntax/Errors/bad_comment.tjp +0 -7
  528. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/boss_2002-03-01.tji +0 -36
  529. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev1_2002-03-01.tji +0 -48
  530. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev2_2002-03-01.tji +0 -67
  531. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev3_2002-03-01.tji +0 -67
  532. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/doc_2002-03-01.tji +0 -48
  533. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/resources.yml +0 -31
  534. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/test_2002-03-01.tji +0 -36
  535. data/test/TestSuite/TimeSheets/TimeSheetTemplates/acceptable_intervals +0 -1
  536. data/test/TestSuite/TimeSheets/TimeSheets/2002-03-01/all.tji +0 -1
  537. data/test/TestSuite/TimeSheets/TimeSheets/2002-03-01/dev2_2002-03-01.tji +0 -54
  538. data/test/TestSuite/TimeSheets/TimeSheets/all.tji +0 -2
  539. data/test/TestSuite/TimeSheets/receiver.log +0 -102
  540. data/test/TestSuite/TimeSheets/sender.log +0 -794
  541. data/test/TestSuite/TimeSheets/summary.log +0 -884
  542. data/test/TestSuite/TimeSheets/timesheets.log +0 -45
  543. data/test/TestSuite/TimeSheets/tj3d.log +0 -292
  544. data/test/test_TextScanner.rb +0 -95
@@ -69,13 +69,13 @@
69
69
  <h3 class="section-header">Methods</h3>
70
70
  <ul class="link-list">
71
71
 
72
- <li><a href="#M001604">::new</a></li>
72
+ <li><a href="#method-c-new">::new</a></li>
73
73
 
74
- <li><a href="#M001607">#appendWord</a></li>
74
+ <li><a href="#method-i-appendWord">#appendWord</a></li>
75
75
 
76
- <li><a href="#M001606">#format</a></li>
76
+ <li><a href="#method-i-format">#format</a></li>
77
77
 
78
- <li><a href="#M001605">#indent</a></li>
78
+ <li><a href="#method-i-indent">#indent</a></li>
79
79
 
80
80
  </ul>
81
81
  </div>
@@ -92,6 +92,8 @@
92
92
  <h3 class="section-header">Files</h3>
93
93
  <ul>
94
94
 
95
+ <li class="file"><a href="../CHANGELOG.html">CHANGELOG</a></li>
96
+
95
97
  <li class="file"><a href="../COPYING.html">COPYING</a></li>
96
98
 
97
99
  <li class="file"><a href="../README.html">README</a></li>
@@ -261,6 +263,8 @@
261
263
 
262
264
  <li><a href="../TaskJuggler/NikuResource.html">TaskJuggler::NikuResource</a></li>
263
265
 
266
+ <li><a href="../TaskJuggler/NodeListAttribute.html">TaskJuggler::NodeListAttribute</a></li>
267
+
264
268
  <li><a href="../TaskJuggler/OnShiftCache.html">TaskJuggler::OnShiftCache</a></li>
265
269
 
266
270
  <li><a href="../TaskJuggler/ProcessIntercom.html">TaskJuggler::ProcessIntercom</a></li>
@@ -275,6 +279,8 @@
275
279
 
276
280
  <li><a href="../TaskJuggler/ProjectFileParser.html">TaskJuggler::ProjectFileParser</a></li>
277
281
 
282
+ <li><a href="../TaskJuggler/ProjectFileScanner.html">TaskJuggler::ProjectFileScanner</a></li>
283
+
278
284
  <li><a href="../TaskJuggler/ProjectRecord.html">TaskJuggler::ProjectRecord</a></li>
279
285
 
280
286
  <li><a href="../TaskJuggler/ProjectServer.html">TaskJuggler::ProjectServer</a></li>
@@ -291,12 +297,16 @@
291
297
 
292
298
  <li><a href="../TaskJuggler/Query.html">TaskJuggler::Query</a></li>
293
299
 
300
+ <li><a href="../TaskJuggler/RTFHandlers.html">TaskJuggler::RTFHandlers</a></li>
301
+
294
302
  <li><a href="../TaskJuggler/RTFNavigator.html">TaskJuggler::RTFNavigator</a></li>
295
303
 
296
304
  <li><a href="../TaskJuggler/RTFQuery.html">TaskJuggler::RTFQuery</a></li>
297
305
 
298
306
  <li><a href="../TaskJuggler/RTFReport.html">TaskJuggler::RTFReport</a></li>
299
307
 
308
+ <li><a href="../TaskJuggler/RTFReportLink.html">TaskJuggler::RTFReportLink</a></li>
309
+
300
310
  <li><a href="../TaskJuggler/RealFormat.html">TaskJuggler::RealFormat</a></li>
301
311
 
302
312
  <li><a href="../TaskJuggler/RealFormatAttribute.html">TaskJuggler::RealFormatAttribute</a></li>
@@ -315,6 +325,8 @@
315
325
 
316
326
  <li><a href="../TaskJuggler/ReportServerRecord.html">TaskJuggler::ReportServerRecord</a></li>
317
327
 
328
+ <li><a href="../TaskJuggler/ReportServlet.html">TaskJuggler::ReportServlet</a></li>
329
+
318
330
  <li><a href="../TaskJuggler/ReportTable.html">TaskJuggler::ReportTable</a></li>
319
331
 
320
332
  <li><a href="../TaskJuggler/ReportTableCell.html">TaskJuggler::ReportTableCell</a></li>
@@ -443,6 +455,8 @@
443
455
 
444
456
  <li><a href="../TaskJuggler/TextScanner/FileStreamHandle.html">TaskJuggler::TextScanner::FileStreamHandle</a></li>
445
457
 
458
+ <li><a href="../TaskJuggler/TextScanner/MacroStackEntry.html">TaskJuggler::TextScanner::MacroStackEntry</a></li>
459
+
446
460
  <li><a href="../TaskJuggler/TextScanner/StreamHandle.html">TaskJuggler::TextScanner::StreamHandle</a></li>
447
461
 
448
462
  <li><a href="../TaskJuggler/TimeSheet.html">TaskJuggler::TimeSheet</a></li>
@@ -487,8 +501,12 @@
487
501
 
488
502
  <li><a href="../TaskJuggler/TjpSyntaxRules.html">TaskJuggler::TjpSyntaxRules</a></li>
489
503
 
504
+ <li><a href="../TaskJuggler/URLParameter.html">TaskJuggler::URLParameter</a></li>
505
+
490
506
  <li><a href="../TaskJuggler/UserManual.html">TaskJuggler::UserManual</a></li>
491
507
 
508
+ <li><a href="../TaskJuggler/WebServer.html">TaskJuggler::WebServer</a></li>
509
+
492
510
  <li><a href="../TaskJuggler/WorkingHours.html">TaskJuggler::WorkingHours</a></li>
493
511
 
494
512
  <li><a href="../TaskJuggler/WorkingHoursAttribute.html">TaskJuggler::WorkingHoursAttribute</a></li>
@@ -515,6 +533,8 @@
515
533
 
516
534
  <li><a href="../String.html">String</a></li>
517
535
 
536
+ <li><a href="../StringIO.html">StringIO</a></li>
537
+
518
538
  </ul>
519
539
  <div id="no-class-search-results" style="display: none;">No matching classes.</div>
520
540
  </div>
@@ -604,7 +624,7 @@ be indented and limited to a given text width.
604
624
 
605
625
 
606
626
  <div id="new-method" class="method-detail ">
607
- <a name="M001604"></a>
627
+ <a name="method-c-new"></a>
608
628
 
609
629
  <div class="method-heading">
610
630
 
@@ -649,7 +669,7 @@ be indented and limited to a given text width.
649
669
 
650
670
 
651
671
  <div id="format-method" class="method-detail ">
652
- <a name="M001606"></a>
672
+ <a name="method-i-format"></a>
653
673
 
654
674
  <div class="method-heading">
655
675
 
@@ -754,7 +774,7 @@ the class settings.
754
774
 
755
775
 
756
776
  <div id="indent-method" class="method-detail ">
757
- <a name="M001605"></a>
777
+ <a name="method-i-indent"></a>
758
778
 
759
779
  <div class="method-heading">
760
780
 
@@ -831,7 +851,7 @@ line will be indented by @firstLineIndent. Lines that are longer than
831
851
 
832
852
 
833
853
  <div id="append-ord-method" class="method-detail ">
834
- <a name="M001607"></a>
854
+ <a name="method-i-appendWord"></a>
835
855
 
836
856
  <div class="method-heading">
837
857
 
@@ -98,41 +98,45 @@
98
98
  <h3 class="section-header">Methods</h3>
99
99
  <ul class="link-list">
100
100
 
101
- <li><a href="#M000671">::new</a></li>
101
+ <li><a href="#method-c-new">::new</a></li>
102
102
 
103
- <li><a href="#M000680">#checkForEnd</a></li>
103
+ <li><a href="#method-i-checkRule">#checkRule</a></li>
104
104
 
105
- <li><a href="#M000686">#checkRule</a></li>
105
+ <li><a href="#method-i-error">#error</a></li>
106
106
 
107
- <li><a href="#M000683">#error</a></li>
107
+ <li><a href="#method-i-findPattern">#findPattern</a></li>
108
108
 
109
- <li><a href="#M000688">#getNextToken</a></li>
109
+ <li><a href="#method-i-getNextToken">#getNextToken</a></li>
110
110
 
111
- <li><a href="#M000685">#getTransitions</a></li>
111
+ <li><a href="#method-i-getTransitions">#getTransitions</a></li>
112
112
 
113
- <li><a href="#M000673">#initRules</a></li>
113
+ <li><a href="#method-i-initRules">#initRules</a></li>
114
114
 
115
- <li><a href="#M000672">#limitTokenSet</a></li>
115
+ <li><a href="#method-i-limitTokenSet">#limitTokenSet</a></li>
116
116
 
117
- <li><a href="#M000682">#matchingRules</a></li>
117
+ <li><a href="#method-i-matchingRules">#matchingRules</a></li>
118
118
 
119
- <li><a href="#M000674">#newRule</a></li>
119
+ <li><a href="#method-i-newRule">#newRule</a></li>
120
120
 
121
- <li><a href="#M000676">#optional</a></li>
121
+ <li><a href="#method-i-optional">#optional</a></li>
122
122
 
123
- <li><a href="#M000679">#parse</a></li>
123
+ <li><a href="#method-i-parse">#parse</a></li>
124
124
 
125
- <li><a href="#M000687">#parseRule</a></li>
125
+ <li><a href="#method-i-parseRuleNR">#parseRuleNR</a></li>
126
126
 
127
- <li><a href="#M000675">#pattern</a></li>
127
+ <li><a href="#method-i-parseRuleR">#parseRuleR</a></li>
128
128
 
129
- <li><a href="#M000677">#repeatable</a></li>
129
+ <li><a href="#method-i-pattern">#pattern</a></li>
130
130
 
131
- <li><a href="#M000681">#sourceFileInfo</a></li>
131
+ <li><a href="#method-i-processNormalElements">#processNormalElements</a></li>
132
132
 
133
- <li><a href="#M000678">#updateParserTables</a></li>
133
+ <li><a href="#method-i-repeatable">#repeatable</a></li>
134
134
 
135
- <li><a href="#M000684">#warning</a></li>
135
+ <li><a href="#method-i-sourceFileInfo">#sourceFileInfo</a></li>
136
+
137
+ <li><a href="#method-i-updateParserTables">#updateParserTables</a></li>
138
+
139
+ <li><a href="#method-i-warning">#warning</a></li>
136
140
 
137
141
  </ul>
138
142
  </div>
@@ -149,6 +153,8 @@
149
153
  <h3 class="section-header">Files</h3>
150
154
  <ul>
151
155
 
156
+ <li class="file"><a href="../CHANGELOG.html">CHANGELOG</a></li>
157
+
152
158
  <li class="file"><a href="../COPYING.html">COPYING</a></li>
153
159
 
154
160
  <li class="file"><a href="../README.html">README</a></li>
@@ -318,6 +324,8 @@
318
324
 
319
325
  <li><a href="../TaskJuggler/NikuResource.html">TaskJuggler::NikuResource</a></li>
320
326
 
327
+ <li><a href="../TaskJuggler/NodeListAttribute.html">TaskJuggler::NodeListAttribute</a></li>
328
+
321
329
  <li><a href="../TaskJuggler/OnShiftCache.html">TaskJuggler::OnShiftCache</a></li>
322
330
 
323
331
  <li><a href="../TaskJuggler/ProcessIntercom.html">TaskJuggler::ProcessIntercom</a></li>
@@ -332,6 +340,8 @@
332
340
 
333
341
  <li><a href="../TaskJuggler/ProjectFileParser.html">TaskJuggler::ProjectFileParser</a></li>
334
342
 
343
+ <li><a href="../TaskJuggler/ProjectFileScanner.html">TaskJuggler::ProjectFileScanner</a></li>
344
+
335
345
  <li><a href="../TaskJuggler/ProjectRecord.html">TaskJuggler::ProjectRecord</a></li>
336
346
 
337
347
  <li><a href="../TaskJuggler/ProjectServer.html">TaskJuggler::ProjectServer</a></li>
@@ -348,12 +358,16 @@
348
358
 
349
359
  <li><a href="../TaskJuggler/Query.html">TaskJuggler::Query</a></li>
350
360
 
361
+ <li><a href="../TaskJuggler/RTFHandlers.html">TaskJuggler::RTFHandlers</a></li>
362
+
351
363
  <li><a href="../TaskJuggler/RTFNavigator.html">TaskJuggler::RTFNavigator</a></li>
352
364
 
353
365
  <li><a href="../TaskJuggler/RTFQuery.html">TaskJuggler::RTFQuery</a></li>
354
366
 
355
367
  <li><a href="../TaskJuggler/RTFReport.html">TaskJuggler::RTFReport</a></li>
356
368
 
369
+ <li><a href="../TaskJuggler/RTFReportLink.html">TaskJuggler::RTFReportLink</a></li>
370
+
357
371
  <li><a href="../TaskJuggler/RealFormat.html">TaskJuggler::RealFormat</a></li>
358
372
 
359
373
  <li><a href="../TaskJuggler/RealFormatAttribute.html">TaskJuggler::RealFormatAttribute</a></li>
@@ -372,6 +386,8 @@
372
386
 
373
387
  <li><a href="../TaskJuggler/ReportServerRecord.html">TaskJuggler::ReportServerRecord</a></li>
374
388
 
389
+ <li><a href="../TaskJuggler/ReportServlet.html">TaskJuggler::ReportServlet</a></li>
390
+
375
391
  <li><a href="../TaskJuggler/ReportTable.html">TaskJuggler::ReportTable</a></li>
376
392
 
377
393
  <li><a href="../TaskJuggler/ReportTableCell.html">TaskJuggler::ReportTableCell</a></li>
@@ -500,6 +516,8 @@
500
516
 
501
517
  <li><a href="../TaskJuggler/TextScanner/FileStreamHandle.html">TaskJuggler::TextScanner::FileStreamHandle</a></li>
502
518
 
519
+ <li><a href="../TaskJuggler/TextScanner/MacroStackEntry.html">TaskJuggler::TextScanner::MacroStackEntry</a></li>
520
+
503
521
  <li><a href="../TaskJuggler/TextScanner/StreamHandle.html">TaskJuggler::TextScanner::StreamHandle</a></li>
504
522
 
505
523
  <li><a href="../TaskJuggler/TimeSheet.html">TaskJuggler::TimeSheet</a></li>
@@ -544,8 +562,12 @@
544
562
 
545
563
  <li><a href="../TaskJuggler/TjpSyntaxRules.html">TaskJuggler::TjpSyntaxRules</a></li>
546
564
 
565
+ <li><a href="../TaskJuggler/URLParameter.html">TaskJuggler::URLParameter</a></li>
566
+
547
567
  <li><a href="../TaskJuggler/UserManual.html">TaskJuggler::UserManual</a></li>
548
568
 
569
+ <li><a href="../TaskJuggler/WebServer.html">TaskJuggler::WebServer</a></li>
570
+
549
571
  <li><a href="../TaskJuggler/WorkingHours.html">TaskJuggler::WorkingHours</a></li>
550
572
 
551
573
  <li><a href="../TaskJuggler/WorkingHoursAttribute.html">TaskJuggler::WorkingHoursAttribute</a></li>
@@ -572,6 +594,8 @@
572
594
 
573
595
  <li><a href="../String.html">String</a></li>
574
596
 
597
+ <li><a href="../StringIO.html">StringIO</a></li>
598
+
575
599
  </ul>
576
600
  <div id="no-class-search-results" style="display: none;">No matching classes.</div>
577
601
  </div>
@@ -641,19 +665,20 @@ declare all variables ($SOMENAME) that the scanner may deliver.
641
665
  </p>
642
666
  <p>
643
667
  To describe the syntax the functions <a
644
- href="TextParser.html#M000675">TextParser#pattern</a>, <a
645
- href="TextParser.html#M000676">TextParser#optional</a> and <a
646
- href="TextParser.html#M000677">TextParser#repeatable</a> can be used. When
647
- the rule set is changed during parsing, <a
648
- href="TextParser.html#M000678">TextParser#updateParserTables</a> must be
649
- called to make the changes effective. The parser can also document the
650
- syntax automatically. To document a pattern, the functions TextParser#doc,
651
- TextParser#descr, TextParser#also and TextParser#arg can be used.
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.
652
677
  </p>
653
678
  <p>
654
679
  To start parsing the input the function <a
655
- href="TextParser.html#M000679">TextParser#parse</a> needs to be called with
656
- the name of the start rule.
680
+ href="TextParser.html#method-i-parse">TextParser#parse</a> needs to be
681
+ called with the name of the start rule.
657
682
  </p>
658
683
 
659
684
  </div>
@@ -692,7 +717,7 @@ the name of the start rule.
692
717
 
693
718
 
694
719
  <div id="new-method" class="method-detail ">
695
- <a name="M000671"></a>
720
+ <a name="method-c-new"></a>
696
721
 
697
722
  <div class="method-heading">
698
723
 
@@ -739,53 +764,13 @@ Create a new <a href="TextParser.html">TextParser</a> object.
739
764
  <h3 class="section-header">Public Instance Methods</h3>
740
765
 
741
766
 
742
- <div id="check-or-nd-method" class="method-detail ">
743
- <a name="M000680"></a>
744
-
745
- <div class="method-heading">
746
-
747
- <span class="method-name">checkForEnd</span><span
748
- class="method-args">()</span>
749
- <span class="method-click-advice">click to toggle source</span>
750
-
751
- </div>
752
-
753
- <div class="method-description">
754
-
755
- <p>
756
- Return true if the scanner has processed all files.
757
- </p>
758
-
759
-
760
-
761
- <div class="method-source-code"
762
- id="check-or-nd-source">
763
- <pre>
764
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 174</span>
765
- 174: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">checkForEnd</span>
766
- 175: <span class="ruby-identifier">token</span> = <span class="ruby-ivar">@scanner</span>.<span class="ruby-identifier">nextToken</span>
767
- 176: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">'.'</span>
768
- 177: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'junk_at_expected_eof'</span>,
769
- 178: <span class="ruby-node">&quot;Found garbage at expected end of file: #{token[1]}&quot;</span>)
770
- 179: <span class="ruby-keyword kw">end</span>
771
- 180: <span class="ruby-keyword kw">end</span></pre>
772
- </div>
773
-
774
- </div>
775
-
776
-
777
-
778
-
779
- </div>
780
-
781
-
782
767
  <div id="error-method" class="method-detail ">
783
- <a name="M000683"></a>
768
+ <a name="method-i-error"></a>
784
769
 
785
770
  <div class="method-heading">
786
771
 
787
772
  <span class="method-name">error</span><span
788
- class="method-args">(id, text, property = nil)</span>
773
+ class="method-args">(id, text, property = nil, sfi = nil)</span>
789
774
  <span class="method-click-advice">click to toggle source</span>
790
775
 
791
776
  </div>
@@ -799,10 +784,16 @@ Return true if the scanner has processed all files.
799
784
  <div class="method-source-code"
800
785
  id="error-source">
801
786
  <pre>
802
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 199</span>
803
- 199: <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>)
804
- 200: <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>)
805
- 201: <span class="ruby-keyword kw">end</span></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>
806
797
  </div>
807
798
 
808
799
  </div>
@@ -814,7 +805,7 @@ Return true if the scanner has processed all files.
814
805
 
815
806
 
816
807
  <div id="init-ules-method" class="method-detail ">
817
- <a name="M000673"></a>
808
+ <a name="method-i-initRules"></a>
818
809
 
819
810
  <div class="method-heading">
820
811
 
@@ -858,7 +849,7 @@ rules.
858
849
 
859
850
 
860
851
  <div id="limit-oken-et-method" class="method-detail ">
861
- <a name="M000672"></a>
852
+ <a name="method-i-limitTokenSet"></a>
862
853
 
863
854
  <div class="method-heading">
864
855
 
@@ -898,7 +889,7 @@ Limit the allowed tokens of the scanner to the subset passed by the
898
889
 
899
890
 
900
891
  <div id="matching-ules-method" class="method-detail ">
901
- <a name="M000682"></a>
892
+ <a name="method-i-matchingRules"></a>
902
893
 
903
894
  <div class="method-heading">
904
895
 
@@ -917,15 +908,15 @@ Limit the allowed tokens of the scanner to the subset passed by the
917
908
  <div class="method-source-code"
918
909
  id="matching-ules-source">
919
910
  <pre>
920
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 190</span>
921
- 190: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">matchingRules</span>(<span class="ruby-identifier">keyword</span>)
922
- 191: <span class="ruby-identifier">matches</span> = []
923
- 192: <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>
924
- 193: <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>)
925
- 194: <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>
926
- 195: <span class="ruby-keyword kw">end</span>
927
- 196: <span class="ruby-identifier">matches</span>
928
- 197: <span class="ruby-keyword kw">end</span></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>
929
920
  </div>
930
921
 
931
922
  </div>
@@ -937,7 +928,7 @@ Limit the allowed tokens of the scanner to the subset passed by the
937
928
 
938
929
 
939
930
  <div id="new-ule-method" class="method-detail ">
940
- <a name="M000674"></a>
931
+ <a name="method-i-newRule"></a>
941
932
 
942
933
  <div class="method-heading">
943
934
 
@@ -952,10 +943,10 @@ Limit the allowed tokens of the scanner to the subset passed by the
952
943
  <p>
953
944
  Add a new rule to the rule set. <em>name</em> must be a unique identifier.
954
945
  The function also sets the class variable @cr to the new rule. Subsequent
955
- calls to <a href="TextParser.html#M000675">TextParser#pattern</a>, <a
956
- href="TextParser.html#M000676">TextParser#optional</a> or <a
957
- href="TextParser.html#M000677">TextParser#repeatable</a> will then
958
- implicitely operate on the most recently added rule.
946
+ calls to <a href="TextParser.html#method-i-pattern">TextParser#pattern</a>,
947
+ <a href="TextParser.html#method-i-optional">TextParser#optional</a> or <a
948
+ href="TextParser.html#method-i-repeatable">TextParser#repeatable</a> will
949
+ then implicitely operate on the most recently added rule.
959
950
  </p>
960
951
 
961
952
 
@@ -987,7 +978,7 @@ implicitely operate on the most recently added rule.
987
978
 
988
979
 
989
980
  <div id="optional-method" class="method-detail ">
990
- <a name="M000676"></a>
981
+ <a name="method-i-optional"></a>
991
982
 
992
983
  <div class="method-heading">
993
984
 
@@ -1024,7 +1015,7 @@ elements.
1024
1015
 
1025
1016
 
1026
1017
  <div id="parse-method" class="method-detail ">
1027
- <a name="M000679"></a>
1018
+ <a name="method-i-parse"></a>
1028
1019
 
1029
1020
  <div class="method-heading">
1030
1021
 
@@ -1053,7 +1044,7 @@ top-level parser rule that was specified by <em>ruleName</em>.
1053
1044
  161: <span class="ruby-identifier">@@expectedTokens</span> = []
1054
1045
  162: <span class="ruby-identifier">updateParserTables</span>
1055
1046
  163: <span class="ruby-keyword kw">begin</span>
1056
- 164: <span class="ruby-identifier">result</span> = <span class="ruby-identifier">parseRule</span>(<span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">ruleName</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>])
1057
1048
  165: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">TjException</span>
1058
1049
  166: <span class="ruby-comment cmt"># error('parse_error', $!.message)</span>
1059
1050
  167: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span>
@@ -1072,7 +1063,7 @@ top-level parser rule that was specified by <em>ruleName</em>.
1072
1063
 
1073
1064
 
1074
1065
  <div id="pattern-method" class="method-detail ">
1075
- <a name="M000675"></a>
1066
+ <a name="method-i-pattern"></a>
1076
1067
 
1077
1068
  <div class="method-heading">
1078
1069
 
@@ -1129,7 +1120,7 @@ completed the processing of this rule.
1129
1120
 
1130
1121
 
1131
1122
  <div id="repeatable-method" class="method-detail ">
1132
- <a name="M000677"></a>
1123
+ <a name="method-i-repeatable"></a>
1133
1124
 
1134
1125
  <div class="method-heading">
1135
1126
 
@@ -1166,7 +1157,7 @@ elements.
1166
1157
 
1167
1158
 
1168
1159
  <div id="source-ile-nfo-method" class="method-detail ">
1169
- <a name="M000681"></a>
1160
+ <a name="method-i-sourceFileInfo"></a>
1170
1161
 
1171
1162
  <div class="method-heading">
1172
1163
 
@@ -1190,11 +1181,11 @@ nil if we don&#8217;t have a current position.
1190
1181
  <div class="method-source-code"
1191
1182
  id="source-ile-nfo-source">
1192
1183
  <pre>
1193
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 185</span>
1194
- 185: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sourceFileInfo</span>
1195
- 186: <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>
1196
- 187: <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">sourceFileInfo</span>
1197
- 188: <span class="ruby-keyword kw">end</span></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>
1198
1189
  </div>
1199
1190
 
1200
1191
  </div>
@@ -1206,7 +1197,7 @@ nil if we don&#8217;t have a current position.
1206
1197
 
1207
1198
 
1208
1199
  <div id="update-arser-ables-method" class="method-detail ">
1209
- <a name="M000678"></a>
1200
+ <a name="method-i-updateParserTables"></a>
1210
1201
 
1211
1202
  <div class="method-heading">
1212
1203
 
@@ -1221,7 +1212,7 @@ nil if we don&#8217;t have a current position.
1221
1212
  <p>
1222
1213
  This function needs to be called whenever new rules or patterns have been
1223
1214
  added and before the next call to <a
1224
- href="TextParser.html#M000679">TextParser#parse</a>.
1215
+ href="TextParser.html#method-i-parse">TextParser#parse</a>.
1225
1216
  </p>
1226
1217
 
1227
1218
 
@@ -1248,12 +1239,12 @@ href="TextParser.html#M000679">TextParser#parse</a>.
1248
1239
 
1249
1240
 
1250
1241
  <div id="warning-method" class="method-detail ">
1251
- <a name="M000684"></a>
1242
+ <a name="method-i-warning"></a>
1252
1243
 
1253
1244
  <div class="method-heading">
1254
1245
 
1255
1246
  <span class="method-name">warning</span><span
1256
- class="method-args">(id, text, property = nil)</span>
1247
+ class="method-args">(id, text, property = nil, sfi = nil)</span>
1257
1248
  <span class="method-click-advice">click to toggle source</span>
1258
1249
 
1259
1250
  </div>
@@ -1267,10 +1258,10 @@ href="TextParser.html#M000679">TextParser#parse</a>.
1267
1258
  <div class="method-source-code"
1268
1259
  id="warning-source">
1269
1260
  <pre>
1270
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 203</span>
1271
- 203: <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>)
1272
- 204: <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>)
1273
- 205: <span class="ruby-keyword kw">end</span></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>
1274
1265
  </div>
1275
1266
 
1276
1267
  </div>
@@ -1288,7 +1279,7 @@ href="TextParser.html#M000679">TextParser#parse</a>.
1288
1279
 
1289
1280
 
1290
1281
  <div id="check-ule-method" class="method-detail ">
1291
- <a name="M000686"></a>
1282
+ <a name="method-i-checkRule"></a>
1292
1283
 
1293
1284
  <div class="method-heading">
1294
1285
 
@@ -1307,30 +1298,110 @@ href="TextParser.html#M000679">TextParser#parse</a>.
1307
1298
  <div class="method-source-code"
1308
1299
  id="check-ule-source">
1309
1300
  <pre>
1310
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 265</span>
1311
- 265: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">checkRule</span>(<span class="ruby-identifier">rule</span>)
1312
- 266: <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>
1313
- 267: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Rule #{rule.name} must have at least one pattern&quot;</span>
1314
- 268: <span class="ruby-keyword kw">end</span>
1315
- 269:
1316
- 270: <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>
1317
- 271: <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>
1318
- 272: <span class="ruby-identifier">type</span> = <span class="ruby-identifier">tok</span>[<span class="ruby-value">0</span>]
1319
- 273: <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>]
1320
- 274: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">type</span> <span class="ruby-operator">==</span> <span class="ruby-value">$$</span>
1321
- 275: <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>
1322
- 276: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'unsupported_token'</span>,
1323
- 277: <span class="ruby-node">&quot;The token #{token} is not supported here.&quot;</span>)
1324
- 278: <span class="ruby-keyword kw">end</span>
1325
- 279: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">type</span> <span class="ruby-operator">==</span> <span class="ruby-value">!!</span>
1326
- 280: <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>
1327
- 281: <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>
1328
- 282: <span class="ruby-node">&quot;pattern '#{pat}' of rule #{rule.name}&quot;</span>
1329
- 283: <span class="ruby-keyword kw">end</span>
1330
- 284: <span class="ruby-keyword kw">end</span>
1331
- 285: <span class="ruby-keyword kw">end</span>
1332
- 286: <span class="ruby-keyword kw">end</span>
1333
- 287: <span class="ruby-keyword kw">end</span></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>
1326
+ </div>
1327
+
1328
+ </div>
1329
+
1330
+
1331
+
1332
+
1333
+ </div>
1334
+
1335
+
1336
+ <div id="find-attern-method" class="method-detail ">
1337
+ <a name="method-i-findPattern"></a>
1338
+
1339
+ <div class="method-heading">
1340
+
1341
+ <span class="method-name">findPattern</span><span
1342
+ class="method-args">(rule, token, repeatMode)</span>
1343
+ <span class="method-click-advice">click to toggle source</span>
1344
+
1345
+ </div>
1346
+
1347
+ <div class="method-description">
1348
+
1349
+
1350
+
1351
+
1352
+
1353
+ <div class="method-source-code"
1354
+ id="find-attern-source">
1355
+ <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>
1334
1405
  </div>
1335
1406
 
1336
1407
  </div>
@@ -1342,7 +1413,7 @@ href="TextParser.html#M000679">TextParser#parse</a>.
1342
1413
 
1343
1414
 
1344
1415
  <div id="get-ext-oken-method" class="method-detail ">
1345
- <a name="M000688"></a>
1416
+ <a name="method-i-getNextToken"></a>
1346
1417
 
1347
1418
  <div class="method-heading">
1348
1419
 
@@ -1361,20 +1432,21 @@ href="TextParser.html#M000679">TextParser#parse</a>.
1361
1432
  <div class="method-source-code"
1362
1433
  id="get-ext-oken-source">
1363
1434
  <pre>
1364
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 433</span>
1365
- 433: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getNextToken</span>
1366
- 434: <span class="ruby-keyword kw">begin</span>
1367
- 435: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">nextToken</span>
1368
- 436: <span class="ruby-constant">Log</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;Token: [#{token[0]}][#{token[1]}]&quot;</span>
1369
- 437: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">TjException</span>
1370
- 438: <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>)
1371
- 439: <span class="ruby-keyword kw">end</span>
1372
- 440: <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>])
1373
- 441: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'unsupported_token'</span>,
1374
- 442: <span class="ruby-node">&quot;The token #{token[1]} is not supported in this context.&quot;</span>)
1375
- 443: <span class="ruby-keyword kw">end</span>
1376
- 444: <span class="ruby-identifier">token</span>
1377
- 445: <span class="ruby-keyword kw">end</span></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>
1378
1450
  </div>
1379
1451
 
1380
1452
  </div>
@@ -1386,7 +1458,7 @@ href="TextParser.html#M000679">TextParser#parse</a>.
1386
1458
 
1387
1459
 
1388
1460
  <div id="get-ransitions-method" class="method-detail ">
1389
- <a name="M000685"></a>
1461
+ <a name="method-i-getTransitions"></a>
1390
1462
 
1391
1463
  <div class="method-heading">
1392
1464
 
@@ -1412,56 +1484,233 @@ in a token -> rule hash.
1412
1484
  <div class="method-source-code"
1413
1485
  id="get-ransitions-source">
1414
1486
  <pre>
1415
- <span class="ruby-comment cmt"># File lib/TextParser.rb, line 215</span>
1416
- 215: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getTransitions</span>(<span class="ruby-identifier">rule</span>)
1417
- 216: <span class="ruby-comment cmt"># If we have processed this rule before we can just return a copy</span>
1418
- 217: <span class="ruby-comment cmt"># of the transitions of this rule. This avoids endless recursions.</span>
1419
- 218: <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>
1420
- 219:
1421
- 220: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">transitions</span> = []
1422
- 221: <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>
1423
- 222: <span class="ruby-identifier">allTokensOptional</span> = <span class="ruby-keyword kw">true</span>
1424
- 223: <span class="ruby-identifier">transitions</span> = { }
1425
- 224: <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>
1426
- 225: <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>]
1427
- 226: <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>
1428
- 227: <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>)
1429
- 228: <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>
1430
- 229: <span class="ruby-node">&quot;#{pat} + of rule #{rule.name}&quot;</span>
1431
- 230: <span class="ruby-keyword kw">end</span>
1432
- 231: <span class="ruby-identifier">refRule</span> = <span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">tokenId</span>]
1433
- 232: <span class="ruby-comment cmt"># If the referenced rule describes optional content, we need to look</span>
1434
- 233: <span class="ruby-comment cmt"># at the next token as well.</span>
1435
- 234: <span class="ruby-identifier">res</span> = <span class="ruby-identifier">getTransitions</span>(<span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">tokenId</span>])
1436
- 235: <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>)
1437
- 236: <span class="ruby-comment cmt"># Combine the hashes for each pattern into a single hash</span>
1438
- 237: <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>
1439
- 238: <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> }
1440
- 239: <span class="ruby-keyword kw">end</span>
1441
- 240: <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>
1442
- 241: <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>])
1443
- 242: <span class="ruby-identifier">transitions</span>[<span class="ruby-identifier">token</span>] = <span class="ruby-identifier">rule</span>
1444
- 243: <span class="ruby-identifier">allTokensOptional</span> = <span class="ruby-keyword kw">false</span>
1445
- 244: <span class="ruby-keyword kw">else</span>
1446
- 245: <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>
1447
- 246: <span class="ruby-node">&quot;: #{tokenId}&quot;</span>
1448
- 247: <span class="ruby-keyword kw">end</span>
1449
- 248: <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">allTokensOptional</span>
1450
- 249: <span class="ruby-keyword kw">end</span>
1451
- 250: <span class="ruby-comment cmt"># Make sure that we only have one possible transition for each</span>
1452
- 251: <span class="ruby-comment cmt"># target.</span>
1453
- 252: <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>
1454
- 253: <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>
1455
- 254: <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>)
1456
- 255: <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>
1457
- 256: <span class="ruby-node">&quot;transitions for target #{key}&quot;</span>
1458
- 257: <span class="ruby-keyword kw">end</span>
1459
- 258: <span class="ruby-keyword kw">end</span>
1460
- 259: <span class="ruby-keyword kw">end</span>
1461
- 260: <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>
1462
- 261: <span class="ruby-keyword kw">end</span>
1463
- 262: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">transitions</span>.<span class="ruby-identifier">dup</span>
1464
- 263: <span class="ruby-keyword kw">end</span></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>
1537
+ </div>
1538
+
1539
+ </div>
1540
+
1541
+
1542
+
1543
+
1544
+ </div>
1545
+
1546
+
1547
+ <div id="parse-ule--method" class="method-detail ">
1548
+ <a name="method-i-parseRuleNR"></a>
1549
+
1550
+ <div class="method-heading">
1551
+
1552
+ <span class="method-name">parseRuleNR</span><span
1553
+ class="method-args">(rule)</span>
1554
+ <span class="method-click-advice">click to toggle source</span>
1555
+
1556
+ </div>
1557
+
1558
+ <div class="method-description">
1559
+
1560
+ <p>
1561
+ This function processes the input starting with the syntax description of
1562
+ <em>rule</em>. It&#8217;s implemented as an unrolled recursion. It
1563
+ recursively iterates over the rule tree as controlled by the input file.
1564
+ This version is not limited by the size of the system stack. So far,
1565
+ I&#8217;m not aware of any project that is too large for the system stack.
1566
+ Since the recursive version parseRuleR is about 8% faster and has cleaner
1567
+ code, we use that by default.
1568
+ </p>
1569
+
1570
+
1571
+
1572
+ <div class="method-source-code"
1573
+ id="parse-ule--source">
1574
+ <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>
1695
+ 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>
1465
1714
  </div>
1466
1715
 
1467
1716
  </div>
@@ -1472,12 +1721,12 @@ in a token -> rule hash.
1472
1721
  </div>
1473
1722
 
1474
1723
 
1475
- <div id="parse-ule-method" class="method-detail ">
1476
- <a name="M000687"></a>
1724
+ <div id="parse-ule--method" class="method-detail ">
1725
+ <a name="method-i-parseRuleR"></a>
1477
1726
 
1478
1727
  <div class="method-heading">
1479
1728
 
1480
- <span class="method-name">parseRule</span><span
1729
+ <span class="method-name">parseRuleR</span><span
1481
1730
  class="method-args">(rule)</span>
1482
1731
  <span class="method-click-advice">click to toggle source</span>
1483
1732
 
@@ -1488,17 +1737,18 @@ in a token -> rule hash.
1488
1737
  <p>
1489
1738
  This function processes the input starting with the syntax description of
1490
1739
  <em>rule</em>. It recursively calls this function whenever the syntax
1491
- description contains the reference to another rule.
1740
+ description contains the reference to another rule. This recursive version
1741
+ has cleaner code and is about 8% faster than parseRuleNR.
1492
1742
  </p>
1493
1743
 
1494
1744
 
1495
1745
 
1496
1746
  <div class="method-source-code"
1497
- id="parse-ule-source">
1747
+ id="parse-ule--source">
1498
1748
  <pre>
1499
1749
  <span class="ruby-comment cmt"># File lib/TextParser.rb, line 292</span>
1500
- 292: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">parseRule</span>(<span class="ruby-identifier">rule</span>)
1501
- 293: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">enter</span>(<span class="ruby-value str">'parseRule'</span>, <span class="ruby-node">&quot;Parsing with rule #{rule.name}&quot;</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>
1502
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>
1503
1753
  295: <span class="ruby-comment cmt"># Rules can be marked 'repeatable'. This flag will be set to true after</span>
1504
1754
  296: <span class="ruby-comment cmt"># the first iteration has been completed.</span>
@@ -1508,135 +1758,132 @@ description contains the reference to another rule.
1508
1758
  300: <span class="ruby-comment cmt"># which pattern of the rule needs to be processed.</span>
1509
1759
  301: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">getNextToken</span>
1510
1760
  302:
1511
- 303: <span class="ruby-comment cmt"># The scanner cannot differentiate between keywords and identifiers. So</span>
1512
- 304: <span class="ruby-comment cmt"># whenever an identifier is returned we have to see if we have a</span>
1513
- 305: <span class="ruby-comment cmt"># matching keyword first. If none is found, then look for normal</span>
1514
- 306: <span class="ruby-comment cmt"># identifiers.</span>
1515
- 307: <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>
1516
- 308: <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>
1517
- 309: <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>)
1518
- 310: <span class="ruby-keyword kw">end</span>
1519
- 311: <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>
1520
- 312: <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>])
1521
- 313: <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>
1522
- 314: <span class="ruby-identifier">patIdx</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">matchingPatternIndex</span>(<span class="ruby-value str">'.'</span>)
1523
- 315: <span class="ruby-keyword kw">else</span>
1524
- 316: <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>])
1525
- 317: <span class="ruby-keyword kw">end</span>
1526
- 318:
1527
- 319: <span class="ruby-comment cmt"># If no matching pattern is found for the token we have to check if the</span>
1528
- 320: <span class="ruby-comment cmt"># rule is optional or we are in repeat mode. If this is the case, return</span>
1529
- 321: <span class="ruby-comment cmt"># the token back to the scanner. Otherwise we have found a token we</span>
1530
- 322: <span class="ruby-comment cmt"># cannot handle at this point.</span>
1531
- 323: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">patIdx</span>.<span class="ruby-identifier">nil?</span>
1532
- 324: <span class="ruby-comment cmt"># Append the list of expected tokens to the @@expectedToken array.</span>
1533
- 325: <span class="ruby-comment cmt"># This may be used in a later rule to provide more details when an</span>
1534
- 326: <span class="ruby-comment cmt"># error occured.</span>
1535
- 327: <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>
1536
- 328: <span class="ruby-identifier">keys</span> = <span class="ruby-identifier">transition</span>.<span class="ruby-identifier">keys</span>
1537
- 329: <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>] }
1538
- 330: <span class="ruby-identifier">@@expectedTokens</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">keys</span>
1539
- 331: <span class="ruby-identifier">@@expectedTokens</span>.<span class="ruby-identifier">sort!</span>
1540
- 332: <span class="ruby-keyword kw">end</span>
1541
- 333:
1542
- 334: <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>
1543
- 335: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'unexpctd_token'</span>,
1544
- 336: (<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>
1545
- 337: <span class="ruby-node">&quot;Unexpected token '#{token[1]}' of type '#{token[0]}'. &quot;</span> <span class="ruby-operator">:</span>
1546
- 338: <span class="ruby-node">&quot;Unexpected end of file in #{@scanner.fileName}. &quot;</span>) <span class="ruby-operator">+</span>
1547
- 339: (<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>
1548
- 340: <span class="ruby-node">&quot;Expecting one of #{@@expectedTokens.join(', ')}&quot;</span> <span class="ruby-operator">:</span>
1549
- 341: <span class="ruby-node">&quot;Expecting #{@@expectedTokens[0]}&quot;</span>))
1550
- 342: <span class="ruby-keyword kw">end</span>
1551
- 343: <span class="ruby-identifier">returnToken</span>(<span class="ruby-identifier">token</span>)
1552
- 344: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">exit</span>(<span class="ruby-value str">'parseRule'</span>, <span class="ruby-node">&quot;Finished rule #{rule.name}&quot;</span>)
1553
- 345: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">result</span>
1554
- 346: <span class="ruby-keyword kw">end</span>
1555
- 347:
1556
- 348: <span class="ruby-identifier">pattern</span> = <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">pattern</span>(<span class="ruby-identifier">patIdx</span>)
1557
- 349: <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">rule</span>, <span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">function</span>,
1558
- 350: <span class="ruby-ivar">@scanner</span>.<span class="ruby-identifier">sourceFileInfo</span>)
1559
- 351:
1560
- 352: <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>
1561
- 353: <span class="ruby-comment cmt"># Separate the type and token text for pattern element.</span>
1562
- 354: <span class="ruby-identifier">elType</span> = <span class="ruby-identifier">element</span>[<span class="ruby-value">0</span>]
1563
- 355: <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>]
1564
- 356: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">elType</span> <span class="ruby-operator">==</span> <span class="ruby-value">!!</span>
1565
- 357: <span class="ruby-comment cmt"># The element is a reference to another rule. Return the token if we</span>
1566
- 358: <span class="ruby-comment cmt"># still have one and continue with the referenced rule.</span>
1567
- 359: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">token</span>.<span class="ruby-identifier">nil?</span>
1568
- 360: <span class="ruby-identifier">returnToken</span>(<span class="ruby-identifier">token</span>)
1569
- 361: <span class="ruby-identifier">token</span> = <span class="ruby-keyword kw">nil</span>
1570
- 362: <span class="ruby-keyword kw">end</span>
1571
- 363: <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">store</span>(<span class="ruby-identifier">parseRule</span>(<span class="ruby-ivar">@rules</span>[<span class="ruby-identifier">elToken</span>]),
1572
- 364: <span class="ruby-ivar">@scanner</span>.<span class="ruby-identifier">sourceFileInfo</span>)
1573
- 365: <span class="ruby-keyword kw">else</span>
1574
- 366: <span class="ruby-comment cmt"># In case the element is a keyword or variable we have to get a new</span>
1575
- 367: <span class="ruby-comment cmt"># token if we don't have one anymore.</span>
1576
- 368: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">token</span>.<span class="ruby-identifier">nil?</span>
1577
- 369: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">getNextToken</span>
1578
- 370: <span class="ruby-keyword kw">end</span>
1579
- 371:
1580
- 372: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">elType</span> <span class="ruby-operator">==</span> <span class="ruby-value">__</span>
1581
- 373: <span class="ruby-comment cmt"># If the element requires a keyword the token must match this</span>
1582
- 374: <span class="ruby-comment cmt"># keyword.</span>
1583
- 375: <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>]
1584
- 376: <span class="ruby-identifier">text</span> = <span class="ruby-node">&quot;'#{elToken}' expected but found &quot;</span> <span class="ruby-operator">+</span>
1585
- 377: <span class="ruby-node">&quot;'#{token[1]}' (#{token[0]}).&quot;</span>
1586
- 378: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">@@expectedTokens</span>.<span class="ruby-identifier">empty?</span>
1587
- 379: <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>
1588
- 380: <span class="ruby-keyword kw">end</span>
1589
- 381: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'spec_keywork_expctd'</span>, <span class="ruby-identifier">text</span>)
1590
- 382: <span class="ruby-keyword kw">end</span>
1591
- 383: <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-ivar">@scanner</span>.<span class="ruby-identifier">sourceFileInfo</span>)
1592
- 384: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">elType</span> <span class="ruby-operator">==</span> <span class="ruby-value">..</span>
1593
- 385: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">token</span> <span class="ruby-operator">!=</span> [ <span class="ruby-value str">'.'</span>, <span class="ruby-value str">'&lt;END&gt;'</span> ]
1594
- 386: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'end_expected'</span>, <span class="ruby-value str">'End expected but found '</span> <span class="ruby-operator">+</span>
1595
- 387: <span class="ruby-node">&quot;'#{token[1]}' (#{token[0]}).&quot;</span>)
1596
- 388: <span class="ruby-keyword kw">end</span>
1597
- 389: <span class="ruby-keyword kw">else</span>
1598
- 390: <span class="ruby-comment cmt"># The token must match the expected variable type.</span>
1599
- 391: <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>
1600
- 392: <span class="ruby-identifier">text</span> = <span class="ruby-node">&quot;'#{elToken}' expected but found &quot;</span> <span class="ruby-operator">+</span>
1601
- 393: <span class="ruby-node">&quot;'#{token[1]}' (#{token[0]}).&quot;</span>
1602
- 394: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">@@expectedTokens</span>.<span class="ruby-identifier">empty?</span>
1603
- 395: <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>
1604
- 396: <span class="ruby-keyword kw">end</span>
1605
- 397: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'spec_token_expctd'</span>, <span class="ruby-identifier">text</span>)
1606
- 398: <span class="ruby-keyword kw">end</span>
1607
- 399: <span class="ruby-comment cmt"># If the element is a variable store the value of the token.</span>
1608
- 400: <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-ivar">@scanner</span>.<span class="ruby-identifier">sourceFileInfo</span>)
1609
- 401: <span class="ruby-keyword kw">end</span>
1610
- 402: <span class="ruby-comment cmt"># The token has been consumed. Reset the variable.</span>
1611
- 403: <span class="ruby-identifier">token</span> = <span class="ruby-keyword kw">nil</span>
1612
- 404: <span class="ruby-identifier">@@expectedTokens</span> = []
1613
- 405: <span class="ruby-keyword kw">end</span>
1614
- 406: <span class="ruby-keyword kw">end</span>
1615
- 407:
1616
- 408: <span class="ruby-comment cmt"># Once the complete pattern has been processed we call the processing</span>
1617
- 409: <span class="ruby-comment cmt"># function for this pattern to operate on the value array. Then pop the</span>
1618
- 410: <span class="ruby-comment cmt"># entry for this rule from the stack.</span>
1619
- 411: <span class="ruby-ivar">@val</span> = <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">val</span>
1620
- 412: <span class="ruby-identifier">res</span> = <span class="ruby-keyword kw">nil</span>
1621
- 413: <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>
1622
- 414: <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">pop</span>
1623
- 415:
1624
- 416: <span class="ruby-comment cmt"># If the rule is not repeatable we can store the result and break the</span>
1625
- 417: <span class="ruby-comment cmt"># outer loop to exit the function.</span>
1626
- 418: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">repeatable</span>
1627
- 419: <span class="ruby-identifier">result</span> = <span class="ruby-identifier">res</span>
1628
- 420: <span class="ruby-keyword kw">break</span>
1629
- 421: <span class="ruby-keyword kw">end</span>
1630
- 422:
1631
- 423: <span class="ruby-comment cmt"># Otherwise we append the result to the result array and turn repeat</span>
1632
- 424: <span class="ruby-comment cmt"># mode on.</span>
1633
- 425: <span class="ruby-identifier">result</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">res</span>
1634
- 426: <span class="ruby-identifier">repeatMode</span> = <span class="ruby-keyword kw">true</span>
1635
- 427: <span class="ruby-keyword kw">end</span>
1636
- 428:
1637
- 429: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">exit</span>(<span class="ruby-value str">'parseRule'</span>, <span class="ruby-node">&quot;Finished rule #{rule.name}&quot;</span>)
1638
- 430: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">result</span>
1639
- 431: <span class="ruby-keyword kw">end</span></pre>
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>
1809
+ 351: <span class="ruby-keyword kw">end</span>
1810
+ 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>
1820
+ </div>
1821
+
1822
+ </div>
1823
+
1824
+
1825
+
1826
+
1827
+ </div>
1828
+
1829
+
1830
+ <div id="process-ormal-lements-method" class="method-detail ">
1831
+ <a name="method-i-processNormalElements"></a>
1832
+
1833
+ <div class="method-heading">
1834
+
1835
+ <span class="method-name">processNormalElements</span><span
1836
+ class="method-args">(elType, elToken, token)</span>
1837
+ <span class="method-click-advice">click to toggle source</span>
1838
+
1839
+ </div>
1840
+
1841
+ <div class="method-description">
1842
+
1843
+ <p>
1844
+ Handle the elements that don&#8217;t trigger a recursion.
1845
+ </p>
1846
+
1847
+
1848
+
1849
+ <div class="method-source-code"
1850
+ id="process-ormal-lements-source">
1851
+ <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>
1640
1887
  </div>
1641
1888
 
1642
1889
  </div>