Grammar EsterelParser
ANTLR-generated HTML file from esterel.g

Terence Parr, MageLang Institute
ANTLR Version 2.7.2; 1989-1999


/**
 *
 * Esterel Grammar for ANTLR based on the grammar in the Esterel Primer, v91
 * Also includes deprecated syntax: see commentary below.
 *
 * Author: Stephen A. Edwards
 *         sedwards@cs.columbia.edu
 *
 * This generates a generic AST using ANTLR's built-in facilities for AST
 * synthesis.
 *
 * Change Log
 */
Definition of parser EsterelParser, which is a subclass of LLkParser.


file
	:	( module )+ EOF 
	;


module
	:	"module" moduleIdentifier COLON declarations statement 
		(	"end" "module" 
		|	PERIOD 
		) 
	;


moduleIdentifier
	:	ID 
	;


declarations
	:	( interfaceDecls )* 
	;


statement
	:	sequence ( PARALLEL sequence )* 
	;


interfaceDecls
	:	typeDecls 
	|	constantDecls 
	|	functionDecls 
	|	procedureDecls 
	|	taskDecls 
	|	interfacesignalDecls 
	|	sensorDecls 
	|	relationDecls 
	;


typeDecls
	:	"type" typeIdentifier ( COMMA typeIdentifier )* SEMICOLON 
	;


constantDecls
	:	"constant" constantDecl ( COMMA constantDecl )* SEMICOLON 
	;


functionDecls
	:	"function" functionDecl ( COMMA functionDecl )* SEMICOLON 
	;


procedureDecls
	:	"procedure" procedureDecl ( COMMA procedureDecl )* SEMICOLON 
	;


taskDecls
	:	"task" taskDecl ( COMMA taskDecl )* SEMICOLON 
	;


/**
    The grammar allows full expressions in the initializers
    but only constants are permitted in interface signals.
*/
interfacesignalDecls
	:	"input" signalDecl ( COMMA signalDecl )* SEMICOLON 
	|	"output" signalDecl ( COMMA signalDecl )* SEMICOLON 
	|	"inputoutput" signalDecl ( COMMA signalDecl )* SEMICOLON 
	|	"return" signalDecl ( COMMA signalDecl )* SEMICOLON 
	;


sensorDecls
	:	"sensor" sensorDecl ( COMMA sensorDecl )* SEMICOLON 
	;


relationDecls
	:	"relation" relationDecl ( COMMA relationDecl )* SEMICOLON 
	;


typeIdentifier
	:	ID 
	;


constantDecl
	:	(	constantIdentifier 
			(	constantInitializer 
			|	
			) 
		|	identifierList 
		) 
		COLON typeIdentifier 
	;


constantIdentifier
	:	ID 
	;


constantInitializer
	:	EQUALS constantAtom 
	;


identifierList
	:	ID COMMA ID ( COMMA ID )* 
	;


constantAtom
	:	constantLiteral 
	|	signedNumber 
	;


functionDecl
	:	functionIdentifier optTypeIdentifierList COLON typeIdentifier 
	;


functionIdentifier
	:	ID 
	;


optTypeIdentifierList
	:	LPAREN 
		(	typeIdentifier ( COMMA typeIdentifier )* 
		|	
		) 
		RPAREN 
	;


procedureDecl
	:	procedureIdentifier optTypeIdentifierList optTypeIdentifierList 
	;


procedureIdentifier
	:	ID 
	;


taskDecl
	:	taskIdentifier optTypeIdentifierList optTypeIdentifierList 
	;


taskIdentifier
	:	ID 
	;


signalDecl
	:	signalIdentifier 
		(	
		|	(	signalInitializer 
			|	
			) 
			COLON channelType 
		|	LPAREN channelType RPAREN 
		) 
		
	;


signalDeclList
	:	signalDecl ( COMMA signalDecl )* 
	;


signalIdentifier
	:	ID 
	;


signalInitializer
	:	COLEQUALS expression 
	;


channelType
	:	typeIdentifier 
	|	"combine" typeIdentifier "with" 
		(	functionIdentifier 
		|	predefinedCombineFunction 
		) 
	;


/***********************************************************************
 *
 * Expressions
 *
 ***********************************************************************/
expression
	:	orexpr 
	;


predefinedCombineFunction
	:	PLUS 
	|	STAR 
	|	"or" 
	|	"and" 
	;


sensorDecl
	:	sensorIdentifier 
		(	COLON typeIdentifier 
		|	LPAREN typeIdentifier RPAREN 
		) 
		
	;


sensorIdentifier
	:	ID 
	;


relationDecl
	:	implicationDecl 
	|	exclusionDecl 
	;


implicationDecl
	:	signalIdentifier IMPLIES signalIdentifier 
	;


exclusionDecl
	:	signalIdentifier POUND signalIdentifier ( POUND signalIdentifier )* 
	;


orexpr
	:	andexpr ( "or" andexpr )* 
	;


andexpr
	:	notexpr ( "and" notexpr )* 
	;


