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

📄 cr.atg

📁 一个Modula-2语言分析器
💻 ATG
📖 第 1 页 / 共 2 页
字号:
  [ ".." SingleChar <n2>      (. FOR i := n1 TO n2 DO Sets.Incl(set, i) END .)
  ]
| "ANY"                       (. Sets.Fill(set) .)
.

(*----------------------------------------------------------------------------*)

SingleChar <VAR n: CARDINAL>  (. VAR
                                   i: CARDINAL;
                                   s: ARRAY [0 .. 127] OF CHAR; .)
  =
    "CHR" "(" number          (. CRS.GetName(CRS.pos, CRS.len, s);
                                 n := 0; i := 0;
                                 WHILE s[i] # 0C DO
                                   n := 10 * n + ORD(s[i]) - ORD("0"); INC(i)
                                 END;
                                 IF n > 255 THEN SemError(118); n := n MOD 256 END;
                                 IF CRT.ignoreCase THEN n := ORD(CAP(CHR(n))) END .)
     ")" .

(*----------------------------------------------------------------------------*)

TokenDecl <typ: INTEGER>      (. VAR
                                   kind:       INTEGER;
                                   name:       CRT.Name;
                                   pos:        CRT.Position;
                                   sp, gL, gR: INTEGER;
                                   sn:         CRT.SymbolNode; .)
= Symbol <name, kind>         (. IF CRT.FindSym(name) # CRT.noSym THEN SemError(107)
                                 ELSE
                                   sp := CRT.NewSym(typ, name, CRS.line);
                                   CRT.GetSym(sp, sn); sn.struct := CRT.classToken;
                                   CRT.PutSym(sp, sn)
                                 END .)
  SYNC
  ( "="
    TokenExpr <gL, gR>        (. IF kind # ident THEN SemError(113) END;
                                 CRT.CompleteGraph(gR);
                                 CRA.ConvertToStates(gL, sp) .)
    "."
  |                           (. IF kind = ident THEN CRT.genScanner := FALSE
                                   ELSE MatchLiteral(sp)
                                 END .)
  )
  [ SemText <pos>             (. IF typ = CRT.t THEN SemError(114) END;
                                 CRT.GetSym(sp, sn); sn.semPos := pos;
                                 CRT.PutSym(sp, sn) .)
  ].

(*----------------------------------------------------------------------------*)

Expression <VAR gL, gR: INTEGER>
                              (. VAR
                                   gL2, gR2: INTEGER;
                                   first:    BOOLEAN; .)
= Term <gL, gR>               (. first := TRUE .)
  { WEAK "|"
    Term <gL2, gR2>           (. IF first THEN
                                   CRT.MakeFirstAlt(gL, gR); first := FALSE
                                 END;
                                 CRT.ConcatAlt(gL, gR, gL2, gR2) .)
  }
.

(*----------------------------------------------------------------------------*)

Term<VAR gL, gR: INTEGER>     (. VAR
                                   gL2, gR2: INTEGER; .)
=                             (. gL := 0; gR := 0 .)
( Factor <gL, gR>
    { Factor <gL2, gR2>       (. CRT.ConcatSeq(gL, gR, gL2, gR2) .)
    }
  |                           (. gL := CRT.NewNode(CRT.eps, 0, 0); gR := gL .)
  ).

(*----------------------------------------------------------------------------*)

Factor <VAR gL, gR: INTEGER>  (. VAR
                                   sp, kind:    INTEGER;
                                   name:        CRT.Name;
                                   gn:          CRT.GraphNode;
                                   sn:          CRT.SymbolNode;
                                   set:         CRT.Set;
                                   undef, weak: BOOLEAN;
                                   pos:         CRT.Position; .)
