/*
 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 * See the copyright notice in the ACK home directory, in the file "Copyright".
 *
 * Author: Ceriel J.H. Jacobs
 */

/* E X P R E S S I O N S */

/* stripped down version of the one in the Modula-2 compiler */

/* $Header$ */

qualident :
	IDENT
	[
		selector
	]*
;

selector :
	'.' IDENT
;

ExpList :
	expression
	[
		',' expression
	]*
;

ConstExpression :
	expression
	/*
	 * Changed rule in new Modula-2.
	 */
;

expression :
	SimpleExpression
	[
		/* relation */
		[ '=' | '#' | '<' | LESSEQUAL | '>' | GREATEREQUAL | IN ]
		SimpleExpression
	|
		/* empty */
	]
;

SimpleExpression :
	[
		'+' 
	|
		'-'
	|
		/* empty */
	]
	term
	[
		/* AddOperator */
		[ '+' | '-' | OR ] term
	]*
;

term :
	factor
	[
		/* MulOperator */
		[ '*' | '/' | DIV | MOD | AND ] factor
	]*
;

factor :
	qualident
	[
		designator_tail?
		[
			ActualParameters
		|
			/* empty */
		]
	|
		bare_set
	]
|
	bare_set
| %default
	[ %default
		INTEGER
	|
		REAL
	|
		STRING
	]
|
	'(' expression ')'
|
	NOT factor
;

bare_set :
	'{'
	[
		element
		[
			',' element
		]*
	|
		/* empty */
	]
	'}'
;

ActualParameters :
	'(' ExpList? ')'
;

element :
	expression
	[
		UPTO expression
	|
		/* empty */
	]
;

designator :
	qualident designator_tail?
;

designator_tail :
	visible_designator_tail
	[ %persistent
	    %default
		selector
	|
		visible_designator_tail
	]*
;

visible_designator_tail :
	'['
		expression
		[
			',' expression
		]*
	']'
|
	'^'
;