(* Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. *)
(* This file is part of GNU Modula-2.
GNU Modula-2 is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.
GNU Modula-2 is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with gm2; see the file COPYING.  If not, write to the Free Software
Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *)
MODULE program ;
TYPE
   tokenset = (eoftok, plustok, minustok, timestok, dividetok,
becomestok, ambersandtok, periodtok, commatok, semicolontok, lparatok,
rparatok, lsbratok, rsbratok, lcbratok, rcbratok, uparrowtok,
singlequotetok, equaltok, hashtok, lesstok, greatertok,
lessgreatertok, lessequaltok, greaterequaltok, periodperiodtok,
colontok, doublequotestok, bartok, andtok, arraytok, begintok, bytok,
casetok, consttok, definitiontok, divtok, dotok, elsetok, elsiftok,
endtok, exittok, exporttok, fortok, fromtok, iftok, implementationtok,
importtok, intok, looptok, modtok, moduletok, nottok, oftok, ortok,
pointertok, proceduretok, qualifiedtok, unqualifiedtok, recordtok,
repeattok, returntok, settok, thentok, totok, typetok, untiltok,
vartok, whiletok, withtok, asmtok, volatiletok, periodperiodperiodtok,
datetok, linetok, filetok, attributetok, builtintok, integertok,
identtok, realtok, stringtok) ;
TYPE
   SetOfStop0 = SET OF [eoftok..begintok] ;
   SetOfStop1 = SET OF [bytok..thentok] ;
   SetOfStop2 = SET OF [totok..stringtok] ;
VAR
   currenttoken: tokenset ;
PROCEDURE ProgramModule (stopset0: SetOfStop0; stopset1: SetOfStop1; stopset2: SetOfStop2) ;
BEGIN
   Expect(moduletok, stopset0, stopset1, stopset2 + SetOfStop2{identtok}) ;
(*
   PushAutoOn  ;
   Ident(stopset0 + SetOfStop0{semicolontok, lsbratok}, stopset1, stopset2) ;
   P3StartBuildProgModule  ;
   PushAutoOff  ;
   IF currenttoken=lsbratok
   THEN
      Priority(stopset0 + SetOfStop0{semicolontok}, stopset1, stopset2) ;
   END ;
   Expect(semicolontok, stopset0 + SetOfStop0{begintok}, stopset1 + SetOfStop1{importtok, fromtok, endtok, consttok, proceduretok, moduletok}, stopset2 + SetOfStop2{typetok, vartok}) ;
   WHILE ((currenttoken>=bytok) AND (currenttoken<totok) AND (currenttoken IN SetOfStop1 {fromtok, importtok})) DO
      Import(stopset0 + SetOfStop0{begintok}, stopset1 + SetOfStop1{endtok, fromtok, importtok, consttok, moduletok, proceduretok}, stopset2 + SetOfStop2{vartok, typetok}) ;
   END (* while *) ;
   StartBuildInit  ;
   Block(stopset0, stopset1, stopset2 + SetOfStop2{identtok}) ;
   PushAutoOn  ;
   Ident(stopset0 + SetOfStop0{periodtok}, stopset1, stopset2) ;
   EndBuildFile  ;
   P3EndBuildProgModule  ;
   Expect(periodtok, stopset0, stopset1, stopset2) ;
   PopAuto ;
   EndBuildInit ;
   PopAuto
*)
END ProgramModule ;
PROCEDURE PushAutoOn ; BEGIN END PushAutoOn ;
PROCEDURE PushAutoOff ; BEGIN END PushAutoOff ;
PROCEDURE PopAuto ; BEGIN END PopAuto ;
PROCEDURE P3StartBuildProgModule ; BEGIN END P3StartBuildProgModule ;
PROCEDURE P3EndBuildProgModule ; BEGIN END P3EndBuildProgModule ;
PROCEDURE StartBuildInit ; BEGIN END StartBuildInit ;
PROCEDURE EndBuildInit ; BEGIN END EndBuildInit ;
PROCEDURE EndBuildFile ; BEGIN END EndBuildFile ;
PROCEDURE Priority (s0: SetOfStop0; s1: SetOfStop1; s2: SetOfStop2) ;
BEGIN
END Priority ;
PROCEDURE Import (s0: SetOfStop0; s1: SetOfStop1; s2: SetOfStop2) ;
BEGIN
END Import ;
PROCEDURE Ident (s0: SetOfStop0; s1: SetOfStop1; s2: SetOfStop2) ;
BEGIN
END Ident ;
PROCEDURE Expect (t: tokenset; s0: SetOfStop0; s1: SetOfStop1; s2: SetOfStop2) ;
BEGIN
END Expect ;
PROCEDURE Block (s0: SetOfStop0; s1: SetOfStop1; s2: SetOfStop2) ;
BEGIN
END Block ;
BEGIN
   ProgramModule(SetOfStop0{}, SetOfStop1{}, SetOfStop2{})
END program.