📄 cr.atg
字号:
(. Name name;
char str[MAX_STR_LEN];
int n1, n2; .)
Ident<name> (. if (FindClass(name) == UNDEF) SemError(115);
GetClassWithName(name, items); .)
| String<str> (. StringClass(str, items); .)
| ChrSet<&n1>
( ".." ChrSet<&n2> (. Set_AddRange(items, n1, n2); .)
| (. Set_AddItem(items, n1); .)
)
| "ANY" (. Set_Union(items, &ANY_SET); .)
.
ChrSet<int *n> =
(. char str[5]; int x; .)
"CHR" "(" number (. LexString(str, sizeof(str)-1);
x = atoi(str);
if (x > 255) { SemError(118); x = 0; }
*n = x; .)
")"
.
TokenDecl<int sec_type> =
(. char name[MAX_STR_LEN];
int p = 0, sp, type; .)
( Ident<name> (. if ((sp = FindSym(name, &type)) != UNDEF) SemError(107);
else sp = NewSym(name, sec_type); .)
SYNC
( "=" TokenExpr<&p> (. if (sec_type == T_T) ConvertToStates(p, sp);
else ConvertToStates(p, sp+FIRST_PRAGMA); .)
"."
| (. P_option = TRUE; .)
)
| String<name> (. P_option = TRUE;
if ((sp = FindSym(name, &type)) != UNDEF) SemError(107);
else sp = NewSym(name, sec_type); .)
)
[ SemText<&p> (. if (sec_type == T_T) SemError(114);
SetPragmaText(sp, p); .)
]
.
Expression<int *n> =
(. int n0 = NIL, n1, n2, SX_Line; .)
Term<&n1>
{ WEAK "|" (. if (n0 == NIL)
n0 = n1 = MakeGraph(T_ALT, n1);
SX_Line = S_Line; .)
Term<&n2> (. n2 = MakeGraph(T_ALT, n2);
SetGraphLine(n2,SX_Line);
n1 = LinkAltGraph(n1, n2); .)
} (. *n = (n0 ? n0 : n1); .)
.
Term<int *n> =
(. int n0 = NIL, n1, n2; .)
( Factor<&n1> (. n0 = n1; .)
{ Factor<&n2> (. n1 = LinkGraph(n1, n2); .)
}
| /*Empty*/ (. n0 = MakeSemGraph(T_SEM, -1, 0, S_Line, S_Col); .)
) (. *n = n0; .)
.
Factor<int *n> =
(. char name1[MAX_STR_LEN];
int weak = 0, SX_Line;
int n1, n2 = NIL;
int sp, is_new, type;
PNTermNode snt; .)
(
["WEAK" (. weak = 1; .)
]
Symbol<name1> (. sp = FindSym(name1, &type);
if (type == T_CLASS) SemError(104);
if (weak && type == T_T) type = T_WT;
if (weak && type == T_NT) SemError(123);
n1 = MakeGraph(type, sp);
if (type == T_NT) {
snt = GetNTermP(sp);
is_new = snt->graph == 0;
snt->line_use = S_Line;
snt->reachable = TRUE;
} .)
( Attribs<&n2> (. (void) LinkAltGraph(n1, n2);
if (type != T_NT) SemError(103);
else {
if(!is_new && !snt->has_attr) SemError(105);
if (is_new) snt->has_attr = TRUE;
} .)
| (. if (type == T_NT)
if (!is_new && snt->has_attr) SemError(105); .)
)
| "(" Expression<&n1> ")"
| "[" (. SX_Line = S_Line .)
Expression<&n1> "]" (. n1 = MakeGraph(T_OPT, n1);
SetGraphLine(n1,SX_Line) .)
| "{" (. SX_Line = S_Line .)
Expression<&n1> "}" (. n1 = MakeGraph(T_REP, n1);
SetGraphLine(n1,SX_Line) .)
| SemText<&n1>
| "ANY" (. n1 = MakeGraph(T_ANY, 0); .)
| "SYNC" (. n1 = MakeGraph(T_SYNC, 0); .)
) (. *n = n1; .)
.
TokenExpr<int *n> =
(. int n0 = NIL, n1, n2; .)
TokenTerm<&n1>
{ WEAK "|" (. if (n0 == NIL)
n0 = n1 = MakeGraph(T_ALT, n1); .)
TokenTerm<&n2> (. n2 = MakeGraph(T_ALT, n2);
n1 = LinkAltGraph(n1, n2); .)
} (. *n = (n0 ? n0 : n1); .)
.
TokenTerm<int *n> =
(. int n0 = NIL, n1, n2; .)
TokenFactor<&n1> (. n0 = n1; .)
{ TokenFactor<&n2> (. n1 = LinkGraph(n1, n2); .)
}
[ "CONTEXT"
"(" TokenExpr<&n2> ")" (. SetCtx(n2); n1 = LinkGraph(n1, n2); .)
]
(. *n = n0; .)
.
TokenFactor<int *n> =
(. char name[MAX_STR_LEN];
int p; .)
( Ident<name> (. if ((p = FindClass(name)) == UNDEF) {
/* Just Create a valid node */
p = MakeGraph(T_CHAR, 0);
SemError(115);
} else p = MakeGraph(T_CLASS, p); .)
| String<name> (. p = StrToGraph((unsigned char *) name); .)
| "(" TokenExpr<&p> ")"
| "[" TokenExpr<&p> "]" (. p = MakeGraphOp(T_OPT, p); .)
| "{" TokenExpr<&p> "}" (. p = MakeGraphOp(T_REP, p); .)
) (. *n = p; .)
.
Symbol<char *name> =
(. int sp, type; .)
( Ident<name> (. sp = FindSym(name, &type);
if (sp == UNDEF) sp = NewSym(name, T_NT); .)
| String<name> (. sp = FindSym(name, &type);
if (sp == UNDEF) {
sp = NewSym(name, T_T);
MatchLiteral(sp);
} .)
)
.
Ident<char *s> =
ident (. LexString(s, MAX_ID_LEN-1) .)
.
String<char *s> =
string (. LexString(s, MAX_STR_LEN-1);
FixString(s); .)
.
Attribs<int *n> =
(. long P;
int Len, Line, Col; .)
"<" (. P = S_Pos+1; Line = S_Line; Col = S_Col; .)
{ ANY | badstring (. SemError(102); .)
}
">" (. Len = (int) (S_Pos - P);
*n = MakeSemGraph(T_ATTR, P, Len, Line, Col); .)
|
"<." (. P = S_Pos+2; Line = S_Line; Col = S_Col; .)
{ ANY | badstring (. SemError(102); .)
}
".>" (. Len = (int) (S_Pos - P);
*n = MakeSemGraph(T_ATTR, P, Len, Line, Col); .)
.
SemText<int *n> =
(. long P;
int Len, Line, Col; .)
"(." (. P = S_Pos+2; Line = S_Line; Col = S_Col; .)
{ ANY
| badstring (. SemError(102); .)
| "(." (. SemError(109); .)
}
".)" (. Len = (int) (S_Pos - P);
*n = MakeSemGraph(T_SEM, P, Len, Line, Col); .)
.
NameDecl =
(. Name username, name; .)
Ident<username>
"="
(Ident<name> | String<name>)
"." (. NewName(name, username); .)
.
END CR.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -