DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ B T ┃
Length: 5862 (0x16e6) Types: TextFile Names: »B«
└─⟦85b835f43⟧ Bits:30000549 8mm tape, Rational 1000, Xlib rev 6.00 └─ ⟦0c20f784e⟧ »DATA« └─⟦1abbe589f⟧ └─⟦591c5b094⟧ └─⟦this⟧
with Text_Io; with Symbol_Table; with Arithmetic; use Arithmetic; with Vstring_Equal; use Vstring_Equal; with Vstring_Scan; use Vstring_Scan; with Vstring_Query; use Vstring_Query; with Vstring_Type; use Vstring_Type; package body Lexemes is ------------------------------------------------------------------------------ -- Copyright 1989 - 1991 by Rational, Santa Clara, California. -- -- All Rights Reserved. -- -- Permission to use, copy, modify, and distribute this software and its -- documentation for any purpose and without fee is hereby granted, -- provided that the above copyright notice(s) appear in all copies and that -- both that copyright notice(s) and this permission notice appear in -- supporting documentation, and that the name of Rational not be used in -- advertising or publicity pertaining to distribution of the software -- without specific, written prior permission. -- -- Rational disclaims all warranties with regard to this software, including -- all implied warranties of merchantability and fitness, in no event shall -- Rational be liable for any special, indirect or consequential damages or -- any damages whatsoever resulting from loss of use, data or profits, whether -- in an action of contract, negligence or other tortious action, arising out -- of or in connection with the use or performance of this software. ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ -- Scanning Breaksets ------------------------------------------------------------------------------ Over_Identifier : Breakset; -- letters, digits, underscore Skip_Whitespace : Breakset; -- space, ht, cr, lf, ff, vt --\f procedure Next_Lexeme (Line : Vstring; Lexeme : in out Lexeme_Kind; Text : in out Vstring; Value : in out Symbol_Value) is ------------------------------------------------------------------------------ -- Line - Specifies the input line/fragment to scan -- Lexeme - Receives the Lexeme_Kind of the next lexeme -- Text - Receives the textual representation of the next lexeme; if any -- Value - Receives the value associated with the lexeme; if any -- -- Called to scan the Line and to recognize and remove the next lexeme. -- Lexeme is set to Lk_Error if we get confused. Lk_Eol is returned if -- the line is empty or ends with a comment. The Text argument is only -- set for Lk_Identifier values. The Value argument is changed for any -- lexeme value that is a name (keywords and parameter names); it's value -- only has meaning for Lk_Identifiers. ------------------------------------------------------------------------------ Brk : Character; Success : Boolean; begin Trunc_Scan (Line, Skip_Whitespace, Brk); case Brk is when Ascii.Nul => if Line.Length = 0 then Lexeme := Lk_Eol; else Lexeme := Lk_Error; end if; ----Letters indicate the start of a keyword or of a parameter name. when 'A' .. 'Z' | 'a' .. 'z' => Scan (Text, Line, Over_Identifier, Brk); Symbol_Table.Symbol_Map.Find (Symbol_Table.Sym_Map, To_String (Text), Value, Success); if not Success then Lexeme := Lk_Unknown; elsif Value.Kind = Sk_Keyword then Lexeme := Value.Kwd; else Lexeme := Lk_Identifier; end if; ----Single character lexemes. when '|' => Brk := Lop_First (Line); Lexeme := Lk_Vbar; when ',' => Brk := Lop_First (Line); Lexeme := Lk_Comma; when ';' => Brk := Lop_First (Line); Lexeme := Lk_Semicolon; when '(' => Brk := Lop_First (Line); Lexeme := Lk_Lparen; when ')' => Brk := Lop_First (Line); Lexeme := Lk_Rparen; ----Other lexemes. when '=' => if Line.Length > 1 and then Line.Chars (2) = '>' then Lexeme := Lk_Arrow; Truncstring_For (Line, 3, Inf); else Brk := Lop_First (Line); Lexeme := Lk_Eql; end if; when '/' => if Equal_Prefix (Line, "/=") then Lexeme := Lk_Neq; Truncstring_For (Line, 3, Inf); else -- lexeme := lk_divide; Lexeme := Lk_Error; end if; ----A dash is presumably a comment (at least until we have numeric types). when '-' => if Line.Length < 2 or else Line.Chars (2) /= '-' then Lexeme := Lk_Error; else Empty_Vstring (Line); Lexeme := Lk_Eol; end if; ----Anything else is an error; we don't know what to do. when others => Lexeme := Lk_Error; end case; end Next_Lexeme; --\f begin Set_Breakset (Over_Identifier, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_", "", "XR"); Set_Breakset (Skip_Whitespace, ' ' & Ascii.Ht & Ascii.Cr & Ascii.Lf & Ascii.Ff & Ascii.Vt & Ascii.Nul, "", "XR"); end Lexemes;