Begin
identifier: GenericToken = "tokenID" ;
numberD: GenericToken = "tokenDECIMAL" ;
numberO: GenericToken = "tokenOCTAL" ;
numberH: GenericToken = "tokenHEX" ;
Rope: GenericToken = "tokenROPE" ;
{ "ARRAY" "BEGIN" "BOOLEAN" "CARDINAL" "CHOICE" "DEPENDS" "END" "ERROR" "FALSE" "INTEGER" "LONG" "OF" "PROCEDURE" "PROGRAM" "RECORD" "REPORTS" "RETURNS" "SEQUENCE" "SINK" "SOURCE" "STRING" "TRUE" "TYPE" "UNSPECIFIED" "UPON" "VERSION" }: SimpleTokens;
{ "(" ")" "[" "]" "{" "}" ":" "." ";" "=" "=>" "," "-" }: SimpleTokens;
OuterProgram: NonTerminal;
Program: NonTerminal;
DependencyList: NonTerminal;
ReferencedProgramList: NonTerminal;
ReferencedProgram: NonTerminal;
DeclarationList: NonTerminal;
Declaration: NonTerminal;
Type: NonTerminal;
SimpleType: NonTerminal;
PredefinedType: NonTerminal;
ConstructedType: NonTerminal;
ReferencedType: NonTerminal;
CorrespondenceList: NonTerminal;
Correspondence: NonTerminal;
OptionalNumber: NonTerminal;
MandatoryNumber: NonTerminal;
CandidateList: NonTerminal;
Candidate: NonTerminal;
ArgumentList: NonTerminal;
ResultList: NonTerminal;
ErrorList: NonTerminal;
FieldList: NonTerminal;
Field: NonTerminal;
Constant: NonTerminal;
PredefinedConstant: NonTerminal;
ConstructedConstant: NonTerminal;
ElementList: NonTerminal;
ComponentList: NonTerminal;
Component: NonTerminal;
NameList: NonTerminal;
number: NonTerminal;
OuterProgram ← Program "." ;
Program ← identifier ":" "PROGRAM" numberD "VERSION" numberD "=" "BEGIN" DependencyList DeclarationList "END" ;
DependencyList.empty ← ;
DependencyList.more ← "DEPENDS" "UPON" ReferencedProgramList ";" ;
ReferencedProgramList.one ← ReferencedProgram ;
ReferencedProgramList.more ← ReferencedProgramList "," ReferencedProgram ;
ReferencedProgram ← identifier "(" numberD ")" "VERSION" numberD ;
DeclarationList.a ← ;
DeclarationList.b ← DeclarationList Declaration ;
Declaration.type ← identifier ":" "TYPE" "=" Type ";" ;
Declaration.constant ← identifier ":" Type "=" Constant ";" ;
Declaration.id ← identifier ":" Type "=" identifier ";" ;
Type.simple ← SimpleType ;
Type.ConstructedType ← ConstructedType ;
SimpleType.predefinedType ← PredefinedType ;
SimpleType.referencedType ← ReferencedType ;
PredefinedType.boolean ← "BOOLEAN" ;
PredefinedType.Cardinal ← "CARDINAL" ;
PredefinedType.longCardinal ← "LONG" "CARDINAL" ;
PredefinedType.integer ← "INTEGER" ;
PredefinedType.longInteger ← "LONG" "INTEGER" ;
PredefinedType.string ← "STRING" ;
PredefinedType.unspecified ← "UNSPECIFIED" ;
PredefinedType.bulkDataSource ← "SOURCE" ;
PredefinedType.bulkDataSink ← "SINK" ;
ConstructedType.enumeration ← "{" CorrespondenceList "}" ;
ConstructedType.array ← "ARRAY" MandatoryNumber "OF" SimpleType ;
ConstructedType.sequence ← "SEQUENCE" OptionalNumber "OF" SimpleType ;
ConstructedType.record ← "RECORD" "[" FieldList "]" ;
ConstructedType.emptyRecord ← "RECORD" "[" "]" ;
ConstructedType.choice ← "CHOICE" ReferencedType "OF" "{" CandidateList "}" ;
ConstructedType.procedure ← "PROCEDURE" ArgumentList ResultList ErrorList ;
ConstructedType.error ← "ERROR" ArgumentList ;
ReferencedType.localReference ← identifier ;
ReferencedType.remoteReference ← identifier "." identifier ;
CorrespondenceList.one ← Correspondence ;
CorrespondenceList.more ← Correspondence "," CorrespondenceList ;
Correspondence ← identifier "(" MandatoryNumber ")" ;
OptionalNumber.nonEmpty ← Constant ;
OptionalNumber.localReference ← identifier ;
OptionalNumber.empty ← ;
MandatoryNumber.value ← Constant ;
MandatoryNumber.localReference ← identifier ;
CandidateList.one ← Candidate ;
CandidateList.more ← Candidate "," CandidateList ;
Candidate.one ← NameList "=>" SimpleType ;
Candidate.two ← NameList "(" number ")" "=>" SimpleType ;
ArgumentList.a ← ;
ArgumentList.b ← "[" FieldList "]" ;
ArgumentList.c ← "[" "]" ;
ResultList.a ← ;
ResultList.b ← "RETURNS" "[" FieldList "]" ;
ResultList.c ← "RETURNS" "[" "]" ;
ErrorList.a ← ;
ErrorList.b ← "REPORTS" "[" NameList "]" ;
FieldList.a ← Field ;
FieldList.b ← Field "," FieldList ;
Field ← NameList ":" SimpleType ;
Constant.predefined ← PredefinedConstant ;
Constant.constructed ← ConstructedConstant ;
Constant.choiceConstant ← identifier Constant ;
Constant.choiceIdentifier ← identifier identifier ;
Constant.remoteReference ← identifier "." identifier ;
PredefinedConstant.true ← "TRUE" ;
PredefinedConstant.false ← "FALSE" ;
PredefinedConstant.number ← number ;
PredefinedConstant.negativeNumber ← "-" number ;
PredefinedConstant.string ← Rope ;
ConstructedConstant.elementList ← "[" ElementList "]" ;
ConstructedConstant.componentlist ← "[" ComponentList "]" ;
ConstructedConstant.empty ← "[" "]" ;
ElementList.one ← Constant ;
ElementList.more ← Constant "," ElementList ;
ElementList.id ← identifier ;
ElementList.idAndMore ← identifier "," ElementList ;
ComponentList.one ← Component ;
ComponentList.more ← Component "," ComponentList ;
Component.more ← NameList ":" Constant ;
Component.one ← NameList ":" identifier ;
NameList.one ← identifier ;
NameList.more ← identifier "," NameList ;
number.a ← numberD ;
number.b ← numberO ;
number.c ← numberH ;
End.