📄 clang2.atg
字号:
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.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -