Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- options {
- DEBUG_LOOKAHEAD = false;
- DEBUG_PARSER = false;
- }
- PARSER_BEGIN(HarveyParser)
- import java.io.*;
- public class HarveyParser {
- public static void main(String[] args) {
- FileReader sr = null;
- try {
- sr = new FileReader(args[0]);
- } catch (Exception e) {}
- HarveyParser p = new HarveyParser(sr);
- try {
- //p.Program();
- SimpleNode node = p.Program();
- // dump is the AST printer
- node.dump(">");
- } catch (Exception e) {}
- }
- }
- PARSER_END(HarveyParser)
- SKIP : {
- <IGNORE : ["(", ")", " ", ",", "\n", "\r", "\t"]>
- | <SCOMMENT : ";" (~["\n", "\r"])* ("\r" | "\n" | "\r\n")>
- }
- SimpleNode Program() : {} {
- { System.out.println("program");}
- <BEGIN_PROGRAM>
- (
- try {
- ctrlstatement()
- | Statement()
- | FunctionDecl()
- | Error() { handleError(token); }
- }
- catch (ParseException ex) {
- handleError(ex.currentToken);
- }
- )*
- <END_PROGRAM>
- { System.out.println("end program");}
- <EOF>
- // jjtree stuff - jjtThis is the current AST node
- { return jjtThis; }
- }
- void ctrlstatement() :{} {
- (ifstatement() | condstatement() | dostatement())
- }
- void ifstatement() :{Token t;} {
- t=<IF> { jjtThis.setImage(t.image); }
- condblock()
- }
- void condstatement() :{} {
- <COND>
- (
- condblock()
- )+
- }
- void condblock() : {} {
- "["
- expr()
- (Statement())*
- "]"
- }
- void dostatement() :{} {
- <DO>
- <IDENTIFIER>
- <NUMBER>
- expr()
- condblock()
- }
- void Statement() : {} {
- { System.out.println("statement"); }
- "|"
- (
- ((FunctionName() | <PRINT>) expr())
- |sexpr()
- )
- }
- void FunctionDecl() : {} {
- { System.out.println("function"); }
- "["
- FunctionName()
- (FuncArguments())*
- ( Statement() )*
- (FuncReturn())?
- "]"
- }
- void expr(): {} {
- (Arguments())+ | sexpr()
- }
- void sexpr(): {}{
- (<PLUS> | <MINUS> | <STAR> | <EQUAL> | <BACKSLASH> | <GREATER_THAN> | <GREATER_EQUALS> | <LESS_THAN> | <LESS_EQUALS>)
- (Arguments())
- (Arguments())+
- }
- void FunctionName() : {} {
- { System.out.println("functionname"); }
- <IDENTIFIER>
- }
- void FuncReturn() : {} {
- {System.out.println("functionret"); }
- <RETURN>
- expr()
- }
- void FuncArguments() : {} {
- { System.out.println("func_arguments"); }
- (<IDENTIFIER> | (<NUMBER>))
- }
- void Arguments() : {} {
- { System.out.println("arguments"); }
- (<IDENTIFIER> | (<NUMBER>))
- }
- TOKEN : {
- <BEGIN_PROGRAM : ("<PROGRAM>")>
- | <END_PROGRAM : ("</PROGRAM>")>
- //reserved
- |<RETURN: "return">
- |<COND: "cond">
- |<PRINT: "print">
- |<IF: "if">
- |<DO: "do">
- //tokens
- | <IDENTIFIER : (<LETTER> | "_") (<LETTER> | <DIGIT> | "_")*>
- { debugStream.println("IDENTIFIER token: " + matchedToken.image); }
- | <STRING : ("\"") (~["\n", "\r"])* ("\"")>
- { debugStream.println("STRING token: " + matchedToken.image); }
- | <NUMBER : (<INT_DECIMAL> | <INT_OCTAL> | <INT_HEXADECIMAL>)>
- { debugStream.println("NUMBER token: " + matchedToken.image); }
- | <FLOATING_POINT : (<DIGIT>)+<DOT>(<FLOATFRAC>)? (<FLOATEXP>)? | <DOT><FLOATFRAC>(<FLOATEXP>)? | (<DIGIT>)+<FLOATEXP> >
- { debugStream.println("FLOATING_POINT token: " + matchedToken.image); }
- | <#FLOATFRAC : (<DIGIT>)+>
- | <#FLOATEXP : ["E"](["+" , "-"])?(<DIGIT>)+>
- | <#DIGIT : ["0"-"9"]>
- | <#INT_DECIMAL : ["1"-"9"] (<DIGIT>)*>
- | <#INT_OCTAL : ["0"](["0"-"7"])*>
- | <#INT_HEXADECIMAL : ["0"]["x"](<DIGIT>|["a"-"f"]|["A"-"F"])*>
- | <#LETTER : <UPPER_LETTER> | <LOWER_LETTER>>
- | <#UPPER_LETTER : ["A"-"Z"]>
- | <#LOWER_LETTER : ["a"-"z"]>
- | <#SLASH : ["/"]>
- //begin special symbols
- |<DOT : ".">
- |<PLUS:"+">
- |<MINUS:"-">
- |<STAR:"*">
- |<EQUAL:"=">
- |<SEMICOLON:";">
- |<COLON:":">
- |<EQUALS:"==">
- |<NOT_EQUALS:"!=">
- |<LESS_THAN:"<">
- |<LESS_EQUALS:"<=">
- |<GREATER_EQUALS:">=">
- |<GREATER_THAN:">">
- |<BACKSLASH:"/">
- |<LEFT_BRACE : "{">
- |<RIGHT_BRACE : "}">
- //error handling
- |<ERROR : ~["\r", "\n"]>
- }
- //error handling
- JAVACODE
- String handleError(Token token) {
- System.out.println("*** ERRORL Line " + token.beginLine + " after \"" + token.image + "\"");
- Token t;
- do {
- t = getNextToken();
- } while (t.kind != EOL);
- // remove partially built AST node
- jjtree.popNode();
- return t.image;
- }
Add Comment
Please, Sign In to add comment