Initial version
This commit is contained in:
181
lang/m2/comp/declar.g
Normal file
181
lang/m2/comp/declar.g
Normal file
@@ -0,0 +1,181 @@
|
||||
{
|
||||
#include "idf.h"
|
||||
#include "idlist.h"
|
||||
#include "LLlex.h"
|
||||
|
||||
static char *RcsId = "$Header$";
|
||||
}
|
||||
|
||||
ProcedureDeclaration:
|
||||
ProcedureHeading ';' block IDENT
|
||||
;
|
||||
|
||||
ProcedureHeading:
|
||||
PROCEDURE IDENT FormalParameters?
|
||||
;
|
||||
|
||||
block:
|
||||
declaration* [ BEGIN StatementSequence ]? END
|
||||
;
|
||||
|
||||
declaration:
|
||||
CONST [ ConstantDeclaration ';' ]*
|
||||
|
|
||||
TYPE [ TypeDeclaration ';' ]*
|
||||
|
|
||||
VAR [ VariableDeclaration ';' ]*
|
||||
|
|
||||
ProcedureDeclaration ';'
|
||||
|
|
||||
ModuleDeclaration ';'
|
||||
;
|
||||
|
||||
FormalParameters:
|
||||
'(' [ FPSection [ ';' FPSection ]* ]? ')'
|
||||
[ ':' qualident ]?
|
||||
;
|
||||
|
||||
FPSection
|
||||
{
|
||||
struct id_list *FPList;
|
||||
} :
|
||||
VAR? IdentList(&FPList) ':' FormalType
|
||||
;
|
||||
|
||||
FormalType:
|
||||
[ ARRAY OF ]? qualident
|
||||
;
|
||||
|
||||
TypeDeclaration:
|
||||
IDENT '=' type
|
||||
;
|
||||
|
||||
type:
|
||||
SimpleType
|
||||
|
|
||||
ArrayType
|
||||
|
|
||||
RecordType
|
||||
|
|
||||
SetType
|
||||
|
|
||||
PointerType
|
||||
|
|
||||
ProcedureType
|
||||
;
|
||||
|
||||
SimpleType:
|
||||
qualident
|
||||
[
|
||||
|
||||
|
|
||||
SubrangeType
|
||||
/*
|
||||
* The subrange type is given a base type by the
|
||||
* qualident (this is new modula-2).
|
||||
*/
|
||||
]
|
||||
|
|
||||
enumeration
|
||||
|
|
||||
SubrangeType
|
||||
;
|
||||
|
||||
enumeration
|
||||
{
|
||||
struct id_list *EnumList;
|
||||
} :
|
||||
'(' IdentList(&EnumList) ')'
|
||||
;
|
||||
|
||||
IdentList(struct id_list **p;)
|
||||
{
|
||||
register struct id_list *q = new_id_list();
|
||||
} :
|
||||
IDENT { q->id_ptr = dot.TOK_IDF; }
|
||||
[
|
||||
',' IDENT { q->next = new_id_list();
|
||||
q = q->next;
|
||||
q->id_ptr = dot.TOK_IDF;
|
||||
}
|
||||
]*
|
||||
{ q->next = 0;
|
||||
*p = q;
|
||||
}
|
||||
;
|
||||
|
||||
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
|
||||
{
|
||||
struct id_list *FldList;
|
||||
} :
|
||||
[
|
||||
IdentList(&FldList) ':' type
|
||||
|
|
||||
CASE IDENT? /* Changed rule in new modula-2 */
|
||||
':' qualident
|
||||
OF variant [ '|' variant ]*
|
||||
[ ELSE FieldListSequence ]?
|
||||
END
|
||||
]?
|
||||
;
|
||||
|
||||
variant:
|
||||
[ CaseLabelList ':' FieldListSequence ]?
|
||||
/* Changed rule in new modula-2 */
|
||||
;
|
||||
|
||||
CaseLabelList:
|
||||
CaseLabels [ ',' CaseLabels ]*
|
||||
;
|
||||
|
||||
CaseLabels:
|
||||
ConstExpression [ UPTO ConstExpression ]?
|
||||
;
|
||||
|
||||
SetType:
|
||||
SET OF SimpleType
|
||||
;
|
||||
|
||||
PointerType:
|
||||
POINTER TO type
|
||||
;
|
||||
|
||||
ProcedureType:
|
||||
PROCEDURE FormalTypeList?
|
||||
;
|
||||
|
||||
FormalTypeList:
|
||||
'(' [ VAR? FormalType [ ',' VAR? FormalType ]* ]? ')'
|
||||
[ ':' qualident ]?
|
||||
;
|
||||
|
||||
ConstantDeclaration:
|
||||
IDENT '=' ConstExpression
|
||||
;
|
||||
|
||||
VariableDeclaration
|
||||
{
|
||||
struct id_list *VarList;
|
||||
} :
|
||||
IdentList(&VarList) ':' type
|
||||
;
|
||||
Reference in New Issue
Block a user