📄 clang2.atg
字号:
COMPILER Clang2
USES PrettyPrinter;
(* CLANG level 2 pretty printer *)
PROCEDURE WriteIdent;
VAR
IdentName : String;
BEGIN
Clang2S.GetString(Clang2S.pos, Clang2S.len, IdentName);
Append(IdentName);
END;
PROCEDURE WriteNumber;
VAR
IdentName : String;
BEGIN
Clang2S.GetString(Clang2S.pos, Clang2S.len, IdentName);
Append(IdentName);
END;
PROCEDURE WriteString;
VAR
IdentName : String;
BEGIN
Clang2S.GetString(Clang2S.pos, Clang2S.len, 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 + -