COMPILER Clang2 (* CLANG level 2 pretty printer *) FROM Prettier IMPORT Append, NewLine, IndentNextLine, ExdentNextLine, Indent, Exdent; PROCEDURE WriteIdent; VAR IdentName : ARRAY [0 .. 20] OF CHAR; BEGIN LexString(IdentName); Append(IdentName); END WriteIdent; PROCEDURE WriteNumber; VAR IdentName : ARRAY [0 .. 20] OF CHAR; BEGIN LexString(IdentName); Append(IdentName); END WriteNumber; PROCEDURE WriteString; VAR IdentName : ARRAY [0 .. 80] OF CHAR; BEGIN LexString(IdentName); Append(IdentName); END WriteString; IGNORE CASE CHARACTERS letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz". lowline = "_". octdigit = "01234567". digit = octdigit + "89". eol = CHR(13). noquote1 = ANY - "'" - eol. noquote2 = ANY - '"' - eol. IGNORE CHR(9) .. CHR(13) COMMENTS FROM "{" TO "}" NESTED TOKENS identifier = letter {letter | digit} . number = digit { digit} . string = "'" noquote1 {noquote1} "'" | '"' noquote2 {noquote2} '"' . PRODUCTIONS Clang2 = "PROGRAM" (. Append("PROGRAM ") .) identifier (. WriteIdent .) ";" (. Append(";"); IndentNextLine .) Block "." (. Append(".") .). Block = { ConstDeclaration | VarDeclaration | ProcDeclaration } StatementPart . ConstDeclaration = "CONST" (. Append("CONST"); IndentNextLine .) OneConst { (. NewLine .) OneConst } (. ExdentNextLine .) . OneConst = identifier (. WriteIdent .) "=" (. Append(" = ") .) number (. WriteNumber .) ";" (. Append(";") .) . VarDeclaration = "VAR" (. Append("VAR"); IndentNextLine .) OneVar { "," (. Append(", ") .) OneVar } ";" (. Append(";"); ExdentNextLine .) . OneVar = identifier (. WriteIdent .) [ "[" (. Append("[") .) number (. WriteNumber .) "]" (. Append("]") .) ] . ProcDeclaration = ( "PROCEDURE" (. NewLine; Append("PROCEDURE ") .) | "FUNCTION" (. NewLine; Append("FUNCTION ") .) ) identifier (. WriteIdent .) [ FormalParameters ] ";" (. Append(";"); IndentNextLine .) ProcBlock ";" (. Append(";"); ExdentNextLine; NewLine .) . FormalParameters = "(" (. Append(" (") .) OnePar { "," (. Append(", ") .) OnePar } ")" (. Append(")") .) . OnePar = [ "VAR" (. Append("VAR ") .) ] identifier (. WriteIdent .) . ProcBlock = "FORWARD" (. Append("FORWARD") .) | Block . StatementPart = CompoundStatement . CompoundStatement = "BEGIN" (. Append("BEGIN"); IndentNextLine .) Statement { ";" (. Append(";"); NewLine .) Statement } "END" (. ExdentNextLine; Append("END") .). Statement = [ CompoundStatement | CallOrAssignment | IfStatement | WhileStatement | ReturnStatement | WriteStatement | ReadStatement | StackDump ] . CallOrAssignment = identifier (. WriteIdent .) ( [ Subscript ] ":=" (. Append(" := ") .) Expression | [ ActualParameters ] ) . IfStatement = "IF" (. Append("IF ") .) Condition "THEN" (. IndentNextLine; Append("THEN ") .) Statement { "ELSIF" (. NewLine; Append("ELSIF ") .) Condition "THEN" (. IndentNextLine; Append("THEN ") .) Statement (. Exdent .) } [ "ELSE" (. NewLine; Append("ELSE ") .) Statement ] (. Exdent .) . WhileStatement = "WHILE" (. Append("WHILE ") .) Condition "DO" (. Append(" DO ") .) Statement . ReturnStatement = "RETURN" (. Append("RETURN ") .) [ Expression ] . WriteStatement = "WRITE" (. Append("WRITE") .) [ "(" (. Append("(") .) WriteList ")" (. Append(")") .) ] . ReadStatement = "READ" "(" (. Append("READ(") .) ReadList ")" (. Append(")") .). StackDump = "STACKDUMP" (. Append("STACKDUMP") .) . Condition = "ODD" "(" (. Append("ODD(") .) Expression ")" (. Append(")") .) | Expression RelOp Expression . Expression = [ Sign ] Term { AddOp Term } . Term = Factor { MulOp Factor } . Factor = identifier (. WriteIdent .) ( ActualParameters | Subscript | ) | number (. WriteNumber .) | "(" (. Append("(") .) Expression ")" (. Append(")") .) . ActualParameters = "(" (. Append("(") .) Expression { "," (. Append(", ") .) Expression } ")" (. Append(")") .) . WriteList = ( Expression | string (. WriteString .) ) { "," (. Append(", ") .) ( Expression | string (. WriteString .) ) } . ReadList = VarDesignator { "," (. Append(", ") .) VarDesignator } . VarDesignator = identifier (. WriteIdent .) [ Subscript ] . Subscript = "[" (. Append("[") .) Expression "]" (. Append("]") .) . Sign = AddOp . AddOp = "+" (. Append(" + ") .) | "-" (. Append(" - ") .) . MulOp = "*" (. Append(" * ") .) | "/" (. Append(" / ") .) . RelOp = "=" (. Append(" = ") .) | "<>" (. Append(" <> ") .) | "<" (. Append(" < ") .) | "<=" (. Append(" <= ") .) | ">" (. Append(" > ") .) | ">=" (. Append(" >= ") .) . END Clang2.