?? pretty.atg
字號:
COMPILER Pretty
USES Prettier;
(* Taste pretty printer *)
PROCEDURE WriteIdent;
VAR
IdentName : STRING;
BEGIN
PrettyS.GetString(PrettyS.pos, PrettyS.len, IdentName);
Append(IdentName);
END;
PROCEDURE WriteNumber;
VAR
IdentName : STRING;
BEGIN
PrettyS.GetString(PrettyS.pos, PrettyS.len, IdentName);
Append(IdentName);
END;
(*--------------------------------------------------------------------------*)
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 + -