MODULE W;
FROM IO IMPORT WrStr, WrLn, WrCard, EndOfRd, RdChar;
IMPORT IO;
FROM Machine IMPORT link, Root, result;
FROM Machine IMPORT Reduce, StartLayer, PopLayer, SaveDefinition;
FROM Machine IMPORT MakeDef, MakePacked, MakeString, ExtractPacked;
FROM Library IMPORT wStruct, wFile, wAncestor;
FROM Library IMPORT wString, wError, errorCodes, wTrue, wUndefined;
FROM Names IMPORT AddAtom, AddPrimWord, NewDictionary, OldDictionary;
FROM Buffers IMPORT ReportError, OpenInput, CloseInput;
FROM Parser IMPORT Parse;
FROM Decoder IMPORT wWrite;
FROM Grammars IMPORT wGrammar, wFail, wSentence;
(* FROM Graph IMPORT SetVideoMode, InitGraph; *)
IMPORT PMD;
VAR
wInterpret,wQuit,wLoad:link;
level:CARDINAL;
(*# data(stack_size => 0FF00H) *)
PROCEDURE pInterpret;
VAR
ch,empty:CHAR;
BEGIN
empty:=0C;
INC(level);
LOOP
MakeString(wFile^,wString,ADR(empty));
WrLn;
WrStr('Reduce[');
WrCard(level,0);
WrStr(']>');
Reduce(wLoad^);
WHILE NOT EndOfRd(FALSE) DO
ch:=RdChar()
END;
IF Root(result)=wQuit THEN
MakeDef(result,wTrue);
EXIT
ELSE
StartLayer;
SaveDefinition(wStruct);
wStruct^:=result;
Reduce(wWrite^);
IF Root(result)=wFail THEN
WrStr('Output error!')
END;
PopLayer
END
END;
DEC(level)
END pInterpret;
PROCEDURE pLoad;
VAR
filename:ARRAY [0..30] OF CHAR;
newFile:BOOLEAN;
ch:CHAR;
BEGIN
Reduce(wFile^);
newFile:=(Root(result)=wString);
IF newFile THEN
ExtractPacked(result,filename);
IF NOT OpenInput(filename) THEN
MakePacked(result,wError,IOError);
RETURN
END;
SaveDefinition(wFile);
MakeDef(wFile^,wUndefined)
END;
NewDictionary;
StartLayer;
SaveDefinition(wGrammar);
wGrammar^:=wSentence^;
Parse;
PopLayer;
SaveDefinition(wAncestor);
wAncestor^:=result;
Reduce(result);
OldDictionary;
IF newFile THEN
CloseInput
END
END pLoad;
BEGIN
level:=0;
AddAtom(wQuit,'Quit');
AddPrimWord(wInterpret, 'Interpret', pInterpret);
AddPrimWord(wLoad, 'Load', pLoad);
(* InitGraph;
IF NOT SetVideoMode(7) THEN
WrStr('Prebacivanje u tekst mod nije uspelo!')
END;
*)
pInterpret
END W.