SiroccoDriver.mesa
Copyright Ó 1986, 1987 by Xerox Corporation. All rights reserved.
Bhargava, August 9, 1986 6:51:49 pm PDT
Demers, January 3, 1987 3:24:13 pm PST
Bill Jackson (bj) August 4, 1987 11:12:14 pm PDT
DIRECTORY
Commander USING [ CommandProc, Register ],
FS USING [ Error, StreamOpen ],
GenerateTables USING [ Bottle ],
IO USING [ int, rope, RIS, STREAM, Close, EndOfStream, GetTokenRope, IDProc, PutF, PutFR ],
OneCasabaParser USING [ GetReportStream, UnRecoverableSyntaxError ],
Rope USING [ ROPE, Concat, Equal, Length, Replace, Substr ],
SiroccoATDef USING [ ProgramNode ],
SiroccoParserDef USING [ ParseOneStream ],
SiroccoPrivate USING [ AquireState, Collapse, EndItAll, GenAuxDefs, GenAuxImpl, GenCImpl, GenDefs, GenSImpl, Handle, TypeGraph, Object ],
ThreeC4Support USING [ GetReportStream ];
SiroccoDriver: CEDAR PROGRAM
IMPORTS Commander, FS, GenerateTables, IO, OneCasabaParser, Rope, SiroccoParserDef, SiroccoPrivate, ThreeC4Support ~ {
OPEN SiroccoPrivate;
ROPE: TYPE ~ Rope.ROPE;
debugFlags: CARDINAL ← 0;
usage: ROPE ~ "\tusage: filename[.cr]";
doc: ROPE ~ Rope.Concat[" Translate Courier programs into Cedar Stubs\n", usage];
Sirocco: Commander.CommandProc ~ {
h: Handle ← NEW [Object];
ProcessParseTree: PROC [ root: REF ] RETURNS [ errorFlag: BOOLFALSE ] ~ {
pgm: SiroccoATDef.ProgramNode ~ NARROW[root];
typegraph: SiroccoPrivate.TypeGraph;
[h.programName, h.programNo, h.versionNo, typegraph] ←
pgm.procs.MakeSymbolTable[pgm
! OneCasabaParser.GetReportStream => {
errorFlag ← TRUE;
IO.PutF[cmd.out, "\nSyntax Error\nNo recovery found.\n"];
RESUME[cmd.out]
};
ThreeC4Support.GetReportStream => {
errorFlag ← TRUE;
RESUME[cmd.out]
};
EndItAll => {
IO.PutF[cmd.out, "\nMission Aborted, need help.... "];
errorFlag ← TRUE;
};
AquireState => {
RESUME[h];
};
];
};
errorFlag: BOOLEANFALSE;
specName: ROPE;
root: REF;
rootName: ROPE;
{
ENABLE UNWIND => IO.Close[commandLineStream];
commandLineStream: IO.STREAMIO.RIS[cmd.commandLine];
rootName ← IO.GetTokenRope[commandLineStream, IO.IDProc
! IO.EndOfStream => { rootName ← NIL; CONTINUE }
].token;
{
len: INT ~ Rope.Length[rootName];
IF ( ( len > 3) AND ( Rope.Equal[ Rope.Substr[rootName, (len-3), 3], ".cr", FALSE ] ) )
THEN { specName ← rootName; rootName ← Rope.Substr[rootName, 0, (len-3)] }
ELSE { specName ← Rope.Concat[rootName, ".cr"] };
};
IO.Close[commandLineStream];
IF ( rootName = NIL ) THEN {
msg ← usage;
GOTO ERRMSG2;
};
};
{
ENABLE UNWIND => IO.Close[sourceStream];
sourceStream: IO.STREAMFS.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]
};
OneCasabaParser.UnRecoverableSyntaxError => {
errorFlag ← TRUE;
IO.PutF[cmd.out, "\nSyntax Error in %g : ", IO.rope[specName]];
GOTO ERRMSG;
}
]];
IO.Close[sourceStream];
};
IF ( errorFlag ) THEN GOTO ERRMSG;
IF ( ProcessParseTree[root] ) THEN GOTO ERRMSG;
h.programKeyWD ← IO.PutFR["%gP%gV%g",
IO.rope[h.programName],
IO.int[h.programNo],
IO.int[h.versionNo]
];
h.programKey ← Rope.Concat[h.programKeyWD, "."];
{
ENABLE AquireState => {
RESUME[h];
};
prefixLength: INT ← Rope.Length[h.programKey];
outfilePrefix: ROPE ← Rope.Replace[h.programKey, prefixLength.PRED, 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"];
GenerateTables.Bottle[]; Finished[".coke"];
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;
};
};
Commander.Register["Sirocco", Sirocco, doc];
}.