package de.peeeq.wurstscript.jassAst


abstract syntax:

JassProgs * JassProg

JassProg(JassTypeDefs defs, JassVars globals, JassNatives natives, JassFunctions functions)

JassNatives * JassNative
JassTypeDefs * JassTypeDef
JassVars * JassVar
JassSimpleVars * JassSimpleVar
JassFunctions * JassFunction

JassTypeDef( String name, String ext)

JassFunctionOrNative = JassNative | JassFunction

JassNative(String name, JassSimpleVars params, String returnType )
	
	
JassVar = 
	  JassSimpleVar(String type, String name)
	| JassArrayVar(String type, String name)
	| JassInitializedVar(String type, String name, JassExpr val, boolean isBj)

JassFunction(String name, JassSimpleVars params, String returnType, JassVars locals, JassStatements body, boolean isCompiletimeNative)

JassStatements * JassStatement  

JassStatement	=
	  JassStmtIf(JassExpr cond, JassStatements thenBlock, JassStatements elseBlock)
	| JassStmtLoop(JassStatements body)
	| JassStmtSet(String left, JassExpr right)
	| JassStmtSetArray(String left, JassExpr index, JassExpr right)
	| JassStmtCall(String funcName, JassExprlist arguments)
	| JassStmtReturn(JassExpr returnValue)
	| JassStmtReturnVoid()
	| JassStmtExitwhen(JassExpr cond)
	

JassExprlist * JassExpr

JassExpr = 
	  JassExprBinary(JassExpr leftExpr, JassOpBinary op, JassExpr right) // left = a, op = "and" right="b" --> a and b k?
	| JassExprUnary(JassOpUnary opU, JassExpr right)
	| JassExprFunctionCall(String funcName, JassExprlist arguments)
	| JassExprAtomic
	
	
JassExprAtomic = 
	  JassExprIntVal(String valI)
	| JassExprRealVal(String valR)
	| JassExprStringVal(String valS)
	| JassExprBoolVal(boolean valB)
	| JassExprFuncRef(String funcName)
	| JassExprVarRef 
	| JassExprNull()
	
JassExprVarRef = 
	  JassExprVarAccess(String varName)
	| JassExprVarArrayAccess(String varName, JassExpr index)
	
JassOpBinary = 
	  JassOpOr() 
	| JassOpAnd()
	| JassOpEquals()
	| JassOpUnequals()
	| JassOpLessEq()
	| JassOpLess()
	| JassOpGreaterEq()
	| JassOpGreater()
	| JassOpPlus()
	| JassOpMinus()
	| JassOpMult()
	| JassOpDiv()
	
JassOpUnary = 
	  JassOpNot()
	| JassOpMinus
	
JassOp = JassOpBinary | JassOpUnary	
	
JassFuncRef = JassExprFuncRef | JassExprFunctionCall | JassStmtCall
	
JassScope = JassFunction | JassProg

attributes:

JassProgs.getExtendsMap
	returns java.util.Map<String, String>
	implemented by de.peeeq.wurstscript.frotty.jassAttributes.JassProgsAttr.getExtendsMap

JassExpr.getType()
	returns String
	implemented by de.peeeq.wurstscript.frotty.jassAttributes.JassExprAttr.getType
	
JassProgs.addFunction(JassFunction f)
	returns void
	implemented by de.peeeq.wurstscript.frotty.jassAttributes.JassProgsAttr.addFunction

JassProgs.addNative(JassNative n)
	returns void
	implemented by de.peeeq.wurstscript.frotty.jassAttributes.JassProgsAttr.addNative

JassProgs.addGlobal(JassVar v)
	returns void
	implemented by de.peeeq.wurstscript.frotty.jassAttributes.JassProgsAttr.addGlobal

JassProgs.addTypeDef(JassTypeDef t)
	returns void
	implemented by de.peeeq.wurstscript.frotty.jassAttributes.JassProgsAttr.addTypeDef
	
JassProgs.getFunction(String name)
	returns JassFunction
	implemented by de.peeeq.wurstscript.frotty.jassAttributes.JassProgsAttr.getFunction

