| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- 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.
|