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

📄 taste.atg

📁 COCO類似C的編譯器
💻 ATG
字号:
/**********************************************************
**   TASTE.ATG
**   Coco/R C Taste Compiler/Interpreter Example.
**   Adapted to C++ by Frankie Arzu <farzu@uvg.edu.gt>
**      from Moessenboeck's (1990) Oberon example
**
**   May 24, 1996  Version 1.06
**   Oct 11, 1997  Version 1.07 (No change)
**   Jun 16, 1998  Version 1.08 (Minor changes)
**********************************************************/

$C /* Generate Main module */

COMPILER Taste
/* Taste compiler/interpreter */

#include <string.h>
#include "tl.h"
#include "tc.h"

typedef char Name[15];

void StringToVal (char *s, int *val)
{ int n = 0;
  while (*s) n = 10 * n + (*s++ - '0');
  *val = n;
}

/*--------------------------------------------------------------------------*/

CHARACTERS
  letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".
  digit = "0123456789".
  cr = CHR(13).
  lf = CHR(10).
  tab = CHR(9).

TOKENS
  ident  = letter {letter | digit}.
  number = digit {digit}.

IGNORE cr + lf + tab

COMMENTS FROM "(*" TO "*)" NESTED

PRODUCTIONS
  Taste
  =                                      (. Name name, progName;
                                            Object obj; .)
                                         (. tl_init(); .)
    "PROGRAM" Ident<progName> ";"        (. progStart = pc; .)
    Body
    Ident<name>                          (. if (strcmp(name, progName) != 0)
                                              SemError(119);
                                            Emit(HALTc); .)
    "." .

  Body
  =                                      (. int fix, type;
                                            Name name, name1;
                                            Object obj; .)

                                         (. EnterScope();
                                            fix = pc + 1; Emit2(JMP, 0); .)
    { "VAR"
      { Ident<name> ":"                  (. obj = NewObj(name, VARS); .)
        TypeId<&(*obj).type> ";"
      }

    | "PROCEDURE" Ident<name> ";"        (. obj = NewObj(name, PROCS);
                                            obj->adr = pc; .)
      Body
      Ident<name1>                       (. Emit(RET);
                                            if (strcmp(name, name1) != 0)
                                              SemError(119); .)
      ";"
    }
    "BEGIN"                              (. Fixup(fix); Emit2(RES, DataSpace()); .)
    StatSeq
    "END"                                (. LeaveScope(); .).

  TypeId<int *type>
  =                                      (. *type = UNDEF; .)
    ( "INTEGER"                          (. *type = INT; .)
    | "BOOLEAN"                          (. *type = BOOL; .)
    ).

  Ident<Name name>
  = ident                                (. LexName(name, sizeof(Name)-1); .).

  StatSeq = Stat {";" Stat}.

  Stat
  =                                      (. int  type;
                                            Name name;
                                            Object obj;
                                            int fix, fix2, loopstart; .)

    [ Ident<name>                        (. obj = Obj(name); .)
      ( ":" "="                          (. if (obj->kind != VARS) SemError(123); .)
        Expression<&type>                (. if (type != obj->type) SemError(121);
                                            Emit3(STO, curLevel-obj->level, obj->adr); .)
      |                                  (. if (obj->kind != PROCS) SemError(124);
                                            Emit3(CALL, curLevel-obj->level, obj->adr); .)
      )
    | "IF" Expression<&type>             (. if (type != BOOL) SemError(122);
                                            fix = pc + 1; Emit2(FJMP, 0); .)
      "THEN" StatSeq
      [ "ELSE"                           (. fix2 = pc + 1; Emit2(JMP, 0);
                                            Fixup(fix); fix = fix2; .)
  StatSeq
      ]
      "END"                              (. Fixup(fix); .)
    | "WHILE"                            (. loopstart = pc; .)
      Expression<&type>                  (. if (type != BOOL) SemError(122);
                                            fix = pc + 1; Emit2(FJMP, 0); .)
      "DO" StatSeq                       (. Emit2(JMP, loopstart); Fixup(fix); .)
      "END"
    | "READ" Ident<name>                 (. obj = Obj(name);
                                            if (obj->type != INT) SemError(120);
                                            Emit3(READ, curLevel-obj->level, obj->adr) .)
    | "WRITE" Expression<&type>          (. if (type != INT) SemError(120);
                                            Emit(WRITE); .)
    ].

  Expression<int *type>
  =                                      (. int type1, op; .)
    SimExpr<type>
    [ RelOp<&op> SimExpr<&type1>         (. if (*type != type1) SemError(121);
                                            Emit(op); *type = BOOL; .)
    ].

  SimExpr<int *type>
  =                                      (. int type1, op; .)
    Term<type>
    { AddOp<&op> Term<&type1>            (. if (*type != INT || type1 != INT) SemError(120);
                                            Emit(op); .)
    }.

  Term<int *type>
  =                                      (. int type1, op; .)
    Factor<type>
    { MulOp<&op> Factor<&type1>          (. if (*type != INT || type1 != INT) SemError(120);
                                            Emit(op); .)
    }.

  Factor<int *type>
  =                                      (. int val, n;
                                            Object obj;
                                            Name name; .)

    ( Ident<name>                        (. obj = Obj(name); *type = obj->type;
                                            if (obj->kind == VARS)
                                              Emit3(LOAD, curLevel-obj->level, obj->adr);
                                            else SemError(123); .)
    | "TRUE"                             (. Emit2(LIT, 1); *type = BOOL; .)
    | "FALSE"                            (. Emit2(LIT, 0); *type = BOOL; .)
    | number                             (. LexName(name, sizeof(name)-1);
                                            StringToVal(name, &n);
                                            Emit2(LIT, n); *type = INT .)
    | "-" Factor<type>                   (. if (*type != INT) { SemError(120); *type = INT; }
                                            Emit(NEG); .)
    ).

  MulOp<int *op>
  =                                      (. *op = -1; .)
    ( "*"                                (. *op = TIMES; .)
    | "/"                                (. *op = SLASH; .)
    ).

  AddOp<int *op>
  =                                      (. *op = -1; .)
    ( "+"                                (. *op = PLUS; .)
    | "-"                                (. *op = MINUS; .)
    ).

  RelOp<int *op>
  =                                      (. *op = -1; .)
    ( "="                                (. *op = EQU; .)
    | "<"                                (. *op = LSS; .)
    | ">"                                (. *op = GTR; .)
    ).

END Taste.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -