ack/lang/m2/m2mm/declar.g
1994-06-24 14:02:31 +00:00

279 lines
3.1 KiB
Plaintext

/*
* (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
*/
/* D E C L A R A T I O N S */
/* stripped down version of the one in the Modula-2 compiler */
/* $Id$ */
ProcedureHeading :
PROCEDURE IDENT
[
'('
[
FPSection
[
';' FPSection
]*
|
]
')'
[
':' qualtype
|
/* empty */
]
|
/* empty */
]
;
block :
[ %persistent
declaration
]*
[ %default
BEGIN StatementSequence
|
/* empty */
]
END
;
declaration :
CONST [ ConstantDeclaration ';' ]*
|
TYPE [ TypeDeclaration ';' ]*
|
VAR [ VariableDeclaration ';' ]*
|
ProcedureHeading ';' block IDENT ';'
|
ModuleDeclaration ';'
;
FPSection :
var IdentList ':' FormalType
;
FormalType :
ARRAY OF qualtype
|
qualtype
;
TypeDeclaration :
IDENT '=' type
;
type :
%default
SimpleType
|
ArrayType
|
RecordType
|
SetType
|
PointerType
|
ProcedureType
;
SimpleType :
qualtype
[
/* empty */
|
SubrangeType
/* The subrange type is given a base type by the
qualident (this is new modula-2).
*/
]
|
enumeration
|
SubrangeType
;
enumeration :
'(' IdentList ')'
;
IdentList :
IDENT
[ %persistent
',' IDENT
]*
;
SubrangeType :
/*
This is not exactly the rule in the new report, but see
the rule for "SimpleType".
*/
'[' ConstExpression UPTO ConstExpression ']'
;
ArrayType :
ARRAY SimpleType
[
',' SimpleType
]*
OF type
;
RecordType :
RECORD FieldListSequence END
;
FieldListSequence :
FieldList
[
';' FieldList
]*
;
FieldList :
IdentList ':' type
|
CASE
/* Also accept old fashioned Modula-2 syntax, but give a warning.
Sorry for the complicated code.
*/
[
qualident
[
':' qualtype
/* This is correct, in both kinds of Modula-2, if
the first qualident is a single identifier.
*/
|
/* empty */
/* Old fashioned! the first qualident now represents
the type
*/
]
|
':' qualtype
/* Aha, third edition. Well done! */
]
OF variant
[
'|' variant
]*
[
ELSE FieldListSequence
|
/* empty */
]
END
|
/* empty */
;
variant :
[
CaseLabelList ':' FieldListSequence
|
/* empty */
]
/* Changed rule in new modula-2 */
;
CaseLabelList :
CaseLabels
[
',' CaseLabels
]*
;
CaseLabels :
ConstExpression
[
UPTO ConstExpression
|
/* empty */
]
;
SetType :
SET OF SimpleType
;
/* In a pointer type definition, the type pointed at does not
have to be declared yet, so be careful about identifying
type-identifiers
*/
PointerType :
POINTER TO type
;
qualtype :
qualident
;
ProcedureType :
PROCEDURE
[
FormalTypeList
|
/* empty */
]
;
FormalTypeList :
'('
[
VarFormalType
[
',' VarFormalType
]*
|
/* empty */
]
')'
[
':' qualtype
|
/* empty */
]
;
VarFormalType :
var FormalType
;
var :
VAR
|
/* empty */
;
ConstantDeclaration :
IDENT '=' ConstExpression
;
VariableDeclaration :
IdentAddr
[ %persistent
',' IdentAddr
]*
':' type
;
IdentAddr :
IDENT
[
'[' ConstExpression ']'
|
/* empty */
]
;