notexpr
	:	"not" cmpexpr 
	|	cmpexpr 
	;


cmpexpr
	:	addexpr ( (	EQUALS 
			|	NEQUAL 
			|	LESSTHAN 
			|	GREATERTHAN 
			|	LEQUAL 
			|	GEQUAL 
			) 
			addexpr )* 
	;


addexpr
	:	mulexpr ( (	PLUS 
			|	DASH 
			) 
			mulexpr )* 
	;


mulexpr
	:	unaryexpr ( (	STAR 
			|	SLASH 
			|	"mod" 
			) 
			unaryexpr )* 
	;


unaryexpr
	:	DASH unaryexpr 
	|	LPAREN expression RPAREN 
	|	QUESTION signalIdentifier 
	|	"pre" LPAREN QUESTION signalIdentifier RPAREN 
	|	DQUESTION trapIdentifier 
	|	functionCall 
	|	constant 
	;


trapIdentifier
	:	ID 
	;


functionCall
	:	functionIdentifier LPAREN 
		(	expression ( COMMA expression )* 
		|	
		) 
		RPAREN 
	;


constant
	:	constantLiteral 
	|	unsignedNumber 
	;


constantLiteral
	:	constantIdentifier 
	|	"true" 
	|	"false" 
	|	stringConstant 
	;


unsignedNumber
	:	Integer 
	|	FloatConst 
	|	DoubleConst 
	;


stringConstant
	:	StringConstant 
	;


signedNumber
	:	unsignedNumber 
	|	DASH unsignedNumber 
	;


signalExpression
	:	sandexpr ( "or" sandexpr )* 
	;


sandexpr
	:	sunaryexpr ( "and" sunaryexpr )* 
	;


sunaryexpr
	:	signalIdentifier 
	|	"pre" LPAREN signalIdentifier RPAREN 
	|	"not" sunaryexpr 
	|	LPAREN signalExpression RPAREN 
	;


delayExpression
	:	(	delayPair 
		|	bracketedSignalExpression 
		|	"immediate" bracketedSignalExpression 
		) 
	;


bracketedSignalExpression
	:	signalIdentifier 
	|	LBRACKET signalExpression RBRACKET 
	;


delayPair
	:	expression bracketedSignalExpression 
	;


sequence
	:	atomicStatement ( SEMICOLON atomicStatement )* 
		(	SEMICOLON 
		|	
		) 
		
	;


atomicStatement
	:	"nothing" 
	|	"pause" 
	|	"halt" 
	|	emit 
	|	sustain 
	|	assignment 
	|	procedureCall 
	|	present 
	|	ifstatement 
	|	loop 
	|	repeat 
	|	abort 
	|	await 
	|	every 
	|	suspend 
	|	trap 
	|	exit 
	|	exec 
	|	localvariableDecl 
	|	localSignalDecl 
	|	runModule 
	|	LBRACKET statement RBRACKET 
	|	doStatements 
	;


emit
	:	"emit" signalIdentifier 
		(	LPAREN expression RPAREN 
		|	
		) 
	;


sustain
	:	"sustain" signalIdentifier 
		(	LPAREN expression RPAREN 
		|	
		) 
	;


assignment
	:	variableIdentifier COLEQUALS expression 
	;


procedureCall
	:	"call" procedureIdentifier refArgs valueArgs 
	;


present
	:	"present" 
		(	presentThenPart 
		|	( presentCase )+ 
		) 
		(	elsePart 
		|	
		) 
		"end" 
		(	"present" 
		|	
		) 
	;


ifstatement
	:	"if" expression 
		(	thenPart 
		|	
		) 
		( elsif )* 
		(	elsePart 
		|	
		) 
		"end" 
		(	"if" 
		|	
		) 
	;


loop
	:	"loop" statement 
		(	"end" 
			(	"loop" 
			|	
			) 
		|	"each" delayExpression 
		) 
	;


repeat
	:	(	"positive" 
		|	
		) 
		"repeat" expression "times" statement "end" 
		(	"repeat" 
		|	
		) 
	;


abort
	:	"abort" statement "when" 
		(	abortOneCaseStrong 
		|	( acase )+ "end" 
			(	"abort" 
			|	
			) 
		) 
	|	"weak" "abort" statement "when" 
		(	abortOneCaseWeak 
		|	( acase )+ "end" 
			(	(	"weak" 
				|	
				) 
				"abort" 
			|	
			) 
		) 
	;


await
	:	"await" 
		(	awaitOneCase 
		|	( acase )+ "end" 
			(	"await" 
			|	
			) 
		) 
	;


every
	:	"every" delayExpression "do" statement "end" 
		(	"every" 
		|	
		) 
	;


suspend
	:	"suspend" statement "when" delayExpression 
	;


trap
	:	"trap" trapDeclList "in" statement ( trapHandler )* "end" 
		(	"trap" 
		|	
		) 
	;


exit
	:	"exit" trapIdentifier 
		(	LPAREN expression RPAREN 
		|	
		) 
	;


exec
	:	"exec" execOneCase 
	|	"exec" ( execCase )+ "end" 
		(	"exec" 
		|	
		) 
	;


