📄 pretty.atg
字号:
/**********************************************************
** PRETTY.ATG
** Coco/R C Taste Pretty Printer Example.
** Adapted to C++ by Frankie Arzu <farzu@uvg.edu.gt>
** 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 <stdio.h>
#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.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -