SiroccoDriver.mesa
Copyright © 1986 by Xerox Corporation. All rights reserved.
Bhargava, August 9, 1986 6:51:49 pm PDT
Bill Jackson (bj) September 17, 1986 10:52:35 pm PDT
DIRECTORY
AbstractTypesDef USING[ProgramNode],
Commander USING[CommandProc, Register],
FS USING[Error, StreamOpen],
IO USING[rope, RIS, STREAM, Close, EndOfStream, GetTokenRope, IDProc, PutF, PutFR],
OneCasabaParser USING[GetReportStream],
OneCasabaParserImpl USING [UnRecoverableSyntaxError],
Rope USING[ROPE, Cat, Length, Replace],
SiroccoParserDef USING[ParseOneStream],
SiroccoPrivate USING [AquireState, Collapse, EndItAll, GenAuxDefs, GenAuxImpl, GenCImpl, GenDefs, GenSImpl, Handle, Object, TABLES],
ThreeC4Support USING[GetReportStream];
SiroccoDriver: CEDAR PROGRAM
IMPORTS SiroccoParserDef, Commander, FS, IO, OneCasabaParser, OneCasabaParserImpl, Rope, SiroccoPrivate, ThreeC4Support ~ {
OPEN SiroccoPrivate;
Copied Types
ROPE: TYPE ~ Rope.ROPE;
Global State
debugFlags: CARDINAL ← 0;
Procs
Sirocco: Commander.CommandProc ~ {
h: Handle;
commandLineStream: IO.STREAMIO.RIS[cmd.commandLine];
errorFlag: BOOLEANFALSE;
root: AbstractTypesDef.ProgramNode;
rootName: ROPE;
sourceStream: IO.STREAM;
specName: ROPE;
tables: TABLES;
h ← NEW [Object];
rootName ← IO.GetTokenRope[commandLineStream, IO.IDProc
! IO.EndOfStream => {
rootName ← NIL;
CONTINUE
}
].token;
specName ← Rope.Cat[rootName, ".cr"];
IO.Close[commandLineStream];
sourceStream ← FS.StreamOpen[specName
! FS.Error =>
IF (error.group = user) THEN {
msg ← IO.PutFR["%g", IO.rope[error.explanation]];
GOTO ERRMSG2;
}
];
root ← NARROW[SiroccoParserDef.ParseOneStream[sourceStream, debugFlags, cmd.out
! OneCasabaParser.GetReportStream => {
errorFlag ← TRUE;
IO.PutF[cmd.out, "\nSyntax Error in %g: ", IO.rope[specName]];
RESUME[cmd.out]
};
OneCasabaParserImpl.UnRecoverableSyntaxError => {
errorFlag ← TRUE;
IO.PutF[cmd.out, "\nSyntax Error in %g : ", IO.rope[specName]];
GOTO ERRMSG;
}
]];
IO.Close[sourceStream];
IF (errorFlag) THEN GOTO ERRMSG;
tables ← root.procs.MakeSymbolTable[root !
OneCasabaParser.GetReportStream => {
errorFlag ← TRUE;
IO.PutF[cmd.out, "\nSyntax Error %g!:\n", IO.rope[specName]];
RESUME[cmd.out]
};
ThreeC4Support.GetReportStream => {
errorFlag ← TRUE;
RESUME[cmd.out]
};
EndItAll => {
IO.PutF[cmd.out, "\nMission Aborted, need help.... "];
errorFlag ← TRUE;
GOTO ERRMSG;
};
AquireState => {
RESUME[h];
};
];
{
ENABLE AquireState => {
RESUME[h];
};
prefixLength: INT ← Rope.Length[h.programKey];
outfilePrefix: ROPE ← Rope.Replace[h.programKey, (prefixLength-1), prefixLength];
Finished: PROC [r: ROPE] ~ {
IO.PutF[cmd.out, "\t%g%g\n",
IO.rope[outfilePrefix],
IO.rope[r]
];
};
IO.PutF[cmd.out, "Files Written:\n"];
Collapse[]; Finished[".Tables"];
GenDefs[]; Finished[".Mesa"]; Finished["Init.Mesa"];
GenAuxDefs[]; Finished["Aux.Mesa"];
GenAuxImpl[]; Finished["AuxImpl.Mesa"];
GenCImpl[]; Finished["ClientImpl.Mesa"];
GenSImpl[]; Finished["ServerImpl.Mesa"];
};
EXITS
ERRMSG => {
result ← $Failure;
msg ← "Call Cobra!";
};
ERRMSG2 => {
result ← $Failure;
};
};
main code
Commander.Register["///Commands/Sirocco", Sirocco];
}...