JassProgs.getNative(String name)
	returns JassNative
	implemented by de.peeeq.wurstscript.frotty.jassAttributes.JassProgsAttr.getNative
	
JassProgs.getGlobal(String name)
	returns JassVar
	implemented by de.peeeq.wurstscript.frotty.jassAttributes.JassProgsAttr.getGlobal

JassProgs.getTypeDef(String name)
	returns JassTypeDef
	implemented by de.peeeq.wurstscript.frotty.jassAttributes.JassProgsAttr.getTypeDef
	
JassProg.validate()
	returns void
	implemented by de.peeeq.wurstscript.frotty.jassValidator.JassValidator.validate
	
Element.getLine
	returns int
	implemented by de.peeeq.wurstscript.frotty.jassValidator.LineMapAttr.getLine

Element.getProg
	returns JassProg
	implemented by de.peeeq.wurstscript.frotty.jassValidator.LineMapAttr.getProg	

	
JassProg.attrLineMap
	returns java.util.Map<Element, Integer >
	implemented by de.peeeq.wurstscript.frotty.jassValidator.LineMapAttr.get

JassExprVarRef.attrVariableDefinition "gets the var for a variable reference"
	returns JassVar
	implemented by de.peeeq.wurstscript.frotty.jassAttributes.VariableDefinition.get
	
JassExprFunctionCall.attrFunctionCall "gets the function for a function call"
	returns JassFunction
	implemented by de.peeeq.wurstscript.frotty.jassAttributes.FunctionCall.get
	
JassExprFuncRef.attrFuncRef "gets the function for a function reference"
	returns JassFunction
	implemented by de.peeeq.wurstscript.frotty.jassAttributes.FunctionReference.get
	
JassStmtCall.attrFunctionCall "gets the function for a function call"
	returns JassFunction
	implemented by de.peeeq.wurstscript.frotty.jassAttributes.FunctionCall.get	
	
JassStmtSet.attrVariableDefinition "gets the var for a variable reference"
	returns JassStmtSet
	implemented by de.peeeq.wurstscript.frotty.jassAttributes.VariableDefinition.get

JassStmtSetArray.attrVariableDefinition "gets the var for a variable reference"
	returns JassStmtSetArray
	implemented by de.peeeq.wurstscript.frotty.jassAttributes.VariableDefinition.get

JassProg.attrIgnoredVariables
	returns java.util.Set<JassVar>
	implemented by de.peeeq.wurstscript.attributes.JassAttributes.attrIgnoredVariables

JassProg.attrComments
	returns java.util.Map<Element, String>
	implemented by de.peeeq.wurstscript.attributes.JassAttributes.attrComments
	
JassProg.attrIgnoredFunctions
	returns java.util.Set<JassFunction>
	implemented by de.peeeq.wurstscript.attributes.JassAttributes.attrIgnoredFunctions
	
JassFuncRef.attrFuncDef
	returns JassFunction
	implemented by de.peeeq.wurstscript.attributes.JassAttributes.attrFuncDef

	
JassExpr.print(java.lang.StringBuilder sb, boolean withSpace)
	returns void
	implemented by de.peeeq.wurstscript.jassprinter.ExprPrinter.print
	
JassTypeDef.print(java.lang.StringBuilder sb, boolean withSpace)
	returns void
	implemented by de.peeeq.wurstscript.jassprinter.JassPrinter.printTypeDef
	
JassNative.print(java.lang.StringBuilder sb, boolean withSpace)
	returns void
	implemented by de.peeeq.wurstscript.jassprinter.JassPrinter.printNative

JassStatement.print(java.lang.StringBuilder sb, int indent, boolean withSpace)
	returns void
	implemented by de.peeeq.wurstscript.jassprinter.StatementPrinter.print

JassOp.print(java.lang.StringBuilder sb, boolean withSpace, boolean useParanthesesLeft, boolean useParanthesesRight)
	returns void
	implemented by de.peeeq.wurstscript.jassprinter.OpPrinter.print

JassOp.asString()
	returns String
	implemented by de.peeeq.wurstscript.jassprinter.OpPrinter.asString
