| ##TEMPLATE-NAME 'Visual Basic - ActiveX DLL' |
| ##LANGUAGE 'Visual Basic' |
| ##ENGINE-NAME 'ActiveX DLL' |
| ##AUTHOR 'Devin Cook' |
| ##FILE-EXTENSION 'bas' |
| ##NOTES |
| This template creates a Visual Basic program for use
with the ActiveX DLL The code will work with both Visual Basic 5 and 6. |
| ##END-NOTES |
| ##ID-CASE Propercase |
| ##ID-SEPARATOR '_' |
| ##ID-SYMBOL-PREFIX 'Symbol' |
| ##ID-RULE-PREFIX 'Rule' |
| Option Explicit |
| Public Parser As New GOLDParserEngine.GOLDParser |
| Public Enum SymbolConstants |
| ##SYMBOLS |
| %ID.Padded% = %Value% ' %Description% |
| ##END-SYMBOLS |
| End Enum |
| Enum RuleConstants |
| ##RULES |
| %ID.Padded% = %Value% ' %Description% |
| ##END-RULES |
| End Enum |
| public Sub DoParse(ByVal Source As String) |
| 'This procedure starts the GOLD Parser Engine and handles each of the |
| 'messages it returns. Each time a reduction is made, a new custom object |
| 'can be created and used to store the rule. Otherwise, the system will use |
| 'the Reduction object that was returned. |
| ' |
| 'The resulting tree will be a pure representation of the language |
| 'and will be ready to implement. |
| Dim Response As GOLDParserEngine.GPMessageConstants |
| Dim Result As Object |
| Dim Done As Boolean, Success As Boolean 'Controls when we leave the loop |
| Success = False 'Unless the program is accepted by the parser |
| With Parser |
| If .LoadCompiledGrammar(App.Path & "\grammar.cgt") Then |
| .OpenTextString Source |
| .TrimReductions = True |
| Done = False |
| Do Until Done |
| Response = .Parse() |
| Select Case Response |
| Case gpMsgLexicalError |
| 'Cannot recognize token |
| Done = True |
| Case gpMsgSyntaxError |
| 'Expecting a different token |
| Done = True |
| Case gpMsgReduction |
| 'You can create a new customized object and replace the |
| 'CurrentReduction with it. This saves memory and allows |
| 'easier interpretation. |
| ' |
| ' Set .CurrentReduction = Result |
| ' |
| 'Of course, you can just let the system create a parse |
| 'tree of Reduction objects. Remember: The value of the |
| 'token is accessed through the Data property. |
| With .CurrentReduction 'Easy notation |
| Select Case .ParentRule.TableIndex |
| ##RULES |
| Case %ID% |
| ' %Description% |
| ##END-RULES |
| End Select |
| End With |
| 'Set .CurrentReduction = Result |
| Case gpMsgAccept |
| 'Success! |
| 'Set Program = .CurrentReduction 'The root node! |
| Done = True |
| Success = True |
| Case gpMsgTokenRead |
| 'You don't have to do anything here. |
| Case gpMsgInternalError |
| 'INTERNAL ERROR! Something is horribly wrong. |
| Done = True |
| Case gpMsgNotLoadedError |
| 'Due to the if-statement above, this case statement should never be true |
| Done = True |
| Case gpMsgCommentError |
| 'COMMENT ERROR! Unexpected end of file |
| Done = True |
| End Select |
| Loop |
| Else |
| 'Could not load the CGT file |
| End If |
| End With |
| End Sub |
| Public Sub Setup |
| 'Call this function before calling DoParse |
| Parser.LoadCompiledGrammar(App.Path & "\grammar.cgt") |
| End Sub |