Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ## HarveyParser.jj
- 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 Error() :{} {
- { System.out.println("error"); }
- <ERROR>
- }
- void ctrlstatement() :{} {
- (ifstatement() | condstatement() | dostatement())
- }
- void ifstatement() :{} {
- <IF>
- 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"]> { debugStream.println("ERROR token: " + matchedToken.image); }
- }
- //error handling
- JAVACODE
- String handleError(Token token) {
- System.out.println("*** ERROR Line " + token.beginLine + " after \"" + token.image + "\"");
- Token t;
- do {
- t = getNextToken();
- } while (t.kind != EOF);
- // remove partially built AST node
- jjtree.popNode();
- return t.image;
- }
- ## test.txt
- <PROGRAM>
- ;statements
- | = c 2
- ;function defs
- [ func1 a b
- return + a b
- ]
- ;function calls
- | print + c func1 2 3
- | func1 b c
- \fartknocker
- ;if statements
- if [< c 2
- | = c 3]
- ;cond statements (acting as a switch)
- cond [ < c 2 ]
- [ >= c 3
- | func1 b c]
- ;do statements
- do d 10 (+ d 1)
- [>= d 15
- | func1 b c]
- </PROGRAM>
- ##Output
- macbookpro13:HW7 kristen$ java HarveyParser test.txt
- program
- statement
- arguments
- IDENTIFIER token: c
- arguments
- NUMBER token: 2
- function
- functionname
- IDENTIFIER token: func1
- IDENTIFIER token: a
- func_arguments
- IDENTIFIER token: b
- func_arguments
- functionret
- arguments
- IDENTIFIER token: a
- arguments
- IDENTIFIER token: b
- statement
- arguments
- IDENTIFIER token: c
- arguments
- IDENTIFIER token: func1
- NUMBER token: 2
- arguments
- NUMBER token: 3
- arguments
- statement
- IDENTIFIER token: func1
- functionname
- IDENTIFIER token: b
- arguments
- IDENTIFIER token: c
- arguments
- ERROR token: \
- error
- *** ERROR Line 18 after "\"
- IDENTIFIER token: fartknocker
- IDENTIFIER token: c
- NUMBER token: 2
- IDENTIFIER token: c
- NUMBER token: 3
- IDENTIFIER token: c
- NUMBER token: 2
- IDENTIFIER token: c
- NUMBER token: 3
- IDENTIFIER token: func1
- IDENTIFIER token: b
- IDENTIFIER token: c
- IDENTIFIER token: d
- NUMBER token: 10
- IDENTIFIER token: d
- NUMBER token: 1
- IDENTIFIER token: d
- NUMBER token: 15
- IDENTIFIER token: func1
- IDENTIFIER token: b
- IDENTIFIER token: c
Add Comment
Please, Sign In to add comment