DIRECTORY ArpaLex822: TYPE USING [LexToken, TokenType], ArpaMTMiscOps: TYPE USING [Lookup, Table], ArpaMTP1: TYPE --P1-- USING [Token, TValue, TerminalNode, nullTValue, Index, ScannerProc], ArpaMTParseTable: TYPE ParseTable USING [ampmTok, atomTok, atSignTok, colonTok, commaTok, dateDummy, dayTok, dLitTok, dotTok, EOLTok, errorTok, lBracketTok, monthTok, nameDummy, qStringTok, rBracketTok, semiTok, TSymbol, zoneTok], IO: TYPE USING [GetIndex, STREAM], Rope: TYPE USING [ROPE, Fetch, Length]; ArpaMTScannerImpl: CEDAR PROGRAM IMPORTS ArpaLex822, ArpaMTMiscOps, IO, Rope EXPORTS ArpaMTP1 ~ { OPEN P1~~ArpaMTP1, ArpaMTParseTable; ROPE: TYPE = Rope.ROPE; ampmTable: ArpaMTMiscOps.Table ~ LIST["am", "pm"]; dayTable: ArpaMTMiscOps.Table ~ LIST["sun", "sunday", "mon", "monday", "tue", "tuesday", "wed", "wednesday", "thu", "thursday", "fri", "friday", "sat", "saturday"]; monthTable: ArpaMTMiscOps.Table ~ LIST["jan", "january", "feb", "february", "mar", "march", "apr", "april", "may", "jun", "june", "jul", "july", "aug", "august", "sep", "sept", "september", "oct", "october", "nov", "november", "dec", "december"]; zoneTable: ArpaMTMiscOps.Table ~ LIST[ "ut", "gmt", "est", "edt", "cst", "cdt", "mst", "mdt", "pst", "pdt", "bst"]; stream: IO.STREAM _ NIL; nTokens: CARDINAL; -- token count nErrors: CARDINAL; -- lexical errors eolSeen: BOOLEAN _ FALSE; -- stop the parse at the end of a header firstTime: BOOLEAN; -- to force dummy token ScanName: PUBLIC P1.ScannerProc ~ { tokenText, whiteSpace: ROPE; tokType: ArpaLex822.TokenType; IF firstTime THEN { firstTime _ FALSE; RETURN [[index~stream.GetIndex[], value~P1.nullTValue, class~nameDummy]]; }; IF eolSeen THEN RETURN [[index~stream.GetIndex[], value~P1.nullTValue, class~EOLTok]]; token.index _ stream.GetIndex[]; [tokenText, whiteSpace, tokType] _ ArpaLex822.LexToken[stream]; token.value _ NEW[P1.TerminalNode _ [whiteSpace~whiteSpace, text~tokenText]]; token.class _ SELECT tokType FROM atomTok => ArpaMTParseTable.atomTok, domainLiteralTok => ArpaMTParseTable.dLitTok, EOLTok => ArpaMTParseTable.EOLTok, quotedStringTok => ArpaMTParseTable.qStringTok, specialTok => SELECT tokenText.Fetch[0] FROM '. => ArpaMTParseTable.dotTok, ', => ArpaMTParseTable.commaTok, ': => ArpaMTParseTable.colonTok, '; => ArpaMTParseTable.semiTok, '@ => ArpaMTParseTable.atSignTok, '< => ArpaMTParseTable.lBracketTok, '> => ArpaMTParseTable.rBracketTok, ENDCASE => ArpaMTParseTable.errorTok, ENDCASE => ArpaMTParseTable.errorTok; IF token.class = EOLTok THEN eolSeen _ TRUE ELSE IF token.class = ArpaMTParseTable.errorTok THEN { IF NOT eolSeen THEN nErrors _ nErrors+1 }; }; ScanDate: PUBLIC P1.ScannerProc ~ { tokenText, whiteSpace: ROPE; tokType: ArpaLex822.TokenType; IF firstTime THEN { firstTime _ FALSE; RETURN [[index~stream.GetIndex[], value~P1.nullTValue, class~dateDummy]]; }; IF eolSeen THEN RETURN [[index~stream.GetIndex[], value~P1.nullTValue, class~EOLTok]]; token.index _ stream.GetIndex[]; [tokenText, whiteSpace, tokType] _ ArpaLex822.LexToken[stream]; token.value _ NEW[P1.TerminalNode _ [whiteSpace~whiteSpace, text~tokenText]]; token.class _ SELECT tokType FROM atomTok => SELECT TRUE FROM ArpaMTMiscOps.Lookup[tokenText, monthTable] => ArpaMTParseTable.monthTok, ArpaMTMiscOps.Lookup[tokenText, dayTable] => ArpaMTParseTable.dayTok, ArpaMTMiscOps.Lookup[tokenText, ampmTable] => ArpaMTParseTable.ampmTok, ArpaMTMiscOps.Lookup[tokenText, zoneTable] => ArpaMTParseTable.zoneTok, NumericZone[tokenText] => ArpaMTParseTable.zoneTok, MilitaryZone[tokenText] => ArpaMTParseTable.zoneTok, ENDCASE => ArpaMTParseTable.atomTok, domainLiteralTok => ArpaMTParseTable.dLitTok, EOLTok => ArpaMTParseTable.EOLTok, quotedStringTok => ArpaMTParseTable.qStringTok, specialTok => SELECT tokenText.Fetch[0] FROM '. => ArpaMTParseTable.dotTok, ', => ArpaMTParseTable.commaTok, ': => ArpaMTParseTable.colonTok, '; => ArpaMTParseTable.semiTok, '@ => ArpaMTParseTable.atSignTok, '< => ArpaMTParseTable.lBracketTok, '> => ArpaMTParseTable.rBracketTok, ENDCASE => ArpaMTParseTable.errorTok, ENDCASE => ArpaMTParseTable.errorTok; IF token.class = EOLTok THEN eolSeen _ TRUE ELSE IF token.class = ArpaMTParseTable.errorTok THEN { IF NOT eolSeen THEN nErrors _ nErrors+1 }; }; MilitaryZone: PROC [arg: ROPE] RETURNS[BOOL] = { -- A..Z except J char: CHAR; IF arg.Length[] # 1 THEN RETURN[FALSE]; char _ arg.Fetch[0]; IF char = 'J OR char = 'j THEN RETURN[FALSE]; IF ~(char IN['a..'z]) AND ~(char IN['A..'Z]) THEN RETURN[FALSE]; RETURN[TRUE]; }; NumericZone: PROC [arg: ROPE] RETURNS[BOOL] = { -- +HHMM or -HHMM char: CHAR; IF arg.Length[] # 5 THEN RETURN[FALSE]; char _ arg.Fetch[0]; IF char # '+ AND char # '- THEN RETURN[FALSE]; FOR i: INT IN [1..4] DO char _ arg.Fetch[i]; IF ~(char IN['0..'9]) THEN RETURN[FALSE]; ENDLOOP; RETURN[TRUE]; }; ScanInit: PUBLIC PROC[source: IO.STREAM] = { stream _ source; nTokens _ nErrors _ 0; eolSeen _ FALSE; firstTime _ TRUE; }; ScanReset: PUBLIC PROC RETURNS[CARDINAL, CARDINAL] = { RETURN [nTokens, nErrors]}; }. –file ArpaMTScannerImpl.mesa derived from Compiler>Scanner.mesa last edit by Schmidt, May 3, 1982 4:27 pm last modified by Satterthwaite, June 6, 1983 4:06 pm Last Edited by: Nichols, July 13, 1983 6:13 pm Last Edited by: HGM, January 31, 1985 9:12:02 pm PST John Larson, October 21, 1987 10:20:12 pm PDT Tables of rope constants for the date tokens. the scanner proper initialization/finalization ΚL˜Jšœ™šœ"™"Jšœ*™*Jšœ4™4Jšœ.™.JšœΟkœ™4Icodešœ-™-—J˜š ˜ Jšœ œœ˜-Jšœœœ˜*Jšœ œΟcœœ@˜[Jšœœ œΏ˜ζJšœœœ œ˜"Jšœœœœ˜'J˜—šΟnœœ˜ Jšœœ˜+Jšœ ˜Jšœœ˜$J˜Jšœœœ˜—J™™-J˜Jšœ!œ ˜2Jšœ œ€˜€Jšœ"œΠ˜φšœ!œ˜&JšœL˜L—J˜—™J˜Jšœœœœ˜Jšœ œž˜!Jšœ œž˜%Jšœ œœž(˜BJšœ œž˜+J˜šŸœœœ˜#Jšœœ˜Jšœ˜J˜šœ œ˜Jšœ œ˜Jšœ"œ˜IJ˜J˜—šœ ˜Jšœ"œ˜F—J˜J˜ Jšœ?˜?Jšœœœ9˜Mšœœ ˜!Jšœ$˜$Jšœ-˜-Jšœ"˜"Jšœ/˜/šœ ˜ šœ˜Jšœ˜Jšœ ˜ Jšœ ˜ Jšœ˜Jšœ!˜!Jšœ#˜#Jšœ#˜#Jšœ˜%——Jšœ˜%—J˜šœ˜Jšœ ˜—šœœ)œ˜6Jšœœ œ˜'J˜—Jšœ˜J˜J˜—šŸœœœ˜#Jšœœ˜Jšœ˜J˜šœ œ˜Jšœ œ˜Jšœ"œ˜IJ˜J˜—šœ ˜Jšœ"œ˜F—J˜J˜ Jšœ?˜?Jšœœœ9˜Mšœœ ˜!šœ ˜ šœœ˜JšœI˜IJšœE˜EJšœG˜GJšœG˜GJšœ3˜3Jšœ4˜4Jšœ˜$——˜Jšœ˜—šœ ˜ Jšœ˜—šœ˜Jšœ˜—šœ ˜ šœ˜Jšœ˜Jšœ ˜ Jšœ ˜ Jšœ˜Jšœ!˜!Jšœ#˜#Jšœ#˜#Jšœ˜%——Jšœ˜%—J˜šœ˜Jšœ ˜—šœœ)œ˜6Jšœœ œ˜'J˜—J˜J˜J˜—š Ÿ œœœœœž˜AJšœœ˜ Jšœœœœ˜'J˜Jš œ œ œœœ˜-Jšœœ œœ œœœ˜@Jšœœ˜—J˜š Ÿ œœœœœž˜AJšœœ˜ Jšœœœœ˜'J˜Jš œ œ œœœ˜.šœœœ˜J˜Jš œœ œœœ˜)Jšœ˜—Jšœœ˜——J™šœ™J˜š Ÿœœœ œœ˜,J˜J˜Jšœ œ˜Jšœ œ˜J˜J˜—š Ÿ œœœœœœ˜6Jšœ˜J˜—J˜——…—œ~