www.pudn.com > 12cocorc.zip > CR.ATG


$C  /* Generate Compiler Module */ 
COMPILER CR 
/************************************************************************** 
   COCO/R for C grammar used to generate COCO/R itself 
   1.12 Last modified Tue  11-17-98 
**************************************************************************/ 
 
#include "crt.h" 
#include "crf.h" 
#include "cra.h" 
#include "crp.h" 
#include "crs.h" 
#include  
#include  
 
static void FixString(char *name) 
{ 
  int i, len, dquote, spaces; 
  len = strlen(name); 
  if (len == 2) { SemError(129); return; } 
  if (ignore_case) upcase(name); 
  dquote = FALSE; spaces = FALSE; 
  for (i = 1; i <= len-2; i++) { 
    if (name[i] == '"') dquote = TRUE; 
    if (name[i] > 0 && name[i] <= ' ') spaces = TRUE; 
  } 
  if (!dquote) { 
    name[0] = '"'; name[len-1] = '"'; 
  } 
  if (spaces) SemError(124); 
} 
 
static void MatchLiteral (int sp) 
/* store string either as token or as literal */ 
{ 
  PTermNode sn, sn1; 
  int matched_sp; 
 
  sn = GetTermP(sp); 
  matched_sp = MatchDFA((unsigned char *) sn->name, sp); 
  if (matched_sp != 0) { 
    sn1 = GetTermP(matched_sp); 
    sn1->type = T_CLASSLITTOKEN; 
    sn->type  = T_LITTOKEN; 
  } else sn->type= T_CLASSTOKEN; 
} 
 
static void SetCtx (int gp) 
/* set transition code to contextTrans */ 
{ 
  PGraphNode gn; 
  while (gp > 0) { 
    gn = GetGraphP(gp); 
    if (gn->type == T_CHAR || gn->type == T_CLASS) 
      gn->CONTEXT = T_CONTEXT; 
    else 
      if (gn->type == T_OPT || gn->type == T_REP) 
      SetCtx(gn->INNER); 
      else 
      if (gn->type == T_ALT) { 
      SetCtx(gn->INNER); SetCtx(gn->ALT); 
      } 
    gp = gn->next; 
  } 
} 
 
static void StringClass(char *s, Set *items) 
{ 
  s[strlen(s)-1]=0;  s++;  /* Ignore First and Last character */ 
  while (*s) Set_AddItem(items, *s++); 
} 
 
/**************************************************************************/ 
 
CHARACTERS 
  letter   = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_" . 
  digit    = "0123456789" . 
  cntl     = CHR(0)..CHR(31). 
  tab      = CHR(9) . 
  eol      = CHR(13). 
  lf       = CHR(10) . 
  noQuote1 = ANY - '"' - cntl. 
  noQuote2 = ANY - "'" - cntl. 
 
IGNORE tab + eol + lf 
 
TOKENS 
  ident     = letter {letter | digit} . 
  string    = '"' {noQuote1} '"' | "'" {noQuote2} "'" . 
  badstring = '"' {noQuote1} ( eol | lf) | "'" {noQuote2} (eol | lf) . 
  number    = digit {digit} . 
 
NAMES 
  Range   = "..". 
 
PRAGMAS 
  Options = "$" {letter}. 
                                (. char s[100]; 
                                   LookAheadString(s, sizeof(s)-1); 
                                   SetOptions(s); .) 
 
COMMENTS 
  FROM "/*" TO "*/" NESTED 
 
PRODUCTIONS 
 
CR =                            (. Name name1; 
                                   int  attr, sem, exp, is_new, sp, type; 
                                   PNTermNode sn; .) 
 
   "COMPILER" 
   Ident         (. global_defs.pos  = S_NextPos; 
                                   global_defs.line = S_NextLine; .) 
   { ANY }                      (. global_defs.len  = 
                                     (int) (S_NextPos-global_defs.pos); .) 
   { Declaration } 
   SYNC                         (. if (Successful()) { /* No Errors so far */ 
                                     if (!MakeDeterministic()) SemError(127); 
                                   } .) 
   "PRODUCTIONS" 
   {                            (. attr = NIL; sem = NIL; .) 
      Ident              (. if ((sp = FindSym(name1, &type)) != UNDEF) { 
                                     is_new = FALSE; 
                                     if (type != T_NT) SemError(108); else { 
                                       sn = GetNTermP(sp); 
                                       if (sn->graph) SemError(107); 
                                       sn->line_dec = S_Line; 
                                     } 
                                   } else { 
                                     sp = NewSym(name1, T_NT); 
                                     sn = GetNTermP(sp); is_new = TRUE; 
                                     sn->line_dec = S_Line; 
                                   } .) 
      [ Attribs<&attr> ]        (. if (!is_new) { 
                                     if (sn->has_attr && !attr) SemError(105); 
                                     if (!sn->has_attr && attr) SemError(105); 
                                   } 
                                   if (attr) { 
                                     sn->attr = attr; sn->has_attr = TRUE; 
                                   } .) 
      WEAK "=" 
      [ SemText<&sem> ] 
      Expression<&exp>          (. if (sem) { 
                                     (void) LinkGraph(sem, exp); exp = sem; 
                                   } .) 
      WEAK "."                  (. sn = GetNTermP(sp); /* reload */ 
                                   sn->graph = exp; .) 
      SYNC 
   } 
   "END" Ident           (. if (strcmp(name1, compiler_name)) SemError(117); 
                                   if((sp = FindSym(compiler_name, &type)) != UNDEF) { 
                                     if (type!=T_NT) SemError(108); 
                                     else { 
                                       sn = GetNTermP(sp); 
                                       if (sn->has_attr) SemError(112); 
                                       sn->reachable=TRUE; 
                                     } 
                                   } else SemError(111); 
                                   no_sym = NewSym("No", T_T); .) 
   "." . 
 
