?? clang2.atg
字號:
$C /* Generate Main Module */
COMPILER Clang2
/* CLANG level 2 pretty printer */
int level = 0;
void NewLine()
{ int i;
printf("\n");
for (i = 0; i < level; i++) printf(" ");
}
void Indent() { level++; }
void Exdent() { level--; }
void IndentNextLine() { Indent(); NewLine(); }
void ExdentNextLine() { Exdent(); NewLine(); }
void Append(char *s)
{ printf("%s", s);}
void WriteIdent()
{
char IdentName[21];
S_GetString(S_Pos, S_Len, IdentName, sizeof(IdentName) - 1);
Append(IdentName);
}
void WriteNumber()
{
char IdentName[20];
S_GetString(S_Pos, S_Len, IdentName, sizeof(IdentName) - 1);
Append(IdentName);
}
void WriteString()
{
char IdentName[80];
S_GetString(S_Pos, S_Len, IdentName, sizeof(IdentName) - 1);
Append(IdentName);
}
IGNORE CASE
CHARACTERS
letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".
lowline = "_".
octdigit = "01234567".
digit = octdigit + "89".
eol = CHR(10).
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 + -