grammar FWJ;

// Inputsyntax für ein Federleichtes Java

sourceFile : (classX)+;

classX : Class bezeichner '{' (feld)*  methodDecl*  '}';


feld: bezeichner bezeichner ';';

//returnExpression: 'return'  expression ';' ;
//methodCall: Token2 '(' expr? ')';


//expression:  exprVar  |  exprNew | exprMcall ;
//method: Var '(' expressionArgs? ')'  '{' returnExpression? '}'   ;
//args:  Var  | (Var ',')+  Var ;
//expressionArgs : expression | (expression ',')+ expression;

generics: '<'  ( (generic ',' )+  generic |   generic? ) '>';
generic: (bezeichner '=' bezeichner);

methodDecl: bezeichner '(' methodDeclArgs? ')'  '{' returnExpr? '}'   ;
methodDeclArgs:  bezeichner  | (bezeichner ',')+  bezeichner ;

returnExpr: 'return' expr ';' ;


exprMCall : bezeichner '(' exprMCallArgs? ')';
exprVar: bezeichner;
exprField: '.'bezeichner;
exprNew: 'new' bezeichner generics? '('exprMCallArgs?')';


expr: exprVar | expr'.'expr |  exprField | exprMCall | exprNew ;
exprMCallArgs: expr | ( expr ',')+  expr;


Class: 'class';
// Für Klassen und Variablen
bezeichner: Token2;
Token2: [a-zA-Z0-9_]+;


Linefeed: '\r'? '\n' -> skip; //'\r' für Windows linefeed
WS : [ \t]+ -> skip; //Überspringen aller Leerzeichen