options { STATIC = false; } PARSER_BEGIN(FJParser) import java.io.*; import java.util.*; import cide.gast.*; import cide.gparser.*; public class FJParser extends AbstractFSTParser { } PARSER_END(FJParser) /* WHITE SPACE */ SPECIAL_TOKEN : { " " | "\t" | "\n" | "\r" | "\f" } /* COMMENTS */ MORE : { "//" : IN_SINGLE_LINE_COMMENT | <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT | "/*" : IN_MULTI_LINE_COMMENT } SPECIAL_TOKEN : { : DEFAULT } SPECIAL_TOKEN : { : DEFAULT } SPECIAL_TOKEN : { : DEFAULT } MORE : { < ~[] > } /* RESERVED WORDS AND LITERALS */ TOKEN : { < THIS: "this" > | < OBJECT: "Object" > | < CLASS: "class" > | < EXTENDS: "extends" > | < INT: "int" > | < NEW: "new" > | < RETURN: "return" > | < SUPER: "super" > } /* LITERALS */ TOKEN : { < INTEGER_LITERAL: (["l","L"])? | (["l","L"])? | (["l","L"])? > | < #DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* > | < #HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ > | < #OCTAL_LITERAL: "0" (["0"-"7"])* > } /* IDENTIFIERS */ TOKEN : { < IDENTIFIER: (|)* > | < #LETTER: [ "\u0024", "\u0041"-"\u005a", "\u005f", "\u0061"-"\u007a", "\u00c0"-"\u00d6", "\u00d8"-"\u00f6", "\u00f8"-"\u00ff", "\u0100"-"\u1fff", "\u3040"-"\u318f", "\u3300"-"\u337f", "\u3400"-"\u3d2d", "\u4e00"-"\u9fff", "\uf900"-"\ufaff" ] > | < #DIGIT: [ "\u0030"-"\u0039", "\u0660"-"\u0669", "\u06f0"-"\u06f9", "\u0966"-"\u096f", "\u09e6"-"\u09ef", "\u0a66"-"\u0a6f", "\u0ae6"-"\u0aef", "\u0b66"-"\u0b6f", "\u0be7"-"\u0bef", "\u0c66"-"\u0c6f", "\u0ce6"-"\u0cef", "\u0d66"-"\u0d6f", "\u0e50"-"\u0e59", "\u0ed0"-"\u0ed9", "\u1040"-"\u1049" ] > } /* SEPARATORS */ TOKEN : { < LPAREN: "(" > | < RPAREN: ")" > | < LBRACE: "{" > | < RBRACE: "}" > | < COMMA: "," > | < DOT: "." > } /* OPERATORS */ TOKEN : { < PLUS: "+" > | < MINUS: "-" > | < STAR: "*" > | < SLASH: "/" > } String TypeDeclaration(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( "class" n=Name(inTerminal){ replaceName("Name",n);} "extends" ExtendedType(inTerminal) "{" (LOOKAHEAD(2) VarDeclaration(inTerminal))* ClassConstructor(inTerminal) (MethodDeclaration(inTerminal))* "}" {return productionEndNonTerminal("TypeDeclaration","{Name}");} ) } String Name(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( t={ replaceName("",t.toString());} {return productionEndTerminal("Name","{}",first,token);} ) } String ExtendedType(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( {return productionEndTerminal("ExtendedType1","",first,token);} | "Object" {return productionEndTerminal("ExtendedType2","",first,token);} ) } String VarDeclaration(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( Type(true) t={ replaceName("",t.toString());} ";" {return productionEndTerminal("VarDeclaration","{}",first,token);} ) } String ClassConstructor(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( Type(true) "(" [FormalParameterList(true)] ")" "{" "super" "(" [ExpressionList(true)] ")" ";" (FieldAssign(true))* "}" {return productionEndTerminal("ClassConstructor","",first,token);} ) } String FieldAssign(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( "this" "." "=" ";" {return productionEndTerminal("FieldAssign","",first,token);} ) } String MethodDeclaration(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( Type(true) t={ replaceName("",t.toString());} "(" [FormalParameterList(true)] ")" "{" "return" Expression(true) ";" "}" {return productionEndTerminal("MethodDeclaration","{}",first,token);} ) } String BinaryOperator(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( "+" {return productionEndTerminal("BinaryOperator1","",first,token);} | "-" {return productionEndTerminal("BinaryOperator2","",first,token);} | "*" {return productionEndTerminal("BinaryOperator3","",first,token);} | "/" {return productionEndTerminal("BinaryOperator4","",first,token);} ) } String FormalParameterList(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( FormalParameter(true) (FormalParameterRest(true))* {return productionEndTerminal("FormalParameterList","",first,token);} ) } String FormalParameter(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( Type(true) {return productionEndTerminal("FormalParameter","",first,token);} ) } String FormalParameterRest(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( "," FormalParameter(true) {return productionEndTerminal("FormalParameterRest","",first,token);} ) } String Type(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( "int" {return productionEndTerminal("Type1","",first,token);} | {return productionEndTerminal("Type2","",first,token);} | "Object" {return productionEndTerminal("Type3","",first,token);} ) } String Expression(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( Term(true) (PlusOrMinus(true))* {return productionEndTerminal("Expression","",first,token);} ) } String PlusOrMinus(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( PlusExpressionRest(true) {return productionEndTerminal("PlusOrMinus1","",first,token);} | MinusExpressionRest(true) {return productionEndTerminal("PlusOrMinus2","",first,token);} ) } String PlusExpressionRest(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( "+" Term(true) {return productionEndTerminal("PlusExpressionRest","",first,token);} ) } String MinusExpressionRest(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( "-" Term(true) {return productionEndTerminal("MinusExpressionRest","",first,token);} ) } String Term(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( PrimaryExpression(true) (TimesOrDivide(true))* {return productionEndTerminal("Term","",first,token);} ) } String TimesOrDivide(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( TimesExpressionRest(true) {return productionEndTerminal("TimesOrDivide1","",first,token);} | DivideExpressionRest(true) {return productionEndTerminal("TimesOrDivide2","",first,token);} ) } String TimesExpressionRest(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( "*" PrimaryExpression(true) {return productionEndTerminal("TimesExpressionRest","",first,token);} ) } String DivideExpressionRest(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( "/" PrimaryExpression(true) {return productionEndTerminal("DivideExpressionRest","",first,token);} ) } String PrimaryExpression(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( {return productionEndTerminal("PrimaryExpression1","",first,token);} | LOOKAHEAD(2147483647) MethodInvoke(true) {return productionEndTerminal("PrimaryExpression2","",first,token);} | LOOKAHEAD(2147483647) FieldInvoke(true) {return productionEndTerminal("PrimaryExpression3","",first,token);} | {return productionEndTerminal("PrimaryExpression4","",first,token);} | LOOKAHEAD(2147483647) AllocationExpression(true) {return productionEndTerminal("PrimaryExpression5","",first,token);} | LOOKAHEAD(2147483647) CastExpression(true) {return productionEndTerminal("PrimaryExpression6","",first,token);} | NestedExpression(true) {return productionEndTerminal("PrimaryExpression7","",first,token);} ) } String MethodInvoke(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( InvokeTarget(true) "." "(" [ExpressionList(true)] ")" {return productionEndTerminal("MethodInvoke","",first,token);} ) } String FieldInvoke(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( InvokeTarget(true) "." {return productionEndTerminal("FieldInvoke","",first,token);} ) } String InvokeTarget(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( AllocationExpression(true) {return productionEndTerminal("InvokeTarget1","",first,token);} | NestedExpression(true) {return productionEndTerminal("InvokeTarget2","",first,token);} | {return productionEndTerminal("InvokeTarget3","",first,token);} | "this" {return productionEndTerminal("InvokeTarget4","",first,token);} ) } String AllocationExpression(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( "new" "(" [ExpressionList(true)] ")" {return productionEndTerminal("AllocationExpression","",first,token);} ) } String CastExpression(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( "(" Type(true) ")" PrimaryExpression(true) {return productionEndTerminal("CastExpression","",first,token);} ) } String NestedExpression(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( "(" Expression(true) ")" {return productionEndTerminal("NestedExpression","",first,token);} ) } String ExpressionList(boolean inTerminal) : { Token first=null,t;String n; } { {first=getToken(1); productionStart(inTerminal); } ( Expression(true) ("," Expression(true))* {return productionEndTerminal("ExpressionList","",first,token);} ) }