<> <> DIRECTORY Rope USING [ROPE], IO USING [STREAM]; Interscript: CEDAR DEFINITIONS IMPORTS IO = BEGIN <<-- basic Interscript items>> Id: TYPE ~ Rope.ROPE; Universal: TYPE ~ ATOM; LinkSet: TYPE ~ RECORD[sources: SpanList, targets: SpanList]; SpanList: TYPE ~ LIST OF Span; Span: TYPE ~ REF SpanRec; SpanRec: TYPE; Value: TYPE ~ REF ValueRec; ValueRec: TYPE ~ RECORD[SELECT t: * FROM nil => [], number => [SELECT numTag: * FROM int => [int: INT], real => [real: REAL] ENDCASE], string => [r: Rope.ROPE], span => [--TBD--], expr => [expr: ExprTree] ENDCASE]; ExprTree: TYPE ~ REF ExprTreeRec; ExprTreeRec: TYPE ~ RECORD[ vp: SELECT type: * FROM monadic => [op: Operator, left: ExprTree], dyadic => [op: Operator, left, right: ExprTree], terminal => [v: Value] ENDCASE]; <<-- lexical definitions>> Token: TYPE ~ REF TokenRec; TokenRec: TYPE ~ RECORD[ first, last: STREAMPosition, -- to record where a token came from vp: SELECT type: OfToken FROM id => [id: Id], univ => [univ: Universal], -- includes keywords also int => [int: INT], real => [real: REAL], string => [s: Rope.ROPE], op => [op: Operator], sep => [s: Separator], bracket => [b: Bracket], literal => [lit: Literal] ENDCASE ]; OfToken: TYPE ~ {id, univ, int, real, string, op, sep, bracket, literal}; Operator: TYPE ~ {plus, minus, times, slash}; Separator: TYPE ~ {semicolon, dot, percent, exclamation, verticalBar, localGets, globalGets, upArrow, colon}; Bracket: TYPE ~ {lParen, rParen, lBracket, rBracket, lBrace, rBrace, quote}; Literal: TYPE ~ {nil, true, false}; STREAMPosition: TYPE ~ INT; InitScan: PROCEDURE [stream: IO.STREAM, bindTbl: BTHandle, z: ZONE]; GetToken: PROCEDURE RETURNS [t: Token]; <<-- parsing>> Internalize: PROCEDURE [stream: IO.STREAM, z: ZONE]; <<-- bindings>> BTHandle: TYPE ~ REF BindingTable; BindingTable: TYPE; Binding: TYPE ~ REF BindingRec; BindingRec: TYPE ~ RECORD[id: Id, m: BindingMode, v: Value]; BindingMode: TYPE ~ {local, global} _ local; InitBindingTable: PROCEDURE [z: ZONE] RETURNS [bt: BTHandle]; AddBinding: PROCEDURE [self: BTHandle, b: Binding]; <> GetBinding: PROCEDURE [self: BTHandle, id: Id] RETURNS [binding: Binding]; <> GetBindings: PROCEDURE [self: BTHandle, ids: LIST OF Id] RETURNS [bindings: LIST OF Binding]; <> Scope: TYPE ~ RECORD[uid: INT]; NewScope: PROCEDURE [self: BTHandle] RETURNS [s: Scope]; <> PopScope: PROCEDURE [self: BTHandle, s: Scope]; <> <<-- spans>> <<>> END.