DIRECTORY Basics USING[BITAND], IO USING[card, Close, EndOfStream, GetCedarTokenRope, PutF, rope, STREAM, TokenKind], Rope USING[Length, ROPE, Substr], OneCasabaParser USING[ParserTable, Parse], ThreeC4Support USING[SeeProdLinkArray, SeeProdLinkArrayBody, TokenLinkArray, TokenLinkArrayBody, ShowParseSteps]; ThreeC4SupportImpl: CEDAR PROGRAM IMPORTS Basics, IO, OneCasabaParser, Rope EXPORTS ThreeC4Support = BEGIN OPEN ThreeC4Support; ParseOneStream: PUBLIC PROC[from: IO.STREAM, table: OneCasabaParser.ParserTable, setUpLinks: PROC[SeeProdLinkArray, TokenLinkArray], nProductions: INT, debugFlags: CARDINAL, debuggingTextTo: IO.STREAM] RETURNS[REF ANY] = BEGIN prodLinkArray: SeeProdLinkArray _ NEW[SeeProdLinkArrayBody[nProductions]]; genericTokenLinkArray: TokenLinkArray _ NEW[TokenLinkArrayBody]; stack: LIST OF REF ANY _ NIL; charPosition: INT _ 0; last100Index: CARDINAL _ 1; Last100: ARRAY [1..100] OF REF Stuff; Stuff: TYPE = RECORD[doing: StuffCase, code: CARDINAL, text: Rope.ROPE]; StuffCase: TYPE = {shift, reduction, trying}; Record: PROC[case: StuffCase, code: CARDINAL, text: Rope.ROPE] = BEGIN IF Last100[last100Index] = NIL THEN Last100[last100Index] _ NEW[Stuff]; Last100[last100Index]^ _ [case, code, text]; last100Index _ last100Index+1; IF last100Index > 100 THEN last100Index _ 1; END; GetSourceToken: PROC RETURNS[tokenKind: IO.TokenKind, tokenText: Rope.ROPE, position: INT] = BEGIN charsSkipped: CARDINAL; thisTokenPosition: INT; DO [tokenKind, tokenText, charsSkipped] _ IO.GetCedarTokenRope[from, FALSE ! IO.EndOfStream => BEGIN tokenKind _ tokenEOF; tokenText _ "tokenEOF"; charsSkipped _ 0; -- this last is a lie CONTINUE; END]; charPosition _ thisTokenPosition _ charPosition+charsSkipped; charPosition _ charPosition+Rope.Length[tokenText]; IF tokenKind # tokenCOMMENT THEN RETURN[tokenKind, tokenText, thisTokenPosition]; ENDLOOP; END; SeeGenericShift: PROC[code: CARDINAL, kind: IO.TokenKind, text: Rope.ROPE, firstCharPosition: INT] = BEGIN IF Basics.BITAND[debugFlags, ShowParseSteps] # 0 THEN IO.PutF[debuggingTextTo, " shift %g:%g\N", IO.card[code], IO.rope[text]] ELSE Record[shift, code, text]; IF kind # tokenROPE THEN stack _ CONS[genericTokenLinkArray[kind][text, firstCharPosition], stack] ELSE BEGIN withoutQuotes: Rope.ROPE _ Rope.Substr[base: text, start: 1, len: Rope.Length[text]-2]; stack _ CONS[genericTokenLinkArray[kind][withoutQuotes, firstCharPosition+1], stack] END; END; SeeReduction: PROC[rule: CARDINAL, firstCharPosition: INT, length: INT] = BEGIN IF Basics.BITAND[debugFlags, ShowParseSteps] # 0 THEN IO.PutF[debuggingTextTo, " reduce by %g\N", IO.card[rule]] ELSE Record[reduction, rule, ""]; stack _ prodLinkArray.links[rule][stack, firstCharPosition, length]; END; setUpLinks[prodLinkArray, genericTokenLinkArray]; [] _ OneCasabaParser.Parse[table, GetSourceToken, SeeReduction, SeeGenericShift]; IO.Close[from]; RETURN[stack.first]; END; -- GetSourceInfo: PUBLIC SIGNAL RETURNS[sourcePosition, sourceLength: INT] = CODE; GetReportStream: PUBLIC SIGNAL RETURNS[IO.STREAM] = CODE; END.. bThreeC4SupportImpl.mesa: October 1, 1985 9:43:28 am PDT Sturgis, May 9, 1986 4:07:38 pm PDT Êü˜Jšœ7™7Jšœ#™#J˜šÏk ˜ J˜J˜UJ˜!Jšœœ˜*Jšœq˜qJ˜—J˜šœœœE˜fJš˜Jšœ˜J˜J˜š ÏbœAœ œC œ œ˜ÜJšœ˜J˜JJ˜@J˜J˜J˜Jšœœ˜J˜Jšœœ˜Jšœ œ œœ˜%Jš œœœœ œ˜HJšœ œ˜-J˜šÏnœœœ œ˜@Jš˜šœœ˜#Jšœœ˜#—J˜,J˜Jšœœ˜,Jšœ˜—J˜š Ðbnœœœ)œ œ˜\Jš˜J˜J˜˜šœB˜Gšœ˜Jšœ˜Jšœ˜J˜J˜'J˜ Jšœ˜——J˜=J˜3J˜šœ˜ Jšœ0˜0—J˜—Jšœ˜—J˜š Ÿœœœ œœ˜dJš˜šœœ!œN˜ƒJšœ˜—J˜šœ˜JšœI˜I—˜J˜Jšœ œ?˜WJšœU˜UJ˜J˜—Jšœ˜J˜—š Ÿ œœœœ œ˜IJš˜šœœ!œ@˜uJšœ˜!—J˜J˜DJ˜Jšœ˜—J˜J˜J˜J˜J˜1J˜J˜JšœQ˜QJ˜J˜J˜J˜Jšœ˜J˜—J˜J˜J˜J˜J˜OJ˜9J˜Jšœ˜Jšž˜——…— z