blob: 0f1cddf5dcd2b90339202e4fc67e6544f85f0c2f [file] [log] [blame]
(* M2Reserved.mod determines is a token is a reserved word.
Copyright (C) 2001-2026 Free Software Foundation, Inc.
Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
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 3, 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 GNU Modula-2; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. *)
IMPLEMENTATION MODULE M2Reserved ;
FROM SymbolKey IMPORT SymbolTree, InitTree, PutSymKey, GetSymKey ;
FROM NameKey IMPORT MakeKey, NulName ;
FROM ASCII IMPORT nul ;
CONST
eof = 032C ;
VAR
NameTotok,
tokToName: SymbolTree ;
(*
AddKeyword - adds the Name and enumerated value of a keyword
into the binary tree.
*)
PROCEDURE AddKeyword (n: Name; tok: toktype) ;
BEGIN
PutSymKey(NameTotok, n, tok) ;
PutSymKey(tokToName, VAL(Name, tok), n)
END AddKeyword ;
PROCEDURE Init ;
VAR
a: ARRAY [0..1] OF CHAR ;
BEGIN
InitTree(NameTotok) ;
InitTree(tokToName) ;
NulTok := NulName ;
PlusTok := MakeKey('+') ;
AddKeyword(PlusTok, plustok) ;
MinusTok := MakeKey('-') ;
AddKeyword(MinusTok, minustok) ;
TimesTok := MakeKey('*') ;
AddKeyword(TimesTok, timestok) ;
DivideTok := MakeKey('/') ;
AddKeyword(DivideTok, dividetok) ;
BecomesTok := MakeKey(':=') ;
AddKeyword(BecomesTok, becomestok) ;
AmbersandTok := MakeKey('&') ;
AddKeyword(AmbersandTok, ambersandtok) ;
PeriodTok := MakeKey('.') ;
AddKeyword(PeriodTok, periodtok) ;
CommaTok := MakeKey(',') ;
AddKeyword(CommaTok, commatok) ;
SemiColonTok := MakeKey(';') ;
AddKeyword(SemiColonTok, semicolontok) ;
LParaTok := MakeKey('(') ;
AddKeyword(LParaTok, lparatok) ;
LSBraTok := MakeKey('[') ;
AddKeyword(LSBraTok, lsbratok) ;
LCBraTok := MakeKey('{') ;
AddKeyword(LCBraTok, lcbratok) ;
UpArrowTok := MakeKey('^') ;
AddKeyword(UpArrowTok, uparrowtok) ;
SingleQuoteTok := MakeKey("'") ;
AddKeyword(SingleQuoteTok, singlequotetok) ;
EqualTok := MakeKey('=') ;
AddKeyword(EqualTok, equaltok) ;
HashTok := MakeKey('#') ;
AddKeyword(HashTok, hashtok) ;
LessTok := MakeKey('<') ;
AddKeyword(LessTok, lesstok) ;
GreaterTok := MakeKey('>') ;
AddKeyword(GreaterTok, greatertok) ;
LessGreaterTok := MakeKey('<>') ;
AddKeyword(LessGreaterTok, lessgreatertok) ;
LessEqualTok := MakeKey('<=') ;
AddKeyword(LessEqualTok, lessequaltok) ;
GreaterEqualTok := MakeKey('>=') ;
AddKeyword(GreaterEqualTok, greaterequaltok) ;
LDirectiveTok := MakeKey('<*') ;
AddKeyword(LDirectiveTok, ldirectivetok) ;
RDirectiveTok := MakeKey('*>') ;
AddKeyword(RDirectiveTok, rdirectivetok) ;
PeriodPeriodTok := MakeKey('..') ;
AddKeyword(PeriodPeriodTok, periodperiodtok) ;
ColonTok := MakeKey(':') ;
AddKeyword(ColonTok, colontok) ;
RParaTok := MakeKey(')') ;
AddKeyword(RParaTok, rparatok) ;
RSBraTok := MakeKey(']') ;
AddKeyword(RSBraTok, rsbratok) ;
RCBraTok := MakeKey('}') ;
AddKeyword(RCBraTok, rcbratok) ;
BarTok := MakeKey('|') ;
AddKeyword(BarTok, bartok) ;
DoubleQuotesTok := MakeKey('"') ;
AddKeyword(DoubleQuotesTok, doublequotestok) ;
AndTok := MakeKey('AND') ;
AddKeyword(AndTok, andtok) ;
ArrayTok := MakeKey('ARRAY') ;
AddKeyword(ArrayTok, arraytok) ;
BeginTok := MakeKey('BEGIN') ;
AddKeyword(BeginTok, begintok) ;
ByTok := MakeKey('BY') ;
AddKeyword(ByTok, bytok) ;
CaseTok := MakeKey('CASE') ;
AddKeyword(CaseTok, casetok) ;
ConstTok := MakeKey('CONST') ;
AddKeyword(ConstTok, consttok) ;
DefinitionTok := MakeKey('DEFINITION') ;
AddKeyword(DefinitionTok, definitiontok) ;
DivTok := MakeKey('DIV') ;
AddKeyword(DivTok, divtok) ;
DoTok := MakeKey('DO') ;
AddKeyword(DoTok, dotok) ;
ElseTok := MakeKey('ELSE') ;
AddKeyword(ElseTok, elsetok) ;
ElsifTok := MakeKey('ELSIF') ;
AddKeyword(ElsifTok, elsiftok) ;
EndTok := MakeKey('END') ;
AddKeyword(EndTok, endtok) ;
ExitTok := MakeKey('EXIT') ;
AddKeyword(ExitTok, exittok) ;
ExceptTok := MakeKey('EXCEPT') ;
AddKeyword(ExceptTok, excepttok) ;
ExportTok := MakeKey('EXPORT') ;
AddKeyword(ExportTok, exporttok) ;
FinallyTok := MakeKey('FINALLY') ;
AddKeyword(FinallyTok, finallytok) ;
ForTok := MakeKey('FOR') ;
AddKeyword(ForTok, fortok) ;
ForwardTok := MakeKey('FORWARD') ;
AddKeyword(ForwardTok, forwardtok) ;
FromTok := MakeKey('FROM') ;
AddKeyword(FromTok, fromtok) ;
IfTok := MakeKey('IF') ;
AddKeyword(IfTok, iftok) ;
ImplementationTok := MakeKey('IMPLEMENTATION') ;
AddKeyword(ImplementationTok, implementationtok) ;
ImportTok := MakeKey('IMPORT') ;
AddKeyword(ImportTok, importtok) ;
InTok := MakeKey('IN') ;
AddKeyword(InTok, intok) ;
LoopTok := MakeKey('LOOP') ;
AddKeyword(LoopTok, looptok) ;
ModTok := MakeKey('MOD') ;
AddKeyword(ModTok, modtok) ;
ModuleTok := MakeKey('MODULE') ;
AddKeyword(ModuleTok, moduletok) ;
NotTok := MakeKey('NOT') ;
AddKeyword(NotTok, nottok) ;
OfTok := MakeKey('OF') ;
AddKeyword(OfTok, oftok) ;
OrTok := MakeKey('OR') ;
AddKeyword(OrTok, ortok) ;
(*
PackedTok := MakeKey('PACKED') ;
AddKeyword(PackedTok, packedtok) ;
*)
PackedSetTok := MakeKey('PACKEDSET') ;
AddKeyword(PackedSetTok, packedsettok) ;
PointerTok := MakeKey('POINTER') ;
AddKeyword(PointerTok, pointertok) ;
ProcedureTok := MakeKey('PROCEDURE') ;
AddKeyword(ProcedureTok, proceduretok) ;
QualifiedTok := MakeKey('QUALIFIED') ;
AddKeyword(QualifiedTok, qualifiedtok) ;
UnQualifiedTok := MakeKey('UNQUALIFIED') ;
AddKeyword(UnQualifiedTok, unqualifiedtok) ;
RecordTok := MakeKey('RECORD') ;
AddKeyword(RecordTok, recordtok) ;
RemTok := MakeKey('REM') ;
AddKeyword(RemTok, remtok) ;
RepeatTok := MakeKey('REPEAT') ;
AddKeyword(RepeatTok, repeattok) ;
RetryTok := MakeKey('RETRY') ;
AddKeyword(RetryTok, retrytok) ;
ReturnTok := MakeKey('RETURN') ;
AddKeyword(ReturnTok, returntok) ;
SetTok := MakeKey('SET') ;
AddKeyword(SetTok, settok) ;
ThenTok := MakeKey('THEN') ;
AddKeyword(ThenTok, thentok) ;
ToTok := MakeKey('TO') ;
AddKeyword(ToTok, totok) ;
TypeTok := MakeKey('TYPE') ;
AddKeyword(TypeTok, typetok) ;
UntilTok := MakeKey('UNTIL') ;
AddKeyword(UntilTok, untiltok) ;
VarTok := MakeKey('VAR') ;
AddKeyword(VarTok, vartok) ;
WhileTok := MakeKey('WHILE') ;
AddKeyword(WhileTok, whiletok) ;
WithTok := MakeKey('WITH') ;
AddKeyword(WithTok, withtok) ;
AsmTok := MakeKey('ASM') ;
AddKeyword(AsmTok, asmtok) ;
VolatileTok := MakeKey('VOLATILE') ;
AddKeyword(VolatileTok, volatiletok) ;
DateTok := MakeKey('__DATE__') ; (* C compatible preprocessor primatives *)
AddKeyword(DateTok, datetok) ;
LineTok := MakeKey('__LINE__') ;
AddKeyword(LineTok, linetok) ;
FileTok := MakeKey('__FILE__') ;
AddKeyword(FileTok, filetok) ;
AttributeTok := MakeKey('__ATTRIBUTE__') ; (* GCC extension incorporated into gm2 *)
AddKeyword(AttributeTok, attributetok) ;
BuiltinTok := MakeKey('__BUILTIN__') ; (* GCC extension incorporated into gm2 *)
AddKeyword(BuiltinTok, builtintok) ;
InlineTok := MakeKey('__INLINE__') ; (* GCC extension incorporated into gm2 *)
AddKeyword(InlineTok, inlinetok) ;
a[0] := eof ;
a[1] := nul ;
EofTok := MakeKey(a) (* Not a reserved token *)
END Init ;
(*
IsReserved - returns TRUE if the symbol, Name, is a reserved word.
If TRUE it also sets tok to the appropriate enumerated
value. It will set tok to eoftok if appropriate.
*)
PROCEDURE IsReserved (n: Name; VAR tok: toktype) : BOOLEAN ;
VAR
t: CARDINAL ;
BEGIN
t := GetSymKey(NameTotok, n) ;
IF t=0
THEN
(* eoftok is not a reserved word *)
IF n=EofTok
THEN
tok := eoftok
END ;
RETURN( FALSE )
ELSE
tok := VAL(toktype, t) ;
RETURN( TRUE )
END
END IsReserved ;
(*
tokToTok - returns a Tok given the enumerated variable, t.
*)
PROCEDURE tokToTok (t: toktype) : Name ;
BEGIN
RETURN( GetSymKey(tokToName, VAL(Name, t)) )
END tokToTok ;
BEGIN
Init
END M2Reserved.