Declaration = 
                                (. Set ignore; 
                                   int n1, n2, nested = FALSE; .) 
 
     "CHARACTERS" { SetDecl } 
   | "TOKENS"   { TokenDecl } 
   | "NAMES"    { NameDecl } 
   | "PRAGMAS"  { TokenDecl } 
   | "COMMENTS" 
     "FROM" TokenExpr<&n1> 
     "TO"   TokenExpr<&n2> 
     [ "NESTED"                 (. nested = TRUE; .) 
     ]                          (. NewComment(n1, n2, nested); .) 
   | "IGNORE" 
     ( "CASE"                   (. ignore_case = TRUE; .) 
      |                         (. Set_Init(&ignore); .) 
       CompSet<&ignore>         (. AddIgnore(&ignore); 
                                   if (Set_IsItem(&ignore,0)) SemError(119); 
                                   Set_Done(&ignore); .) 
     ) 
   . 
 
SetDecl = 
                                (. Name name; 
                                   Set  items; 
                                   Set_Init(&items); .) 
 
   Ident                  (. if (FindClass(name) != UNDEF) SemError(107); .) 
   "=" CompSet<&items> "."      (. (void) NewClass(name, &items); 
                                   Set_Done(&items); .) 
   . 
 
CompSet = 
                                (. Set set1, set2; 
                                   Set_Init(&set1); Set_Init(&set2); .) 
   SimSet<&set1> 
   { (  "+" SimSet<&set2>       (. Set_Union(&set1, &set2); .) 
      | "-" SimSet<&set2>       (. Set_Diference(&set1, &set2); .) 
     )                          (. Set_Clean(&set2); .) 
   }                            (. Set_Union(items, &set1); 
                                   Set_Done(&set1); Set_Done(&set2); .) 
   . 
 
SimSet = 
                                (. Name name; 
                                   char str[MAX_STR_LEN]; 
                                   int n1, n2; .) 
 
     Ident                (. if (FindClass(name) == UNDEF) SemError(115); 
                                   GetClassWithName(name, items); .) 
   | String                (. StringClass(str, items); .) 
   | ChrSet<&n1> 
     ( ".." ChrSet<&n2>         (. Set_AddRange(items, n1, n2); .) 
      |                         (. Set_AddItem(items, n1); .) 
     ) 
   | "ANY"                      (. Set_Union(items, &ANY_SET); .) 
   . 
 
ChrSet = 
                                (. 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 = 
                                (. char name[MAX_STR_LEN]; 
                                   int p = 0, sp, type; .) 
 
   (  Ident               (. 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              (. 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 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 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  = 
                                (. 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              (. 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 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 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 = 
                                (. char name[MAX_STR_LEN]; 
                                   int p; .) 
 
   (  Ident               (. if ((p = FindClass(name)) == UNDEF) { 
                                     /* Just Create a valid node */ 
                                     p = MakeGraph(T_CHAR, 0); 
                                     SemError(115); 
                                   } else p = MakeGraph(T_CLASS, p); .) 
    | String              (. p = StrToGraph((unsigned char *) name); .) 
    | "(" TokenExpr<&p> ")" 
    | "[" TokenExpr<&p> "]"     (. p = MakeGraphOp(T_OPT, p); .) 
    | "{" TokenExpr<&p> "}"     (. p = MakeGraphOp(T_REP, p); .) 
   )                            (. *n = p; .) 
   . 
 
Symbol = 
                                (. int sp, type; .) 
    ( Ident               (. sp = FindSym(name, &type); 
                                   if (sp == UNDEF) sp = NewSym(name, T_NT); .) 
    | String              (. sp = FindSym(name, &type); 
                                   if (sp == UNDEF) { 
                                     sp = NewSym(name, T_T); 
                                     MatchLiteral(sp); 
                                   } .) 
    ) 
    . 
 
Ident = 
   ident                        (. LexString(s, MAX_ID_LEN-1) .) 
   . 
 
String = 
   string                       (. LexString(s, MAX_STR_LEN-1); 
                                   FixString(s); .) 
   . 
 
Attribs = 
                                (. 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 = 
                                (. 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 
   "=" 
   (Ident | String) 
   "."                          (. NewName(name, username); .) 
   . 
 
END CR.