(* Copyright (C) 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 sets3 ; FROM DynamicStrings IMPORT String, InitString, ConCat, Mark, ConCatChar ; FROM M2Printf IMPORT printf1, printf0 ; FROM M2LexBuf IMPORT GetToken ; (* FROM M2Reserved IMPORT toktype ; *) CONST Debugging = TRUE ; TYPE toktype = (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, integertok, identtok, realtok, stringtok) ; SetOfStop0 = SET OF [eoftok..begintok] ; SetOfStop1 = SET OF [bytok..thentok] ; SetOfStop2 = SET OF [totok..stringtok] ; VAR currenttoken: toktype ; PROCEDURE ErrorString (s: String) ; BEGIN END ErrorString ; PROCEDURE DescribeError (stopset0: SetOfStop0; stopset1: SetOfStop1; stopset2: SetOfStop2) ; VAR str: String ; BEGIN str := InitString('') ; CASE currenttoken OF stringtok: str := ConCat(InitString("syntax error, found `string'"), Mark(str)) | realtok: str := ConCat(InitString("syntax error, found `real number'"), Mark(str)) | identtok: str := ConCat(InitString("syntax error, found `identifier'"), Mark(str)) | integertok: str := ConCat(InitString("syntax error, found `integer number'"), Mark(str)) | filetok: str := ConCat(InitString("syntax error, found `__FILE__'"), Mark(str)) | linetok: str := ConCat(InitString("syntax error, found `__LINE__'"), Mark(str)) | datetok: str := ConCat(InitString("syntax error, found `__DATE__'"), Mark(str)) | periodperiodperiodtok: str := ConCat(InitString("syntax error, found `...'"), Mark(str)) | volatiletok: str := ConCat(InitString("syntax error, found `VOLATILE'"), Mark(str)) | asmtok: str := ConCat(InitString("syntax error, found `ASM'"), Mark(str)) | withtok: str := ConCat(InitString("syntax error, found `WITH'"), Mark(str)) | whiletok: str := ConCat(InitString("syntax error, found `WHILE'"), Mark(str)) | vartok: str := ConCat(InitString("syntax error, found `VAR'"), Mark(str)) | untiltok: str := ConCat(InitString("syntax error, found `UNTIL'"), Mark(str)) | typetok: str := ConCat(InitString("syntax error, found `TYPE'"), Mark(str)) | totok: str := ConCat(InitString("syntax error, found `TO'"), Mark(str)) | thentok: str := ConCat(InitString("syntax error, found `THEN'"), Mark(str)) | settok: str := ConCat(InitString("syntax error, found `SET'"), Mark(str)) | returntok: str := ConCat(InitString("syntax error, found `RETURN'"), Mark(str)) | repeattok: str := ConCat(InitString("syntax error, found `REPEAT'"), Mark(str)) | recordtok: str := ConCat(InitString("syntax error, found `RECORD'"), Mark(str)) | unqualifiedtok: str := ConCat(InitString("syntax error, found `UNQUALIFIED'"), Mark(str)) | qualifiedtok: str := ConCat(InitString("syntax error, found `QUALIFIED'"), Mark(str)) | proceduretok: str := ConCat(InitString("syntax error, found `PROCEDURE'"), Mark(str)) | pointertok: str := ConCat(InitString("syntax error, found `POINTER'"), Mark(str)) | ortok: str := ConCat(InitString("syntax error, found `OR'"), Mark(str)) | oftok: str := ConCat(InitString("syntax error, found `OF'"), Mark(str)) | nottok: str := ConCat(InitString("syntax error, found `NOT'"), Mark(str)) | moduletok: str := ConCat(InitString("syntax error, found `MODULE'"), Mark(str)) | modtok: str := ConCat(InitString("syntax error, found `MOD'"), Mark(str)) | looptok: str := ConCat(InitString("syntax error, found `LOOP'"), Mark(str)) | intok: str := ConCat(InitString("syntax error, found `IN'"), Mark(str)) | importtok: str := ConCat(InitString("syntax error, found `IMPORT'"), Mark(str)) | implementationtok: str := ConCat(InitString("syntax error, found `IMPLEMENTATION'"), Mark(str)) | iftok: str := ConCat(InitString("syntax error, found `IF'"), Mark(str)) | fromtok: str := ConCat(InitString("syntax error, found `FROM'"), Mark(str)) | fortok: str := ConCat(InitString("syntax error, found `FOR'"), Mark(str)) | exporttok: str := ConCat(InitString("syntax error, found `EXPORT'"), Mark(str)) | exittok: str := ConCat(InitString("syntax error, found `EXIT'"), Mark(str)) | endtok: str := ConCat(InitString("syntax error, found `END'"), Mark(str)) | elsiftok: str := ConCat(InitString("syntax error, found `ELSIF'"), Mark(str)) | elsetok: str := ConCat(InitString("syntax error, found `ELSE'"), Mark(str)) | dotok: str := ConCat(InitString("syntax error, found `DO'"), Mark(str)) | divtok: str := ConCat(InitString("syntax error, found `DIV'"), Mark(str)) | definitiontok: str := ConCat(InitString("syntax error, found `DEFINITION'"), Mark(str)) | consttok: str := ConCat(InitString("syntax error, found `CONST'"), Mark(str)) | casetok: str := ConCat(InitString("syntax error, found `CASE'"), Mark(str)) | bytok: str := ConCat(InitString("syntax error, found `BY'"), Mark(str)) | begintok: str := ConCat(InitString("syntax error, found `BEGIN'"), Mark(str)) | arraytok: str := ConCat(InitString("syntax error, found `ARRAY'"), Mark(str)) | andtok: str := ConCat(InitString("syntax error, found `AND'"), Mark(str)) | colontok: str := ConCat(InitString("syntax error, found `:'"), Mark(str)) | periodperiodtok: str := ConCat(InitString("syntax error, found `..'"), Mark(str)) | greaterequaltok: str := ConCat(InitString("syntax error, found `>='"), Mark(str)) | lessequaltok: str := ConCat(InitString("syntax error, found `<='"), Mark(str)) | lessgreatertok: str := ConCat(InitString("syntax error, found `<>'"), Mark(str)) | hashtok: str := ConCat(InitString("syntax error, found `#'"), Mark(str)) | equaltok: str := ConCat(InitString("syntax error, found `='"), Mark(str)) | uparrowtok: str := ConCat(InitString("syntax error, found `^'"), Mark(str)) | semicolontok: str := ConCat(InitString("syntax error, found `;'"), Mark(str)) | commatok: str := ConCat(InitString("syntax error, found `,'"), Mark(str)) | periodtok: str := ConCat(InitString("syntax error, found `.'"), Mark(str)) | ambersandtok: str := ConCat(InitString("syntax error, found `&'"), Mark(str)) | dividetok: str := ConCat(InitString("syntax error, found `/'"), Mark(str)) | timestok: str := ConCat(InitString("syntax error, found `*'"), Mark(str)) | minustok: str := ConCat(InitString("syntax error, found `-'"), Mark(str)) | plustok: str := ConCat(InitString("syntax error, found `+'"), Mark(str)) | doublequotestok: str := ConCat(ConCatChar(ConCatChar(InitString("syntax error, found '"), '"'), "'"), Mark(str)) | singlequotetok: str := ConCat(ConCatChar(ConCatChar(InitString('syntax error, found "'), "'"), '"'), Mark(str)) | greatertok: str := ConCat(InitString("syntax error, found `>'"), Mark(str)) | lesstok: str := ConCat(InitString("syntax error, found `<'"), Mark(str)) | rparatok: str := ConCat(InitString("syntax error, found `)'"), Mark(str)) | lparatok: str := ConCat(InitString("syntax error, found `('"), Mark(str)) | rcbratok: str := ConCat(InitString("syntax error, found `}'"), Mark(str)) | lcbratok: str := ConCat(InitString("syntax error, found `{'"), Mark(str)) | rsbratok: str := ConCat(InitString("syntax error, found `]'"), Mark(str)) | lsbratok: str := ConCat(InitString("syntax error, found `['"), Mark(str)) | bartok: str := ConCat(InitString("syntax error, found `|'"), Mark(str)) | becomestok: str := ConCat(InitString("syntax error, found `:='"), Mark(str)) | eoftok: str := ConCat(InitString("syntax error, found `'"), Mark(str)) ELSE END ; ErrorString(str) ; END DescribeError ; (* SyntaxError - after a syntax error we skip all tokens up until we reach a stop symbol. *) (* PROCEDURE SyntaxError (stopset0: SetOfStop0; stopset1: SetOfStop1; stopset2: SetOfStop2) ; BEGIN DescribeError(stopset0, stopset1, stopset2) ; IF Debugging THEN printf0('\nskipping token *** ') END ; (* yes the ORD(currenttoken) looks ugly, but it is *much* safer than using currenttoken=32) AND (ORD(currenttoken)<64) AND (currenttoken IN stopset1)) OR ((ORD(currenttoken)>=64) AND (currenttoken IN stopset2))) DO GetToken END ; IF Debugging THEN printf0(' ***\n') END END SyntaxError ; *) BEGIN END sets3.