blob: 2bbd4abff1aa0182784956e73fa236a39d3eac85 [file]
(* 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<sometok as a change to the ordering of the
token declarations below would cause this to break. Using ORD() we are
immune from such changes
*)
WHILE NOT (((ORD(currenttoken)<32) AND (currenttoken IN stopset0)) OR
((ORD(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.