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