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

📄 tl.mod

📁 一个Modula-2语言分析器
💻 MOD
字号:
IMPLEMENTATION MODULE TL;

IMPORT TasteP, Strings, Storage, SYSTEM;

VAR
  topScope: Object;    (* topmost procedure scope *)

PROCEDURE EnterScope;
  VAR
    scope: Object;
  BEGIN
    Storage.ALLOCATE(scope, SYSTEM.TSIZE(Objectnode));
    WITH scope^ DO
      name := ""; type := undef; kind := scopes; locals := NIL; nextAdr := 3
    END;
    scope^.next := topScope; topScope := scope; INC(curLevel);
  END EnterScope;

PROCEDURE LeaveScope;
  BEGIN
    topScope := topScope^.next; DEC(curLevel)
  END LeaveScope;

PROCEDURE DataSpace (): INTEGER;
  BEGIN
    RETURN topScope^.nextAdr - 3
  END DataSpace;

PROCEDURE NewObj (name: ARRAY OF CHAR; kind: INTEGER): Object;
  VAR
    obj, p: Object;
  BEGIN
    Storage.ALLOCATE(obj, SYSTEM.TSIZE(Objectnode));
    Strings.Assign(name, obj^.name); obj^.type := undef; obj^.kind := kind;
    obj^.level := curLevel;
    p := topScope^.locals;
    WHILE p # NIL DO
      IF Strings.Compare(p^.name, name) = Strings.equal THEN
        TasteP.SemError(117)
      END;
      p := p^.next
    END;
    obj^.next := topScope^.locals; topScope^.locals := obj;
    IF kind = vars THEN
      obj^.adr := topScope^.nextAdr; INC(topScope^.nextAdr)
    END;
    RETURN obj
  END NewObj;

PROCEDURE Obj(name: ARRAY OF CHAR): Object;
  VAR
    obj, scope: Object;
  BEGIN
    scope := topScope;
    WHILE scope # NIL DO
      obj := scope^.locals;
      WHILE obj # NIL DO
        IF Strings.Compare(obj^.name, name) = Strings.equal THEN RETURN obj END;
        obj := obj^.next
      END;
      scope := scope^.next
    END;
    TasteP.SemError(118); RETURN undefObj
  END Obj;

BEGIN
  topScope := NIL; curLevel := 0;
  Storage.ALLOCATE(undefObj, SYSTEM.TSIZE(Objectnode));
  WITH undefObj^ DO
    name := ""; type := undef; kind := vars;
    adr := 0; level := 0; next := NIL
  END
END TL.

⌨️ 快捷键说明

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