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

📄 spreads.atg

📁 一个Modula-2语言分析器
💻 ATG
字号:
COMPILER Spreadsheet
(* Toy spreadsheet incorporating simple stack based interpreter - version 2
   P.D. Terry, Rhodes University, 1995 *)

IMPORT Machine;
FROM Machine IMPORT
  Push, Load, Negate, Add, Subtract, Multiply, Divide, Modulus, Halt;

VAR
  Row, Col : INTEGER;
  MustRefresh, Okay : BOOLEAN;

PROCEDURE StrToInt (S : ARRAY OF CHAR; VAR Int : INTEGER);
  VAR
    I : INTEGER;
  BEGIN
    Int := 0; I := 0;
    WHILE S[I] # 0C DO
      Int := 10 * Int + VAL(INTEGER, ORD(S[I]) - ORD("0")); INC(I)
    END;
  END StrToInt;

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(Halt);
                                                   Machine.EvalActive;
                                                   MustRefresh := TRUE; .)
                ]
                (   "UP"                        (. Machine.Up .)
                  | "DOWN"                      (. Machine.Down .)
                  | "LEFT"                      (. Machine.Left .)
                  | "RIGHT"                     (. Machine.Right .)
                  | "HOME"                      (. Machine.Home .)
                  | "GOTO" Cell<Row, Col>       (. Machine.GoTo(Row, Col) .)
                  | "ENTER"
                 )                              (. IF MustRefresh THEN Machine.Refresh END; .) .

  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 : INTEGER;
                       String : ARRAY [0 .. 100] OF CHAR;
                   .)

               =  number                        (. LexName(String);
                                                   StrToInt(String, Int);
                                                   Machine.GenPush(Int) .)
                | Cell<R, C>                    (. Machine.GenLoad(R, C) .)
                | "(" Expression ")" .

  Cell <VAR Row, Col : INTEGER>
              = identifier                      (. Row := ORD(CAP(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 + -