language-Modula2-0.1: examples/Dipl/M2/LIBRARY.MOD
IMPLEMENTATION MODULE Library;
FROM Machine IMPORT closure, link, EmptyClosure, result;
FROM Machine IMPORT Reduce, NewLayer, ChangeDefinition, StartLayer, PopLayer, debug;
FROM Machine IMPORT AddEnv, AddValuedEnv, RemoveEnv, Copy, Join, Equal, Root;
FROM Machine IMPORT MakeDef, MakePrimitive, MakePacked, ExtractPacked;
FROM Machine IMPORT tempDef, HandlePackage, Build, wPackage;
FROM Machine IMPORT Build, BuildReduced;
FROM Names IMPORT DefineWord, AddArgument, AddPrimWord, AddAtom;
FROM Names IMPORT wName, wMeaning;
FROM Names IMPORT DefEntry, SetDefEntry, FindWord, vList;
FROM Memory IMPORT Collect;
CONST
FormalLength=1000;
PROCEDURE pGetProp;
VAR
r:link;
BEGIN
r:=Root(wProperty^);
NewLayer(wStruct^);
result:=r^
END pGetProp;
PROCEDURE pAddProp;
BEGIN
IF Root(wStruct^)=wError THEN
result:=wStruct^
ELSIF Root(wProperty^)=wError THEN
result:=wProperty^
ELSIF Root(wValue^)=wError THEN
result:=wValue^
ELSE
Copy(wStruct^,result);
AddEnv(result,Root(wProperty^),wValue^)
END
END pAddProp;
PROCEDURE pAddValProp;
BEGIN
IF Root(wStruct^)=wError THEN
result:=wStruct^
ELSIF Root(wProperty^)=wError THEN
result:=wProperty^
ELSIF Root(wValue^)=wError THEN
result:=wValue^
ELSE
Copy(wStruct^,result);
AddValuedEnv(result,Root(wProperty^),wValue^)
END
END pAddValProp;
PROCEDURE pRemProp;
BEGIN
Copy(wStruct^,result);
RemoveEnv(result,Root(wProperty^))
END pRemProp;
PROCEDURE pJoin;
BEGIN
IF Root(wStruct^)=wError THEN
result:=wStruct^
ELSIF Root(wDescription^)=wError THEN
result:=wDescription^
ELSE
Copy(wStruct^,result);
Join(result,wDescription^)
END
END pJoin;
PROCEDURE pCopy;
BEGIN
result:=Root(wProperty^)^
END pCopy;
PROCEDURE pQuote;
BEGIN
result:=wStruct^
END pQuote;
PROCEDURE pVain;
BEGIN
result:=wAncestor^
END pVain;
PROCEDURE pGetType;
BEGIN
MakeDef(result,Root(wStruct^))
END pGetType;
PROCEDURE pIsOfClass;
BEGIN
IF Root(wStruct^)=Root(wType^) THEN
MakeDef(result,wTrue)
ELSE
MakeDef(result,wFalse)
END
END pIsOfClass;
PROCEDURE pEqual;
BEGIN
IF Equal(wArg1^,wArg2^) THEN
MakeDef(result,wTrue)
ELSE
MakeDef(result,wFalse)
END
END pEqual;
PROCEDURE pNot;
VAR
l:BOOLEAN;
BEGIN
IF Root(wArg1^)=wTrue THEN
MakeDef(result,wFalse)
ELSIF Root(wTest^)=wFalse THEN
MakeDef(result,wTrue)
ELSE
MakePacked(result,wError,NotLogicalType)
END
END pNot;
PROCEDURE pAnd;
VAR
l:BOOLEAN;
BEGIN
IF Root(wArg1^)=wTrue THEN
Reduce(wArg2^)
ELSIF Root(wTest^)=wFalse THEN
MakeDef(result,wFalse)
ELSE
MakePacked(result,wError,NotLogicalType)
END
END pAnd;
PROCEDURE pOr;
VAR
l:BOOLEAN;
BEGIN
IF Root(wArg1^)=wFalse THEN
Reduce(wArg2^)
ELSIF Root(wTest^)=wTrue THEN
MakeDef(result,wTrue)
ELSE
MakePacked(result,wError,NotLogicalType)
END
END pOr;
PROCEDURE pIf;
VAR
l:BOOLEAN;
BEGIN
Reduce(wTest^);
IF Root(result)=wTrue THEN
Reduce(wYes^)
ELSIF Root(wTest^)=wFalse THEN
Reduce(wNo^)
ELSE
MakePacked(result,wError,NotLogicalType)
END
END pIf;
PROCEDURE ExtractNumbers(VAR x,y:INTEGER):BOOLEAN;
BEGIN
Reduce(wArg1^);
IF Root(result)#wNumber THEN
IF Root(result)#wError THEN
MakePacked(result,wError,NotNumberType)
END;
RETURN FALSE
END;
ExtractPacked(result,x);
Reduce(wArg2^);
IF Root(result)#wNumber THEN
IF Root(result)#wError THEN
MakePacked(result,wError,NotNumberType)
END;
RETURN FALSE
END;
ExtractPacked(result,y);
RETURN TRUE
END ExtractNumbers;
PROCEDURE pAdd;
VAR
x,y:INTEGER;
BEGIN
IF ExtractNumbers(x,y) THEN
MakePacked(result,wNumber,x+y)
END
END pAdd;
PROCEDURE pSub;
VAR
x,y:INTEGER;
BEGIN
IF ExtractNumbers(x,y) THEN
MakePacked(result,wNumber,x-y)
END
END pSub;
PROCEDURE pMul;
VAR
x,y:INTEGER;
BEGIN
IF ExtractNumbers(x,y) THEN
MakePacked(result,wNumber,x*y)
END
END pMul;
PROCEDURE pDiv;
VAR
x,y:INTEGER;
BEGIN
IF ExtractNumbers(x,y) THEN
MakePacked(result,wNumber,x DIV y)
END
END pDiv;
PROCEDURE pFind;
VAR
s:POINTER TO ARRAY [0..FormalLength] OF CHAR;
l:link;
BEGIN
Reduce(wName^);
IF Root(result)#wString THEN
IF Root(result)#wError THEN
MakePacked(result,wError,NotStringType)
END;
RETURN
END;
ExtractPacked(result,s);
l:=FindWord(s^);
IF l=NIL THEN
MakePacked(result,wError,NotFound)
ELSE
NewLayer(DefEntry(l));
result:=wMeaning^
END
END pFind;
PROCEDURE pAssociate;
VAR
entry:closure;
BEGIN
Copy(DefEntry(Root(wName^)),tempDef);
AddEnv(tempDef,Root(wProperty^),wValue^);
SetDefEntry(Root(wName^),tempDef);
tempDef:=EmptyClosure;
Reduce(wStruct^)
END pAssociate;
PROCEDURE pWordEntry;
BEGIN
result:=DefEntry(Root(wStruct^))
END pWordEntry;
PROCEDURE pDebug;
BEGIN
debug:=TRUE;
Reduce(wStruct^);
debug:=FALSE
END pDebug;
PROCEDURE pCollect;
BEGIN
Collect;
Reduce(wStruct^)
END pCollect;
PROCEDURE pAbort;
BEGIN
HALT
END pAbort;
PROCEDURE pVList;
BEGIN
vList;
MakeDef(result,wTrue)
END pVList;
BEGIN
DefineWord(wChar, 'CHAR', HandlePackage);
DefineWord(wError, 'ERROR', HandlePackage);
DefineWord(wNumber, 'NUMBER', HandlePackage);
DefineWord(wCharSet, 'CharSET', HandlePackage);
AddArgument(wPackage, 'Package');
DefineWord(wPacked, 'Packed', HandlePackage);
AddArgument(wCar, 'Car');
AddArgument(wCdr, 'Cdr');
AddAtom(wNil, 'Nil');
AddPrimWord(wCons, 'Cons', Build);
MakeDef(tempDef,wCons);
AddEnv(wCons^,wType,tempDef);
MakeDef(tempDef,wCar);
AddValuedEnv(wCons^,wCar,tempDef);
MakeDef(tempDef,wCdr);
AddValuedEnv(wCons^,wCdr,tempDef);
tempDef:=EmptyClosure;
AddPrimWord(wJoin, 'Join', pJoin);
AddPrimWord(wGetType, 'GetType', pGetType);
AddPrimWord(wGetProp, 'PropertyValue', pGetProp);
AddPrimWord(wAddValProp, 'AddValuedProperty', pAddValProp);
AddPrimWord(wAddProp, 'AddProperty', pAddProp);
AddPrimWord(wRemProp, 'RemoveProperty', pRemProp);
AddPrimWord(wCopy, 'Copy', pCopy);
AddPrimWord(wIsOfClass, 'IsOfClass', pIsOfClass);
AddPrimWord(wEqual, 'Equal', pEqual);
AddPrimWord(wQuote, 'Quote', pQuote);
AddPrimWord(wBuild, 'Build', Build);
AddPrimWord(wBuild, 'BuildReduced', BuildReduced);
AddPrimWord(wVain, 'Vain', pVain);
AddArgument(wDescription, 'Description');
AddArgument(wStruct, 'Struct');
AddArgument(wProperty, 'Property');
AddArgument(wValue, 'Value');
AddArgument(wType, 'Type');
AddArgument(wAncestor, 'Ancestor');
AddAtom(wDummy, 'Dummy');
AddAtom(wTrue, 'True');
AddAtom(wFalse, 'False');
AddPrimWord(wAnd, 'And', pAnd);
AddPrimWord(wOr, 'Or', pOr);
AddPrimWord(wNot, 'Not', pNot);
AddPrimWord(wIf, 'If', pIf);
AddArgument(wTest, 'Test');
AddArgument(wYes, 'Yes');
AddArgument(wNo, 'No');
AddArgument(wArg1, 'Arg1');
AddArgument(wArg2, 'Arg2');
AddArgument(wFile, 'File');
AddPrimWord(wAdd, 'Add', pAdd);
AddPrimWord(wSub, 'Sub', pSub);
AddPrimWord(wMul, 'Mul', pMul);
AddPrimWord(wDiv, 'Div', pDiv);
AddPrimWord(wFind, 'Find', pFind);
AddPrimWord(wWordEntry, 'WordEntry', pWordEntry);
AddPrimWord(wAssociate, 'Associate', pAssociate);
AddPrimWord(wDebug, 'Debug', pDebug);
AddPrimWord(wCollect, 'Collect', pCollect);
AddPrimWord(wAbort, 'Abort', pAbort);
AddPrimWord(wVList, 'VList', pVList)
END Library.