Copyright 1996, Critical Mass, Inc. All rights reserved.
INTERFACE M3Sym;
IMPORT Buf;
PROCEDURE Scan (buf: Buf.T; cb: CallBack; ignore := KindSet {});
Scan the Modula-3 file in buf and call the cb.note routines
for any top-level symbol definitions or uses. If any of the
cb.note routines returns TRUE, the scan is terminated prematurely.
Otherwise, the scan continues through the entire buffer. The
cb.note routines are not called for symbols whose kinds are in
the ignore set.
TYPE
KindSet = SET OF Kind;
Kind = {
IntfName, (* INTERFACE <sym> ... *)
ImplName, (* MODULE <sym> ... *)
GIntfName, (* GENERIC INTERFACE <sym> ... *)
GImplName, (* GENERIC MODULE <sym> ... *)
GIntfUse, (* INTERFACE Foo = <sym> ... *)
GImplUse, (* MODULE Foo = <sym> ... *)
GFormal, (* GENERIC MODULE Baz (<sym>, <sym>, ...) *)
GActual, (* MODULE Foo = Baz (<sym>, <sym>, ... ) *)
Export, (* MODULE <sym>; // MODULE <sym> = // MODULE Foo EXPORTS <sym>... *)
Import, (* IMPORT <sym>, <sym>, ... *)
FromImport, (* FROM <sym> IMPORT ... *)
SymImport, (* FROM Baz IMPORT <sym>, <sym>, ... [ cb.intf = "Baz" ] *)
ImportXX, (* IMPORT <sym> AS Foo, ... *)
ImportAs, (* IMPORT Foo AS <sym>, ... [ cb.intf = "Foo" ] *)
ConstDecl, (* CONST <sym> = ... *)
VarDecl, (* VAR <sym>, <sym>, ... : Foo.T ... *)
ExceptDecl, (* EXCEPTION <sym> ... *)
ProcDecl, (* PROCEDURE <sym> (...) *)
TypeDecl, (* TYPE <sym> = ... *)
TypeUse, (* TYPE T = <sym> // PROC P (): <sym> // VAR v: <sym> ... *)
ExceptUse, (* PROC P () RAISES {<sym>, ... } *)
ProcUse, (* OVERRIDES M := <sym> ... *)
MiscUse, (* other unclassified ID or QID uses in expressions *)
Keyword, (* AND, ANY, ARRAY, AS, BEGIN, BITS, BRANDED, BY, CASE, ... *)
BuiltinOp, (* ABS, ADR, ADRSIZE, BITSIZE, BYTESIZE, CEILING, DEC, ... *)
BuiltinType, (* ADDRESS, BOOLEAN, CARDINAL, CHAR, EXTENDED, INTEGER, ... *)
BuiltinConst (* FALSE, TRUE, NIL *)
};
TYPE
CallBack = OBJECT METHODS
note_sym (READONLY sym: Id; kind: Kind; intf: TEXT): BOOLEAN := IgnoreSym;
note_qid (READONLY qid: QId; kind: Kind): BOOLEAN := IgnoreQID;
END;
QId = ARRAY OF Id;
Id = RECORD
start : CARDINAL; (* offset into "buf" *)
len : CARDINAL; (* length of the identifer *)
END;
PROCEDURE IgnoreSym (cb : CallBack;
READONLY sym : Id;
kind : Kind;
intf : TEXT): BOOLEAN;
PROCEDURE IgnoreQID (cb : CallBack;
READONLY sym : QId;
kind : Kind;): BOOLEAN;
no-op
END M3Sym.