| ##TEMPLATE-NAME 'Java - Matthew Hawkins Engine' |
| ##LANGUAGE 'Java' |
| ##ENGINE-NAME 'Matthew Hawkins Java Engine' |
| ##AUTHOR 'Matthew Hawkins' |
| ##FILE-EXTENSION 'java' |
| ##NOTES |
| This template creates a skeleton program for Matthew Hawkins Java GOLD Parser Engine |
| ##END-NOTES |
| ##ID-CASE UPPERCASE |
| ##ID-SEPARATOR '_' |
| ##ID-SYMBOL-PREFIX 'Symbol' |
| ##ID-RULE-PREFIX 'Rule' |
| import java.io.*; |
| import goldengine.java.*; |
| /* |
| * Licensed Material - Property of Matthew Hawkins (hawkini@myrealbox.com) |
| */ |
| public class MyParser implements GPMessageConstants |
| { |
| private interface SymbolConstants |
| { |
| ##SYMBOLS |
| final int %ID.Padded% = %Value%; // %Description% |
| ##END-SYMBOLS |
| }; |
| private interface RuleConstants |
| { |
| ##RULES |
| final int %ID.Padded% = %Value%; // %Description% |
| ##END-RULES |
| }; |
| private static BufferedReader buffR; |
| /*************************************************************** |
| * This class will run the engine, and needs a file called config.dat |
| * in the current directory. This file should contain two lines, |
| * The first should be the absolute path name to the .cgt file, the second |
| * should be the source file you wish to parse. |
| * @param args Array of arguments. |
| ***************************************************************/ |
| public static void main(String[] args) |
| { |
| String textToParse = "", compiledGrammar = ""; |
| try |
| { |
| buffR = new BufferedReader(new FileReader(new File("./config.dat"))); |
| compiledGrammar = buffR.readLine(); |
| textToParse = buffR.readLine(); |
| buffR.close(); |
| } |
| catch(FileNotFoundException fnfex) |
| { |
| System.out.println("Config File was not found.\n\n" + |
| "Please place it in the current directory."); |
| System.exit(1); |
| } |
| catch(IOException ioex) |
| { |
| System.out.println("An error occured while reading config.dat.\n\n" + |
| "Please re-try ensuring the file can be read."); |
| System.exit(1); |
| } |
| GOLDParser parser = new GOLDParser(); |
| try |
| { |
| parser.loadCompiledGrammar(compiledGrammar); |
| parser.openFile(textToParse); |
| } |
| catch(ParserException parse) |
| { |
| System.out.println("**PARSER ERROR**\n" + parse.toString()); |
| System.exit(1); |
| } |
| boolean done = false; |
| int response = -1; |
| while(!done) |
| { |
| try |
| { |
| response = parser.parse(); |
| } |
| catch(ParserException parse) |
| { |
| System.out.println("**PARSER ERROR**\n" + parse.toString()); |
| System.exit(1); |
| } |
| switch(response) |
| { |
| case gpMsgTokenRead: |
| /* A token was read by the parser. The Token Object can be accessed |
| through the CurrentToken() property: Parser.CurrentToken */ |
| break; |
| case gpMsgReduction: |
| /* This message is returned when a rule was reduced by the |
| parse engine. The CurrentReduction property is assigned |
| a Reduction object containing the rule and its related |
| tokens. You can reassign this property to your own customized |
| class. If this is not the case, this message can be ignored |
| and the Reduction object will be used to store the parse tree.*/ |
| switch(Parser.CurrentReduction.TableIndex) |
| { |
| ##RULES |
| case %ID%: |
| // %Description% |
| break; |
| ##END-RULES |
| } |
| //Parser.Reduction = //Object you created to store the rule |
| // ************************************** log file |
| System.out.println("gpMsgReduction"); |
| Reduction myRed = parser.currentReduction(); |
| System.out.println(myRed.getParentRule().getText()); |
| // ************************************** end log |
| break; |
| case gpMsgAccept: |
| /* The program was accepted by the parsing engine */ |
| // ************************************** log file |
| System.out.println("gpMsgAccept"); |
| // ************************************** end log |
| done = true; |
| break; |
| case gpMsgLexicalError: |
| /* Place code here to handle a illegal or unrecognized token |
| To recover, pop the token from the stack: Parser.PopInputToken */ |
| // ************************************** log file |
| System.out.println("gpMsgLexicalError"); |
| // ************************************** end log |
| parser.popInputToken(); |
| break; |
| case gpMsgNotLoadedError: |
| /* Load the Compiled Grammar Table file first. */ |
| // ************************************** log file |
| System.out.println("gpMsgNotLoadedError"); |
| // ************************************** end log |
| done = true; |
| break; |
| case gpMsgSyntaxError: |
| /* This is a syntax error: the source has produced a token that |
| was not expected by the LALR State Machine. The expected |
| tokens are stored into the Tokens() list. To recover, push one of |
| the expected tokens onto the parser's input queue (the first in |
| this case): You should limit the number of times this type of |
| recovery can take place. */ |
| done = true; |
| Token theTok = parser.currentToken(); |
| System.out.println("Token not expected: " + (String)theTok.getData()); |
| // ************************************** log file |
| System.out.println("gpMsgSyntaxError"); |
| // ************************************** end log |
| break; |
| case gpMsgCommentError: |
| /* The end of the input was reached while reading a comment. |
| This is caused by a comment that was not terminated */ |
| // ************************************** log file |
| System.out.println("gpMsgCommentError"); |
| // ************************************** end log |
| done = true; |
| break; |
| case gpMsgInternalError: |
| /* Something horrid happened inside the parser. You cannot recover */ |
| // ************************************** log file |
| System.out.println("gpMsgInternalError"); |
| // ************************************** end log |
| done = true; |
| break; |
| } |
| } |
| try |
| { |
| parser.closeFile(); |
| } |
| catch(ParserException parse) |
| { |
| System.out.println("**PARSER ERROR**\n" + parse.toString()); |
| System.exit(1); |
| } |
| } |
| } |