expr.atg
来自「一个Modula-2语言分析器」· ATG 代码 · 共 48 行
ATG
48 行
COMPILER Expr
(* Simple four-function calculator - FileIO library required *)
PROCEDURE GetNumber (VAR Int : INTEGER);
(* Convert latest token to integer value Int *)
VAR
I : CARDINAL;
String : ARRAY [0 .. 20] OF CHAR;
BEGIN
ExprS.GetString(ExprS.pos, ExprS.len, String);
I := 0; Int := 0;
WHILE String[I] # 0C DO
Int := 10 * Int + VAL(INTEGER, ORD(String[I]) - ORD('0')); INC(I)
END;
END GetNumber;
IGNORE CHR(1) .. CHR(15)
CHARACTERS
digit = "0123456789" .
TOKENS
num = digit {digit} .
PRODUCTIONS
Expr (. VAR r: INTEGER; .)
= Expression <r> "=" (. IF Successful() THEN
FileIO.WriteInt(FileIO.con, r, 4)
END .) .
Expression <VAR e: INTEGER> (. VAR t: INTEGER; .)
= Term <e>
{ '+' Term <t> (. e := e + t .)
| '-' Term <t> (. e := e - t .)
}.
Term <VAR t: INTEGER> (. VAR f: INTEGER; .)
= Factor <t>
{ '*' Factor <f> (. t := t * f .)
| '/' Factor <f> (. t := t DIV f .)
}.
Factor <VAR f: INTEGER> =
num (. GetNumber(f) .)
| '(' Expression <f> ')'.
END Expr.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?