?? spreads.atg
字號:
COMPILER Spreadsheet
USES Machine;
(* Toy spreadsheet incorporating simple stack based interpreter - version 2
P.D. Terry, Rhodes University, 1995 *)
VAR
Row, Col : INTEGER;
MustRefresh, Okay : BOOLEAN;
IGNORE CHR(9) .. CHR(13)
IGNORE CASE
COMMENTS FROM "(*" TO "*)"
CHARACTERS
letter = "ABCDEFGHIJKLMNOPQRSabcdefghijklmnopqrs" .
digit = "0123456789" .
TOKENS
identifier = letter .
number = digit { digit} .
PRODUCTIONS
Spreadsheet = { Command } "QUIT" (. Machine.Terminate .) .
Command = (. MustRefresh := FALSE .)
[ (. Machine.InitActive .)
Expression (. Machine.Gen(Stop);
Machine.EvalActive;
MustRefresh := TRUE; .)
]
( "UP" (. Machine.Up .)
| "DOWN" (. Machine.Down .)
| "LEFT" (. Machine.Left .)
| "RIGHT" (. Machine.Right .)
| "HOME" (. Machine.Home .)
| "GOTO" Cell<Row, Col> (. Machine.MoveTo(Row, Col) .)
| "ENTER"
) (. IF MustRefresh THEN Machine.Refresh .) .
Expression = ( [ "+" ] Term
| "-" Term (. Machine.Gen(Negate) .)
)
{ "+" Term (. Machine.Gen(Add) .)
| "-" Term (. Machine.Gen(Subtract) .)
} .
Term = Factor
{ "*" Factor (. Machine.Gen(Multiply) .)
| "/" Factor (. Machine.Gen(Divide) .)
| "%" Factor (. Machine.Gen(Modulus) .)
} .
Factor (. VAR
R, C, Int, ErrCode : INTEGER;
Str : STRING;
.)
= number (. SpreadsS.GetName(SpreadsS.pos, SpreadsS.len, Str);
Val(Str, Int, ErrCode);
Machine.GenPush(Int) .)
| Cell<R, C> (. Machine.GenLoad(R, C) .)
| "(" Expression ")" .
Cell <VAR Row, Col : INTEGER>
= identifier (. Row := ORD(UpCase(SpreadsS.CharAt(SpreadsS.pos))) - ORD('A') + 1 .)
number (. Col := ORD(SpreadsS.CharAt(SpreadsS.pos)) - ORD('0') .) .
END Spreadsheet.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -