📄 cr.atg
字号:
[ ".." 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 + -