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

📄 cr.atg

📁 C/C++词法语法分析程序
💻 ATG
📖 第 1 页 / 共 2 页
字号:
                                (. 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 + -