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.