⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spreads.atg

📁 一个Pascal语言分析器
💻 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 + -