(* Puff- an interpreted language *) (* See the copyright notice at the end of this file. *) (* Syntax EXPR = EXPR9 EXPRb = EXPRa (";" EXPRa)* EXPRa = EXPR9 "|" EXPR9 EXPR9 = EXPR8 ("," EXPR8)* EXPR8 = EXPR7 ("->" EXPR7)? | ID ":" EXPR7 EXPR7 = ("+" | "-" | ".")? EXPR6 ("or" EXPR6)? EXPR6 = EXPR5 ("and" EXPR5)? EXPR5 = ("not")* EXPR4 EXPR4 = EXPR3 (("="|"<"|">"|">="|"<="|"<>") EXPR3)? EXPR3 = ("+"|"-"|"&")? EXPR2 (("+"|"-"|"&") EXPR2)* EXPR2 = ("*"|"/")? EXPR1 (("*"|"/") EXPR1)* EXPR1 = EXPR0 EXPR0 = "(" EXPR ")" | CONST | CALL | COND | LET CONST = '"'STRING'"' | DIGIT+('"'CHARS'"')? CALL = EXPR (EXPR)* ID = LETTER(("_")?(DIGIT|LETTER))* COND = ("select" EXPR)? "if" ((EXPR|"else") "->" EXPR)* "fi" LET = "let" ID ("(" ID ("," ID)* (",")?)? "=" EXPR "end" Comments start from "#" and extend to end-of-line *) TYPE Valu = PuffValu.T; Sign = [-1..+1]; Source = REF RECORD name: TEXT; rd: Rd.T; lin: CARDINAL; col: CARDINAL; rest: Source; END; Context = REF RECORD arg: Valu; img: Valu; rest: Context; END; PROCEDURE ParseExprb() = BEGIN LOOP v := ParseExpra(); SkipBlanks(); IF NOT NextTokenIs(";") THEN RETURN v END; IF NoMoreExpr() THEN RETURN NIL END END END ParseExprb PROCEDURE Equal(a, b: Valu): BOOLEAN = BEGIN TYPECASE a OF TEXT(a) -> TYPECASE b OF TEXT(b) -> RETURN Text.Compare(a,b) ELSE RETURN FALSE END; Context(a) -> Pair(a) -> List(a) -> END~ END~ PROCEDURE Lookup(arg: Valu; ctx: REF Context) = BEGIN END~