localvariableDecl
	:	"var" variableDeclList "in" statement "end" 
		(	"var" 
		|	
		) 
	;


localSignalDecl
	:	"signal" signalDeclList "in" statement "end" 
		(	"signal" 
		|	
		) 
	;


runModule
	:	(	"run" 
		|	"copymodule" 
		) 
		moduleIdentifier 
		(	SLASH moduleIdentifier 
		|	
		) 
		(	LBRACKET renaming ( SEMICOLON renaming )* RBRACKET 
		|	
		) 
		
	;


doStatements
	:	"do" statement 
		(	"watching" delayExpression 
			(	"timeout" statement "end" 
				(	"timeout" 
				|	
				) 
			|	
			) 
			
		|	"upto" delayExpression 
		) 
	;


variableIdentifier
	:	ID 
	;


refArgs
	:	LPAREN 
		(	variableIdentifier ( COMMA variableIdentifier )* 
		|	
		) 
		RPAREN 
	;


valueArgs
	:	LPAREN 
		(	expression ( COMMA expression )* 
		|	
		) 
		RPAREN 
	;


presentThenPart
	:	presentEvent 
		(	"then" statement 
		|	
		) 
		
	;


presentCase
	:	"case" presentEvent 
		(	"do" statement 
		|	
		) 
		
	;


elsePart
	:	"else" statement 
	;


presentEvent
	:	(	signalExpression 
		|	LBRACKET signalExpression RBRACKET 
		) 
	;


thenPart
	:	"then" statement 
	;


elsif
	:	"elsif" expression "then" statement 
	;


abortOneCaseStrong
	:	delayExpression 
		(	"do" statement "end" 
			(	"abort" 
			|	
			) 
		|	
		) 
		
	;


acase
	:	"case" delayExpression 
		(	"do" statement 
		|	
		) 
		
	;


abortOneCaseWeak
	:	delayExpression 
		(	"do" statement "end" 
			(	(	"weak" 
				|	
				) 
				"abort" 
			|	
			) 
		|	
		) 
		
	;


awaitOneCase
	:	delayExpression 
		(	"do" statement "end" 
			(	"await" 
			|	
			) 
		|	
		) 
		
	;


trapDeclList
	:	trapDecl ( COMMA trapDecl )* 
	;


trapHandler
	:	"handle" trapEvent "do" statement 
	;


trapDecl
	:	trapIdentifier 
		(	(	trapInitializer 
			|	
			) 
			COLON channelType 
		|	
		) 
		
	;


trapInitializer
	:	COLEQUALS expression 
	;


trapEvent
	:	eand ( "or" eand )* 
	;


eand
	:	eunary ( "and" eunary )* 
	;


eunary
	:	trapIdentifier 
	|	LPAREN trapEvent RPAREN 
	|	"not" eunary 
	;


execOneCase
	:	taskIdentifier refArgs valueArgs "return" signalIdentifier 
		(	"do" statement "end" 
			(	"exec" 
			|	
			) 
		|	
		) 
		
	;


execCase
	:	"case" taskIdentifier refArgs valueArgs "return" signalIdentifier 
		(	"do" statement 
		|	
		) 
		
	;


variableDeclList
	:	variableDecls ( COMMA variableDecls )* 
	;


variableDecls
	:	variableDeclList2 COLON typeIdentifier 
	;


variableDeclList2
	:	( variableDecl ( COMMA variableDecl )* ) 
	;


variableDecl
	:	variableIdentifier 
		(	variableInitializer 
		|	
		) 
		
	;


variableInitializer
	:	COLEQUALS expression 
	;


renaming
	:	"type" typeRenaming ( COMMA typeRenaming )* 
	|	"constant" constantRenaming ( COMMA constantRenaming )* 
	|	"function" functionRenaming ( COMMA functionRenaming )* 
	|	"procedure" procedureRenaming ( COMMA procedureRenaming )* 
	|	"task" taskRenaming ( COMMA taskRenaming )* 
	|	"signal" signalRenaming ( COMMA signalRenaming )* 
	;


typeRenaming
	:	typeIdentifier SLASH typeIdentifier 
	;


constantRenaming
	:	constantAtom SLASH constantIdentifier 
	;


functionRenaming
	:	(	functionIdentifier SLASH functionIdentifier 
		|	predefinedFunction SLASH functionIdentifier 
		) 
		
	;


procedureRenaming
	:	procedureIdentifier SLASH procedureIdentifier 
	;


taskRenaming
	:	taskIdentifier SLASH taskIdentifier 
	;


signalRenaming
	:	signalIdentifier SLASH signalIdentifier 
	;


predefinedFunction
	:	"and" 
	|	"or" 
	|	"not" 
	|	PLUS 
	|	DASH 
	|	STAR 
	|	SLASH 
	|	"mod" 
	|	LESSTHAN 
	|	GREATERTHAN 
	|	LEQUAL 
	|	GEQUAL 
	|	NEQUAL 
	|	EQUALS 
	;