=                             (. gL :=0; gR := 0; weak := FALSE .)
( [ "WEAK"                    (. weak := TRUE .)
  ]
  Symbol <name, kind>         (. sp := CRT.FindSym(name); undef := sp = CRT.noSym;
                                 IF undef THEN
                                   IF kind = ident THEN  (* forward nt *)
                                     sp := CRT.NewSym(CRT.nt, name, 0)
                                   ELSIF CRT.genScanner THEN
                                     sp := CRT.NewSym(CRT.t, name, CRS.line);
                                     MatchLiteral(sp)
                                   ELSE (* undefined string in production *)
                                     SemError(106); sp := 0
                                   END
                                 END;
                                 CRT.GetSym(sp, sn);
                                 IF (sn.typ # CRT.t) & (sn.typ # CRT.nt) THEN SemError(104) END;
                                 IF weak THEN
                                   IF sn.typ = CRT.t THEN sn.typ := CRT.wt
                                   ELSE SemError(123)
                                   END
                                 END;
                                 gL := CRT.NewNode(sn.typ, sp, CRS.line); gR := gL .)
  ( Attribs <pos>             (. CRT.GetNode(gL, gn); gn.pos := pos;
                                 CRT.PutNode(gL, gn);
                                 CRT.GetSym(sp, sn);
                                 IF sn.typ # CRT.nt THEN SemError(103) END;
                                 IF undef THEN
                                   sn.attrPos := pos; CRT.PutSym(sp, sn)
                                 ELSIF sn.attrPos.beg < FileIO.Long0 THEN SemError(105)
                                 END .)
  |                           (. CRT.GetSym(sp, sn);
                                 IF sn.attrPos.beg >= FileIO.Long0 THEN SemError(105) END .)
  )
| "(" Expression <gL, gR> ")"
| "[" Expression <gL, gR> "]" (. CRT.MakeOption(gL, gR) .)
| "{" Expression <gL, gR> "}" (. CRT.MakeIteration(gL, gR) .)

| SemText <pos>               (. gL := CRT.NewNode(CRT.sem, 0, 0); gR := gL;
                                 CRT.GetNode(gL, gn);
                                 gn.pos := pos;
                                 CRT.PutNode(gL, gn) .)
| "ANY"                       (. Sets.Fill(set); Sets.Excl(set, CRT.eofSy);
                                 gL := CRT.NewNode(CRT.any, CRT.NewSet(set), 0); gR := gL .)
| "SYNC"                      (. gL := CRT.NewNode(CRT.sync, 0, 0); gR := gL .)
).

(*----------------------------------------------------------------------------*)

TokenExpr <VAR gL, gR: INTEGER>
                              (. VAR
                                   gL2, gR2: INTEGER;
                                   first:    BOOLEAN; .)
= TokenTerm <gL, gR>          (. first := TRUE .)
  { WEAK "|"
    TokenTerm <gL2, gR2>      (. IF first THEN
                                   CRT.MakeFirstAlt(gL, gR); first := FALSE
                                 END;
                                 CRT.ConcatAlt(gL, gR, gL2, gR2) .)
  }.

(*----------------------------------------------------------------------------*)

TokenTerm <VAR gL, gR: INTEGER>
                              (. VAR
                                   gL2, gR2: INTEGER; .)
= TokenFactor <gL, gR>
  { TokenFactor <gL2, gR2>    (. CRT.ConcatSeq(gL, gR, gL2, gR2) .)
  }
  [ "CONTEXT"
    "(" TokenExpr <gL2, gR2>  (. SetCtx(gL2); CRT.ConcatSeq(gL, gR, gL2, gR2) .)
    ")"
  ].

(*----------------------------------------------------------------------------*)

TokenFactor <VAR gL, gR: INTEGER>
                              (.VAR
                                  kind, c: INTEGER;
                                  set:     CRT.Set;
                                  name:    CRT.Name; .)
=                             (. gL :=0; gR := 0 .)
( Symbol <name, kind>         (. IF kind = ident THEN
                                   c := CRT.ClassWithName(name);
                                   IF c < 0 THEN
                                     SemError(115);
                                     Sets.Clear(set); c := CRT.NewClass(name, set)
                                   END;
                                   gL := CRT.NewNode(CRT.class, c, 0); gR := gL
                                 ELSE (* string *)
                                   CRT.StrToGraph(name, gL, gR)
                                 END .)
| "(" TokenExpr <gL, gR> ")"
| "[" TokenExpr <gL, gR> "]"  (. CRT.MakeOption(gL, gR) .)
| "{" TokenExpr <gL, gR> "}"  (. CRT.MakeIteration(gL, gR) .)
).

(*----------------------------------------------------------------------------*)

Ident <VAR name: CRT.Name> =
  ident                       (. CRS.GetName(CRS.pos, CRS.len, name) .).

(*----------------------------------------------------------------------------*)

Symbol <VAR name: CRT.Name; VAR kind: INTEGER>
  =
  ( Ident <name>              (. kind := ident .)
  | string                    (. CRS.GetName(CRS.pos, CRS.len, name); kind := string;
                                 FixString(name, CRS.len) .)
  ).

(*----------------------------------------------------------------------------*)

Attribs <VAR attrPos: CRT.Position> =
    "<"                       (. attrPos.beg := CRS.pos + FileIO.Long1; attrPos.col := CRS.col + 1 .)
    { ANY | badstring         (. SemError(102) .)
    }
    ">"                       (. attrPos.len := FileIO.INTL(CRS.pos - attrPos.beg) .)
  |
    "<."                      (. attrPos.beg := CRS.pos + FileIO.Long2; attrPos.col := CRS.col + 2 .)
    { ANY | badstring         (. SemError(102) .)
    }
    ".>"                      (. attrPos.len := FileIO.INTL(CRS.pos - attrPos.beg) .).

(*----------------------------------------------------------------------------*)

SemText <VAR semPos: CRT.Position> =
  "(."                        (. semPos.beg := CRS.pos + FileIO.Long2; semPos.col := CRS.col + 2 .)
  {   ANY
    | badstring               (. SemError(102) .)
    | "(."                    (. SemError(109) .)
  }
  ".)"                        (. IF CRS.pos - semPos.beg > FileIO.INT(CRT.maxSemLen) THEN SemError(128) END;
                                 semPos.len := FileIO.ORDL(CRS.pos - semPos.beg) .).

(*----------------------------------------------------------------------------*)

NameDecl                      (. VAR
                                   name, str: CRT.Name; .)
  = Ident <name> "="
    ( ident                   (. CRS.GetName(CRS.pos, CRS.len, str) .)
      | string                (. CRS.GetName(CRS.pos, CRS.len, str);
                                 FixString(str, CRS.len) .)
       )                      (. CRT.NewName(name, str) .)
  ".".

(*----------------------------------------------------------------------------*)

END CR.

⌨️ 快捷键说明

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