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

📄 spreads.atg

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

IMPORT Machine, FileIO;
FROM Machine IMPORT
  Push, Load, Negate, Add, Subtract, Multiply, Divide, Modulus, Halt;
VAR
  Row : Machine.ROWS;
  Col : Machine.COLUMNS;
  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 =                                 (. Row := 1; Col := 1 .)
                { Command } "QUIT"              (. Machine.GotoXY(0, 23) .).

  Command     =                                 (. MustRefresh := FALSE .)
                [                               (. Machine.InitializeCode(Row, Col) .)
                  Expression                    (. Machine.AddCode(Row, Col, Halt);
                                                   Machine.Evaluate(Row, Col, Okay);
                                                   MustRefresh := TRUE; .)
                ]
                (   "UP"                        (. IF Row > 1 THEN DEC(Row) END .)
                  | "DOWN"                      (. IF Row < Machine.MaxRows THEN INC(Row) END .)
                  | "LEFT"                      (. IF Col > 1 THEN DEC(Col) END .)
                  | "RIGHT"                     (. IF Col < Machine.MaxCols THEN INC(Col) END .)
                  | "HOME"                      (. Row := 1; Col := 1 .)
                  | "GOTO" Cell<Row, Col>
                  | "ENTER"
                 )                              (. IF MustRefresh THEN Machine.Refresh END;
                                                   FileIO.ReadLn(FileIO.con) .) .

  Expression  = ( [ "+" ] Term
                  | "-" Term                    (. Machine.AddCode(Row, Col, Negate) .)
                )
                {   "+" Term                    (. Machine.AddCode(Row, Col, Add) .)
                  | "-" Term                    (. Machine.AddCode(Row, Col, Subtract) .)
                } .

  Term        = Factor
                {   "*" Factor                  (. Machine.AddCode(Row, Col, Multiply) .)
                  | "/" Factor                  (. Machine.AddCode(Row, Col, Divide) .)
                  | "%" Factor                  (. Machine.AddCode(Row, Col, Modulus) .)
                } .

  Factor          (. VAR
                       R : Machine.ROWS;
                       C : Machine.COLUMNS;
                       String : ARRAY [0 .. 100] OF CHAR;
                       Int : INTEGER;
                   .)

               =  number                        (. LexName(String);
                                                   StrToInt(String, Int);
                                                   Machine.AddCode(Row, Col, Push);
                                                   Machine.AddCode(Row, Col, Int) .)
                | Cell<R, C>                    (. Machine.AddCode(Row, Col, Load);
                                                   Machine.AddCode(Row, Col, R);
                                                   Machine.AddCode(Row, Col, C) .)
                | "(" Expression ")" .

  Cell <VAR Row : Machine.ROWS; VAR Col : Machine.COLUMNS>
              = 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 + -