DIRECTORY Rope, Lexer, Parser, OldUnparser, OldParseWindow, OldJunoParserEtc, HerculesAlgebra USING [Se, leftPren, colon, semicolon, comma, assign, approx, minus, rightarrow, suchthat, equals, paint, ends, width], IO, ViewerTools, ViewerClasses, Atom, List USING [Memb]; HerculesParserEtcImpl: PROGRAM IMPORTS ViewerTools, OldParseWindow, Atom EXPORTS OldJunoParserEtc = BEGIN OPEN OldJunoParserEtc, Pw: OldParseWindow, Alg: HerculesAlgebra; junoA: PUBLIC Pw.Handle; SetUpParser: PUBLIC PROC[fileName:Rope.ROPE] = BEGIN junoA _ Pw.NewHandle[ViewerTools.MakeNewTextViewer[ [file: fileName, name: fileName, iconic: FALSE, column: right]]]; junoA.WellFormed _ Definition; END; Parse: PUBLIC PROC = {Pw.ParseViewer[junoA]}; Se: TYPE = Alg.Se; -- Symbolic Expression Sp: TYPE = Pw.SyntacticPredicate; Definition: Sp = {RETURN [Pw.HasForm[f, colon, Template, Command]]}; Template: Sp = {RETURN [Pw.HasForm[f, leftPren, Var, VarList]]}; VarList: Sp = {RETURN [Pw.Or[Var[f], Pw.HasForm[f, comma, Var, VarList]]]}; Var: Sp = {IF ISTYPE[NARROW[Car[NARROW[f]], REF ANY], ATOM] THEN RETURN [[Yes, NIL]] ELSE RETURN [[OfCourseNot, f]]}; Command: Sp = {RETURN [ Pw.Or[AtomicCommand[f], Pw.Or[Alternation[f], Pw.Or[Iteration[f], Pw.Or[PushState[f], Composition[f]]]]]]}; AtomicCommand: Sp = {RETURN [Pw.Or[Call[f], Assignment[f]]]}; Call: Sp = {RETURN [Pw.Or [Pw.HasForm[f, leftPren, PrefixOp, Expr], PrefixCall[f]]]}; PrefixCall: Sp = {RETURN [ISTYPE [Car[f], LIST OF Se] AND PrefixOp [Car [Car[Se]] AND [Pw.HasForm[f, leftPren, PrefixOp, Expr], PrefixCall[f]]]}; PrefixOp: Sp = {RETURN [Pw.Or[Var[f], LambdaExpr[f]]]}; LambdaExpr: Sp = {RETURN [FALSE]}; -- will be Pw.HasForm[f, colon, Parms, Expr] Expr: Sp = {RETURN [Pw.Or[Var[f], Pw.Or[Literal[f], Pw.Or[Call[f], InfixExpr[f]]]]]}; InfixExpr: Sp = {RETURN [Pw.HasForm[f, InfixOp, Args, Args]]}; --- OOOPS - types! infixOps: LIST = LIST [Alg.plus, Alg.minus, Alg.times, Alg.slash, Alg.div, Alg.mod, Alg.comma, Alg.semicolon, Alg.equals, Alg.paint, Alg.ends, Alg.width]; InfixOp: Sp = {RETURN [List.Memb[Car[f], infixOps]]}; Literal: Sp = {RETURN [Pw.Or[RopeLiteral[f], NumLiteral[f]]]}; RopeLiteral: Sp = {IF ISTYPE[Car[f], Rope.ROPE] THEN RETURN [[Yes, NIL]] ELSE RETURN [[OfCourseNot, f]]}; NumLiteral: Sp = {IF ISTYPE[Car[f], REF INT] OR ISTYPE[Car[f], REF REAL] THEN RETURN [[Yes, NIL]] ELSE RETURN [[OfCourseNot, f]]}; NumExpr: Sp = {RETURN [Pw.Or[NumLiteral[f], Pw.Or[Var[f], -- evaluating to a number Pw.Or[Call[f], -- returning a number InfixExpr[f]]]]]}; CoordsExpr: Sp = {RETURN [Pw.Or[NumPairExpr[f], Pw.HasForm[f, Alg.rel, NumExpr, FrameExpr]]]]}; CoordExpr: Sp = {RETURN [Pw.Or[Var[f], -- evaluating to either a point or a real pair Pw.Or[NumPairExpr[f], Pw.HasForm[f, Alg.rel, NumPairExpr, FrameExpr]]]]}; Num: Sp = {RETURN [Pw.Or[Num2[f], Pw.HasForm[f, minus, Num2, NIL]]]}; Assignment: Sp = {aw: Pw.VerdictAndCulprit _ Pw.HasForm[f, assign, VarList, VarList]; IF aw.verdict = Yes AND InfixLength[Cadr[NARROW[Car[NARROW[f]]]]] # InfixLength[Caddr[NARROW[Car[NARROW[f]]]]] THEN RETURN [[No, f]] ELSE RETURN [aw]}; ThreeVars: Sp = {RETURN [Pw.HasForm[f, comma, Var, TwoVars]]}; TwoVars: Sp = {RETURN[Pw.HasForm[f, comma, Var, Var]]}; Alternation: Sp = {RETURN[Pw.HasForm[f, $if, Gcl, NIL]]}; Iteration: Sp = {RETURN[Pw.HasForm[f, $do, Gcl, NIL]]}; PushState: Sp = {RETURN[ Pw.Or[Pw.HasForm[f, $width, TwoVars, Command], Pw.Or[Pw.HasForm[f, $width, PrenTwoVars, Command], Pw.Or[Pw.HasForm[f, $width, Num, Command], Pw.Or[Pw.HasForm[f, $paint, Var, Command], Pw.Or[Pw.HasForm[f, $paint, PrenNumTriple, Command], Pw.HasForm[f, $ends, Var, Command]]]]]]]}; PrenNumTriple: Sp = {RETURN [Pw.HasForm[f, leftPren, NumTriple, NIL]]}; NumTriple: Sp = {RETURN [Pw.HasForm[f, comma, Num, NumPair]]}; Gcl: Sp = GuardedCommand; GuardedCommand: Sp = {RETURN[Pw.HasForm[f, rightarrow, Predicate, Command]]}; Predicate: Sp = {RETURN[Pw.HasForm[f, suchthat, LocalList, CList]]}; LocalList: Sp = {RETURN[Pw.Or[Local[f], Pw.HasForm[f, comma, Local, LocalList]]]}; Local: Sp = {RETURN[Pw.Or[Var[f], Pw.HasForm[f, approx, Var, HintCoords]]]}; HintCoords: Sp = {RETURN [Pw.Or[PrenNumPair[f], Pw.HasForm[f, $rel, PrenNumPair, PrenFrame]]]}; PrenNumPair: Sp = {RETURN [Pw.HasForm[f, leftPren, NumPair, NIL]]}; NumPair: Sp = {RETURN [Pw.HasForm[f, comma, Num, Num]]}; PrenFrame: Sp = {RETURN[Pw.HasForm[f, leftPren, Frame, NIL]]}; Frame: Sp = {RETURN[Pw.Or[Var[f], Pw.Or[TwoVars[f], ThreeVars[f]]]]}; CList: Sp = {RETURN[Pw.Or[Constraint[f], Pw.HasForm[f, $and, Constraint, CList]]]}; Constraint: Sp = -- new [JS] {RETURN[Pw.Or[NakedConstraint[f], Pw.HasForm[f, $rel, RelConstraint, PrenFrame]]]}; NakedConstraint: Sp = -- old Constraint [JS] {RETURN[ Pw.Or[LitTrue[f], Pw.Or[Para[f], Pw.Or[Ver[f], Pw.Or[Hor[f], RelConstraint[f]]]]]]}; RelConstraint: Sp = -- A constraint that can be relativized - new [JS] {RETURN[ Pw.Or[Cong[f], Pw.Or[Perp[f], Equal[f]]]]}; LitTrue: Sp = {IF Car[NARROW[f]] = $T THEN RETURN [[Yes, NIL]] ELSE RETURN [[OfCourseNot, f]]}; Cong: Sp = {RETURN[Pw.HasForm[f, $cong, PrenTwoVars, PrenTwoVars]]}; Para: Sp = {RETURN[Pw.HasForm[f, $para, PrenTwoVars, PrenTwoVars]]}; Perp: Sp = {RETURN[Pw.HasForm[f, $perp, PrenTwoVars, PrenTwoVars]]}; Equal: Sp = {RETURN[Pw.HasForm[f, equals, Var, PrenNumPair]]}; Hor: Sp = {RETURN[Pw.HasForm[f, $hor, PrenTwoVars, NIL]]}; Ver: Sp = {RETURN[Pw.HasForm[f, $ver, PrenTwoVars, NIL]]}; PrenThreeVars: Sp = {RETURN[Pw.HasForm[f, leftPren, ThreeVars, NIL]]}; PrenTwoVars: Sp = {RETURN[Pw.HasForm[f, leftPren, TwoVars, NIL]]}; Composition: Sp = {RETURN[Pw.HasForm[f, semicolon, Command, Command]]}; InfixLength: PROC[l: Se] RETURNS [INT] = {IF ISTYPE[NARROW[l, REF ANY], ATOM] THEN RETURN[1] ELSE RETURN[1 + InfixLength[Caddr[NARROW[l]]]]}; WellFormed: PUBLIC PROC [f: Se] RETURNS [Pw.VerdictAndCulprit] = {RETURN[Definition[f]]}; Car: PROC [r: Se] RETURNS [Se] = {RETURN[NARROW[r, LIST OF REF ANY].first]}; Cdr: PROC [r: Se] RETURNS [Se] = {RETURN[NARROW[r, LIST OF REF ANY].rest]}; Cadr: PROC [r: Se] RETURNS [Se] = {RETURN[Car[Cdr[r]]]}; Caddr: PROC [r: Se] RETURNS [Se] = {RETURN[Car[Cdr[Cdr[r]]]]}; Cddr: PROC [r: Se] RETURNS [Se] = {RETURN[Cdr[Cdr[r]]]}; Caar: PROC [r: Se] RETURNS [Se] = {RETURN[Car[Car[r]]]}; Cadar: PROC [l: Se] RETURNS [Se] = { RETURN[ Car[ Cdr[ Car[ l ] ] ] ] }; Caddar: PROC [l: Se] RETURNS [Se] = { RETURN[ Car[ Cdr[ Cdr[ Car[ l ] ] ] ] ] }; Cadddar: PROC [l: Se] RETURNS [Se] = { RETURN[ Car[ Cdr[ Cdr[ Cdr[ Car[ l ] ] ] ] ] ] }; Cadddr: PROC [l: Se] RETURNS [Se] = { RETURN[ Car[ Cdr[ Cdr[ Cdr[ l ] ] ] ] ] }; Caddddar: PROC [l: Se] RETURNS [Se] = { RETURN[ Car[ Cdr[ Cdr[ Cdr[ Cdr[ Car[ l ] ] ] ] ] ] ] }; Cddar: PROC [l: Se] RETURNS [Se] = { RETURN[ Cdr[ Cdr[ Car[ l ] ] ] ] }; END. ŠHerculesParserEtcImpl.mesa (ex OldJunoParserEtcImpl) This module defines the syntax of the Juno language (Hercules variant). Additional restrioctions are imposed by the evaluator and constraint solver modules. Last Edited by: Gnelson, January 19, 1984 1:35 pm To do: Alg.Apply, Alg.Eval: check form of values (February 14, 1984 2:13 am) To do: Add >, < predicates to HerculesAlgebra (February 14, 1984 2:13 am) To do: Finish changes!!! (February 14, 1984 2:13 am) To do: Fix Body.* and Alg.* to match new priorities of $rel, $==, $= (February 14, 1984 2:13 am) Last Edited by: Stolfi, February 15, 1984 4:44 am Edited on January 26, 1984 5:20 pm, by Stolfi -- Added perpendicular constraint -- Added relativized constraints -- Added = (eq) constraint -- Added (n,n,n) paint option -- Allowed syntactic variannt (v, v) width as equivalent to v,v width changes to: Algebra (added perp, equals; changed binding powers to allow relativized constraints), equal (new), Constraint (allowed relativization), NakedConstraint (new: old Constraint plus perp and =), PushState (added (n,n,n) paint; allowed (v,v) width as an alternative to v,v width), PrenNumTriple (new), NumTriple (new), RelPoint (old Rel), PrenNumPair (old NumPair), NumPair (old NumPair2), PrenFrame (old RelList), Frame (old RelList2), Edited on January 28, 1984 2:06 am, by Stolfi -- Restricted relativizable constraints to cong, perp and $= -- Restored binding power of $== to 6, so that local declarations return to the form ($== ($rel )) instead of ($rel ($== ) ) -- Fixed syntax to accept absolute hints: p == (0, 1) (without reference frame) changes to: T (renamed LitTrue), Local (accepts Hint without $rel), NakedConstraint (either $para, $ver, $hor, $T, or RelConstraint), RelConstraint (matched $perp, $= and $cong constraints), Algebra (priority of $rel), Local, HintCoords (changed syntax) Edited on February 10, 1984 6:57 am, by Stolfi -- Renamed HerculesParserEtcImpl Edited on February 14, 1984 0:50 am, by Stolfi changes to: Algebra (added +, *, /, div, mod), Application (accepts Function(ArgList) instead of Var(Varlist) ), ArgList, Arg (new) ʘJšœ5™5JšœH™HJšœU™UJšœ2™2JšÏbœG™MJšœD™JJšœ/™5Jšœ[™aJšœ2™2JšÏk œcžœzžœ1žœ ˜¬Jšœžœžœ+žœ˜tJšžœ˜JšžœC˜GJšœžœ ˜šÏn œžœžœžœ˜/Jšžœgžœ8žœ˜®—JšŸœžœžœ˜.Jšœžœ Ïc˜+Jšœžœ˜"Jšœžœ-˜EJšœžœ+˜AJšœžœ7˜LJšœ žœžœžœžœžœžœžœžœžœžœžœžœ˜Jšœžœ˜–Jšœžœ#˜>Jšœ žœK˜]Jšœžœ„˜œJšœžœ"˜8Jšœžœžœ -˜PJšœ žœc˜uJšœžœ;˜RJšœ žœžœ†˜›Jšœžœ$˜9Jšœžœ=˜RJšœžœžœžœžœžœžœžœžœ˜ŒJšœžœžœ žœžœžœžœ žœžœžœžœžœžœžœ˜¥Jšœžœ‰˜žJ˜JšœžœU˜mJšœžœ™˜°Jšœ žœ,žœ˜FJšœ]žœžœžœžœ)žœžœžœžœžœžœ˜¤Jšœžœ(˜?Jšœžœ#˜8Jšœžœžœ˜:Jšœžœžœ˜8šœ˜Jšœžœ¹˜À—šœ˜Jšœžœ-˜4—šœ˜Jšœžœ(˜/—J˜Jšœžœ2˜NJšœžœ.˜EJšœžœ<˜SJšœ žœ:˜MJšœžœW˜oJšœžœ#žœ˜DJšœžœ$˜9Jšœžœ žœ˜?Jšœ žœ3˜FJšœ žœA˜Tšœ˜JšœžœX˜_—šœ ˜.Jšœžœ< œ6˜z—šœ 3˜HJšœžœ' œ˜I—Jšœžœžœžœžœžœ žœžœ˜tJšœ žœ3˜EJšœ žœ3˜EJšœ žœ3˜EJšœ žœ,˜?Jšœ žœ"žœ˜;Jšœ žœ"žœ˜;Jšœžœ$žœ˜GJšœžœ"žœ˜CJšœžœ/˜HJšŸ œžœžœžœžœžœžœžœžœžœžœžœžœžœžœ ˜˜Jš Ÿ œžœžœ žœ žœ˜_JšŸœžœ žœ žœžœžœžœžœžœ ˜MJšŸœžœ žœ žœžœžœžœžœžœ ˜LJšŸœžœ žœ žœ˜9JšŸœžœ žœ žœ˜?JšŸœžœ žœ žœ˜9JšŸœžœ žœ žœ˜9JšŸœžœ žœ žœ˜IJšŸœžœ žœ žœ'˜SJšŸœžœ žœ žœ-˜ZJšŸœžœ žœ žœ&˜RJšŸœžœ žœ žœ5˜cJšŸœžœ žœ žœ˜JJšžœ˜™-JšœgÏr œ&¡ œ¡ ™ÁJš'œ ¡œN¡œ¡ œ¡œ&¡ œ¡ œ ¡ œ¡ œ¡œ¡ œ¡ œ¡œ¡ œ¡œ¡œ¡ œ¡œ¡œ¡œ™¼—J™™-Jšœ+¡œ¡œ¡™