/*********************************************************************
 Grammar for programs in the Drewscript language
 ********************************************************************/
program		: globals

globals		: globals decl
			| ε

decl		: varDecl SEMICOL
			| fnDecl

varDecl		: type name
			| type name ARROW initializer

type		: primType LBRACKET INTLITERAL RBRACKET
			| primType
			| VOID

primType	: INT
			| BOOL
			| FILE

fnDecl 		: type name LPAREN maybeFormals RPAREN LCURLY stmtList RCURLY
			| type name LPAREN maybeFormals RPAREN ARROW exp

maybeFormals	: ε
				| formalList

formalList	: formalDecl
			| formalList COMMA formalDecl

formalDecl	: name COLON type
			| name COLON type ASSIGN initializer

stmtList	: ε
			| stmtList stmt SEMICOL
			| stmtList blockStmt

blockStmt	: WHILE LPAREN exp RPAREN LCURLY stmtList RCURLY
		| IF LPAREN exp RPAREN LCURLY stmtList RCURLY
		| IF LPAREN exp RPAREN LCURLY stmtList RCURLY ELSE LCURLY stmtList RCURLY

stmt	: varDecl
		| loc ASSIGN exp
		| callExp
		| loc POSTDEC
		| loc POSTINC
		| READ loc
		| READ loc ARROW exp
		| PRINT exp
		| PRINT exp ARROW loc
		| RETURN exp
		| RETURN

exp		: exp DASH exp
		| exp CROSS exp
		| exp STAR exp
		| exp SLASH exp
		| exp AND exp
		| exp OR exp
		| exp EQUALS exp
		| exp NOTEQUALS exp
		| exp GREATER exp
		| exp GREATEREQ exp
		| exp LESS exp
		| exp LESSEQ exp
		| NOT exp
		| DASH term
		| term


callExp		: loc LPAREN RPAREN
			| loc LPAREN actualsList RPAREN

actualsList	: exp
			| actualsList COMMA exp

term 		: loc
			| literal
			| LPAREN exp RPAREN
			| LBRACKET exp QUESTION exp COLON exp RBRACKET
			| callExp

initializer	: literal
			| LBRACKET litList RBRACKET

litList		: literal
			| literal COMMA litList

literal		: TRUE
			| FALSE
			| INTLITERAL
			| STRINGLITERAL

loc			: name
			| loc LBRACKET exp RBRACKET

name		: ID
