Begin
id: GenericToken = "tokenID" ;
{ ";" ":" "," "[" "]" "=" }: SimpleTokens;
{ "." "{" "}" "RECORD" "REF" "ANY" }: SimpleTokens;
{ "LIST" "SEQUENCE" "OF" }: SimpleTokens;
{ "NULL" }: SimpleTokens;
{ "FROM" }: SimpleTokens;
{ "TYPE" }: SimpleTokens;
{ "CEDAR" }: SimpleTokens;
{ "MODULE" "BEGIN" "END" }: SimpleTokens;
MainGoal: NonTerminal;
ModuleBody: NonTerminal;
declist: NonTerminal;
declaration: NonTerminal;
from: NonTerminal;
identlist: NonTerminal;
identlistP: NonTerminal;
typeexp: NonTerminal;
typeid: NonTerminal;
typeidP: NonTerminal;
typecons: NonTerminal;
elementlist: NonTerminal;
elementlistP: NonTerminal;
element: NonTerminal;
reclist: NonTerminal;
variantpair: NonTerminal;
variantpart: NonTerminal;
vcasehead: NonTerminal;
tagtype: NonTerminal;
ident: NonTerminal;
pairlist: NonTerminal;
pairitem: NonTerminal;
typelist: NonTerminal;
MainGoal ← ModuleBody ;
ModuleBody.nosemicolon ← id ":" "MODULE" "=" "BEGIN" declist "END" "." ;
ModuleBody.eithsemicolon ← id ":" "MODULE" "=" "BEGIN" declist ";" "END" "." ;
declist.one ← declaration ;
declist.more ← declist ";" declaration ;
declaration.type ← identlist "TYPE" "=" typeexp ;
declaration.cedartype ← identlist "CEDAR" "TYPE" from "=" typeexp ;
from.no ← ;
from.yes ← "FROM" id ;
identlist ← identlistP ;
identlistP.id ← id ":" ;
identlistP.idmore ← id "," identlistP ;
typeexp.id ← id ;
typeexp.typeid ← typeid ;
typeexp.typecons ← typecons ;
typeid.idid ← id id ;
typeid.idtypeid ← id typeid ;
typeid.typeidp ← typeidP ;
typeidP.two ← id "." id ;
typeidP.more ← typeidP "." id ;
typecons.elements ← "{" elementlist "}" ;
typecons.record ← "RECORD" reclist ;
typecons.ref ← "REF" typeexp ;
typecons.refany ← "REF" "ANY" ;
typecons.list ← "LIST" "OF" typeexp ;
elementlist.empty ← ;
elementlist.nonempty ← elementlistP ;
elementlistP.one ← element ;
elementlistP.more ← elementlistP "," element ;
element.id ← id ;
reclist.empty ← "[" "]" ;
reclist.null ← "NULL" ;
reclist.pairs ← "[" pairlist "]" ;
reclist.types ← "[" typelist "]" ;
reclist.vpairs ← "[" pairlist "," variantpair "]" ;
reclist.vpart ← "[" variantpart "]" ;
reclist.vpair ← "[" variantpair "]" ;
variantpair ← identlist variantpart ;
variantpart.seq ← "SEQUENCE" vcasehead "OF" typeexp ;
vcasehead.ident ← ident tagtype ;
tagtype.exp ← typeexp ;
ident ← id ":" ;
pairlist.one ← pairitem ;
pairlist.more ← pairlist "," pairitem ;
pairitem ← identlist typeexp ;
typelist.typecons ← typecons ;
typelist.typeid ← typeid ;
typelist.id ← id ;
typelist.typeconsmore ← typecons "," typelist ;
typelist.typeidmore ← typeid "," typelist ;
typelist.idmore ← id "," typelist ;
End.