% Copyright (C) 1992, Digital Equipment Corporation % All rights reserved. % See the file COPYRIGHT for a full description. % % Last modified on Fri Aug 5 14:27:22 PDT 1994 by heydon % An LL(1) grammar for Juno to be processed by the program LLGen(1). grammar Juno terminals LitReal LitText Id Comment ";" "." "," "(" ")" "{" "}" "[" "]" ":=" "::" ":" "|" "->" "~" "=" "#" "<" ">" "<=" ">=" "+" "-" "*" "/" "&" MODULE PRIVATE END FROM IMPORT CONST VAR PRED FUNC PROC IU IS SKIP ABORT IF FI DO OD SAVE IN NIL TRUE FALSE OR AND NOT CONG PARA HOR VER E REL DIV MOD REAL TEXT PAIR INT FLOOR CEILING ROUND ABS SIN COS ATAN LN EXP CAR CDR MAX MIN productions % Compilation Unit Productions Unit = Block { Block }. Block = MODULE Id ";" | [ FROM Id ] IMPORT IDList ";" | Comment | UI UIDecl ";" | [ PRIVATE ] Decl ";". UIDecl = Id "(" [ ExprList ] ")". Decl = CONST ConstDecl | VAR VarDecl | PRED PredDecl | FUNC FuncDecl | PROC ProcDecl. ConstDecl = ConstDeclItem { "," ConstDeclItem }. ConstDeclItem = Id "=" ConstExpr. VarDecl = VarDeclItem { "," VarDeclItem }. VarDeclItem = Id [ ":=" Expr ]. PredDecl = PredHead IS Formula END. PredHead = Id "(" [ IDList ] ")". FuncDecl = FuncHead IS Constraint END. FuncHead = Id "=" Id "(" [ IDList ] ")". ProcDecl = ProcHead IS Cmd END. ProcHead = Id PH2 % OUT, INOUT, or proc name | PH4. % INOUTS PH2 = { "," Id } ":=" PH3 | PH5 | PH6. PH3 = Id (PH5 | PH6) | PH4. PH4 = "(" IDList ")" PH5. PH5 = ":" Id PH6. % INOUT PH6 = "(" [ IDList ] ")". % INS % Command Productions Cmd = Cmd2 [ "|" Cmd ]. Cmd2 = Cmd3 | QId QIdCmdTail. Cmd3 = Cmd4 | FormulaNoQId FormTail. Cmd4 = Cmd6 Cmd5. Cmd5 = [ ";" Cmd2 ]. Cmd6 = SKIP | ABORT | VAR NearVarList IN Cmd END | DO Cmd OD | IF Cmd FI | SAVE Id IN Cmd END | "{" Cmd "}". QIdCmdTail = { "," QId } QIdCT2 | FormulaQId FormTail. QIdCT2 = ":=" ExprList Cmd5. FormTail = Cmd5 % proc call | "->" Cmd2. % guard % Formula/Expression Productions Constraint = Formula. Formula = Form1 [ OR Formula ]. Form1 = Form2 [ AND Form1 ]. Form2 = Form3 | NOT Form2. Form3 = Expr [ RelationOp Expr ]. ConstExpr = Expr. Expr = Expr1 [ REL Expr1 ]. Expr1 = Expr2 [ Expr1Tail ]. Expr1Tail = AddOp Expr2 [ Expr1Tail ]. Expr2 = Expr3 [ Expr2Tail ]. Expr2Tail = MulOp Expr3 [ Expr2Tail ]. Expr3 = Expr4 | "-" Expr3. Expr4 = NIL | TRUE | FALSE | Literal | BuiltIn | QId [ QIdExprTail ] % variable or procedure call | "(" LPExprTail | "[" ExprList "]". QIdExprTail = [ ":" QId ] LPET7. LPExprTail = LPET2 | LPET3. LPET2 = E NearVarList "::" Constraint ")". LPET3 = Formula LPET4. % paren formula, pair, inouts LPET4 = ")" [ LPET6 ] % paren formula or inouts | "," Expr LPET5. % pair or inouts LPET5 = ")" [ LPET6 ] % pair or inouts | "," QIdList ")" LPET6. % inouts LPET6 = ":" QId LPET7. % procedure call LPET7 = "(" [ ExprList ] ")". RelationOp = "~" | "=" | "#" | "<" | ">" | "<=" | ">=" | CONG | PARA | HOR | VER. AddOp = "+" | "-" | "&". MulOp = "*" | "/" | DIV | MOD. BuiltIn = REAL "(" Expr ")" | TEXT "(" Expr ")" | PAIR "(" Expr ")" | INT "(" Expr ")" | FLOOR "(" Expr ")" | CEILING "(" Expr ")" | ROUND "(" Expr ")" | ABS "(" Expr ")" | SIN "(" Expr ")" | COS "(" Expr ")" | ATAN "(" Expr ")" | LN "(" Expr ")" | EXP "(" Expr ")" | CAR "(" Expr ")" | CDR "(" Expr ")" | MAX "(" Expr "," Expr ")" | MIN "(" Expr "," Expr ")". % Version of Formula that does *not* start w/ a QId FormulaNoQId = Form1NoQId [ OR Formula ]. Form1NoQId = Form2NoQId [ AND Form1 ]. Form2NoQId = Form3NoQId | NOT Form2. Form3NoQId = TRUE | FALSE | ExprNoQId RelationOp Expr. ExprNoQId = Expr1NoQId [ REL Expr1 ]. Expr1NoQId = Expr2NoQId [ Expr1Tail ]. Expr2NoQId = Expr3NoQId [ Expr2Tail ]. Expr3NoQId = Expr4NoQId | "-" Expr3. Expr4NoQId = NIL | Literal | BuiltIn | "(" LPExprTail | "[" ExprList "]". % Version of Formula that *only* starts w/ a QID FormulaQId = Form1QId [ OR Formula ]. Form1QId = Form3QId [ AND Form1 ]. Form3QId = ExprQId [ RelationOp Expr ]. ExprQId = Expr1QId [ REL Expr1 ]. Expr1QId = Expr2QId [ Expr1Tail ]. Expr2QId = Expr4QId [ Expr2Tail ]. Expr4QId = [ QIdExprTail ]. % variable or procedure call % Miscellaneous Productions ExprList = Expr { "," Expr }. QId = Id [ "." Id ]. QIdList = QId { "," QId }. NearVar = Id [ ("~" | "=") Expr ]. NearVarList = NearVar { "," NearVar }. IDList = Id { "," Id }. Literal = LitReal | LitText. end Juno