/********************************************************** ** PRETTY.ATG ** Coco/R C Taste Pretty Printer Example. ** Adapted to C++ by Frankie Arzu ** from Moessenboeck's (1990) Oberon example ** ** May 24, 1996 Version 1.06 ** Oct 11, 1997 Version 1.07 (No change) ** Mar 31, 1998 Version 1.08 (No change) **********************************************************/ $C /* Generate main module */ COMPILER Pretty /* Taste pretty printer */ #include #include "prettypr.h" #include "prettys.h" void WriteIdent() { char IdentName[20]; LexString(IdentName, sizeof(IdentName)-1); Append(IdentName); } void WriteNumber() { char IdentName[20]; LexString(IdentName, sizeof(IdentName)-1); Append(IdentName); } /*--------------------------------------------------------------------------*/ CHARACTERS letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz". digit = "0123456789". cr = CHR(13). lf = CHR(10). tab = CHR(9). TOKENS ident = letter {letter | digit}. number = digit {digit}. IGNORE cr + lf + tab COMMENTS FROM "(*" TO "*)" NESTED PRODUCTIONS Pretty = "PROGRAM" (. Append("PROGRAM "); .) Ident ";" (. Append(";"); IndentNextLine(); .) Body Ident "." (. Append("."); .) . Body = { "VAR" (. Append("VAR"); IndentNextLine(); .) { Ident ":" (. Append(" : "); .) TypeId ";" (. Append(";"); NewLine(); .) } (. ExdentNextLine(); .) | "PROCEDURE" (. NewLine(); Append("PROCEDURE "); .) Ident ";" (. Append(";"); IndentNextLine(); .) Body Ident ";" (. Append(";"); ExdentNextLine(); NewLine(); .) } "BEGIN" (. Append("BEGIN"); .) StatSeq "END" (. Append("END "); .) . TypeId = "INTEGER" (. Append("INTEGER"); .) | "BOOLEAN" (. Append("BOOLEAN"); .) . Ident = ident (. WriteIdent(); .) . StatSeq = (. IndentNextLine(); .) Stat {";" (. Append(";"); NewLine(); .) Stat} (. ExdentNextLine(); .) . Stat = [ Ident ( ":=" (. Append(" := "); .) Expression | ) | "IF" (. Append("IF "); .) Expression "THEN" (. Append(" THEN "); .) StatSeq [ "ELSE" (. Append("ELSE "); .) StatSeq ] "END" (. Append("END"); .) | "WHILE" (. Append("WHILE "); .) Expression "DO" (. Append(" DO"); .) StatSeq "END" (. Append("END"); .) | "READ" (. Append("READ "); .) Ident | "WRITE" (. Append("WRITE "); .) Expression ] . Expression = SimExpr [ RelOp SimExpr ] . SimExpr = Term { AddOp Term } . Term = Factor { MulOp Factor } . Factor = ( Ident | "TRUE" (. Append("TRUE "); .) | "FALSE" (. Append("FALSE "); .) | number (. WriteNumber(); .) | "-" (. Append(" - "); .) Factor ) . MulOp = "*" (. Append(" * "); .) | "/" (. Append(" / "); .) . AddOp = "+" (. Append(" + "); .) | "-" (. Append(" - "); .) . RelOp = "=" (. Append(" = "); .) | "<" (. Append(" < "); .) | ">" (. Append(" > "); .) . END Pretty.