📄 pretty.atg
字号:
COMPILER Pretty
(* Taste pretty printer *)
FROM Prettier IMPORT
Append, NewLine, IndentNextLine, ExdentNextLine, Indent, Exdent;
PROCEDURE WriteIdent;
VAR
IdentName : ARRAY [0 .. 20] OF CHAR;
BEGIN
PrettyS.GetString(PrettyS.pos, PrettyS.len, IdentName);
Append(IdentName);
END WriteIdent;
PROCEDURE WriteNumber;
VAR
IdentName : ARRAY [0 .. 20] OF CHAR;
BEGIN
PrettyS.GetString(PrettyS.pos, PrettyS.len, IdentName);
Append(IdentName);
END WriteNumber;
(*--------------------------------------------------------------------------*)
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.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -