Annotation of researchv10dc/cmd/icon/src/tran/err.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Routines for producing error messages.
        !             3:  */
        !             4: 
        !             5: #include "itran.h"
        !             6: #include "token.h"
        !             7: #include "tree.h"
        !             8: #include "lex.h"
        !             9: 
        !            10: struct errmsg {
        !            11:    int e_state;                /* parser state number */
        !            12:    char *e_mesg;               /* message text */
        !            13:    } errtab[] = {
        !            14: /*
        !            15:  * Initialization of table that maps error states to messages.
        !            16:  */
        !            17: 
        !            18:      1, "end of file expected",
        !            19:      2, "global, record, or procedure declaration expected",
        !            20:      9, "link list expected",
        !            21:     11, "missing semicolon",
        !            22:     14, "global, record, or procedure declaration expected",
        !            23:     19, "missing record name",
        !            24:     22, "invalid global declaration",
        !            25:     23, "missing procedure name",
        !            26:     24, "missing procedure name", /* ? */
        !            27:     25, "missing link file name",
        !            28:     26, "missing field list in record declaration",
        !            29:     28, "missing end",
        !            30:     29, "missing semicolon or operator",
        !            31:     44, "invalid operand for unary operator",
        !            32:     45, "invalid operand for unary operator",
        !            33:     46, "invalid operand for unary operator",
        !            34:     47, "invalid operand for unary operator",
        !            35:     48, "invalid operand for unary operator",
        !            36:     49, "invalid operand for unary operator",
        !            37:     59, "invalid create expression",
        !            38:     66, "invalid keyword construction",
        !            39:     93, "invalid if control expression",
        !            40:     94, "invalid case control expression",
        !            41:     95, "invalid while control expression",
        !            42:     96, "invalid until control expression",
        !            43:     97, "invalid every control expression",
        !            44:     98, "invalid repeat expression",
        !            45:    101, "missing parameter list in procedure declaration",
        !            46:    105, "invalid local declaration",
        !            47:    106, "invalid initial expression",
        !            48:    112, "invalid operand",
        !            49:    113, "invalid operand",
        !            50:    114, "invalid operand in assignment",
        !            51:    115, "invalid operand in augmented assignment",
        !            52:    116, "invalid operand in augmented assignment",
        !            53:    117, "invalid operand in augmented assignment",
        !            54:    118, "invalid operand in augmented assignment",
        !            55:    119, "invalid to clause",
        !            56:    149, "invalid operand in alternation",
        !            57:    150, "invalid operand",
        !            58:    165, "invalid operand",
        !            59:    168, "invalid operand",
        !            60:    173, "invalid operand",
        !            61:    178, "invalid operand",
        !            62:    179, "invalid operand",
        !            63:    180, "invalid operand",
        !            64:    183, "invalid reference or subscript", /* ? */
        !            65:    184, "invalid field name",
        !            66:    193, "missing right parenthesis", /* ? */
        !            67:    194, "missing right brace",
        !            68:    200, "missing right bracket", /* ? */
        !            69:    201, "missing then",
        !            70:    202, "missing of",
        !            71:    207, "missing identifier",
        !            72:    209, "missing right parenthesis",
        !            73:    211, "missing end",
        !            74:    212, "invalid declaration",
        !            75:    213, "missing semicolon or operator",
        !            76:    231, "missing right bracket",
        !            77:    241, "missing right parenthesis", /* ? */
        !            78:    242, "invalid then clause",
        !            79:    243, "missing left brace",
        !            80:    244, "invalid do clause",
        !            81:    245, "invalid do clause",
        !            82:    246, "invalid do clause",
        !            83:    248, "invalid argument list",
        !            84:    253, "invalid by clause",
        !            85:    255, "invalid section",
        !            86:    261, "missing right parenthesis",
        !            87:    264, "missing right bracket",
        !            88:    266, "invalid case clause",
        !            89:    272, "missing right bracket or ampersand",
        !            90:    273, "missing right brace",
        !            91:    274, "missing right parenthesis",
        !            92:    278, "invalid else clause",
        !            93:    279, "missing right brace or semicolon",
        !            94:    281, "missing colon",
        !            95:    282, "missing colon or ampersand",
        !            96:    288, "invalid case clause",
        !            97:    289, "invalid default clause",
        !            98:    290, "invalid case clause",
        !            99:     -1,  "syntax error"
        !           100:    };
        !           101: 
        !           102: /*
        !           103:  * yyerror produces syntax error messages.  tok is the offending token
        !           104:  *  (yychar), lval is yylval, and state is the parser's state.
        !           105:  *
        !           106:  * errtab is searched for the state, if it is found, the associated
        !           107:  *  message is produced; if the state isn't found, "syntax error"
        !           108:  *  is produced.
        !           109:  */
        !           110: yyerror(tok, lval, state)
        !           111: int tok, state;
        !           112: nodeptr lval;
        !           113:    {
        !           114:    register struct errmsg *p;
        !           115:    char *mapterm();
        !           116: 
        !           117:    if (*filep)
        !           118:       fprintf(stderr, "%s, ", *filep);
        !           119:    if (tok == EOFX)   /* special case end of file */
        !           120:       fprintf(stderr, "unexpected end of file\n");
        !           121:    else {
        !           122:       fprintf(stderr, "line %d: ", Line(lval));
        !           123:       if (Col(lval))
        !           124:          fprintf(stderr, "\"%s\": ", mapterm(tok,lval));
        !           125:       for (p = errtab; p->e_state != state && p->e_state >= 0; p++) ;
        !           126:       fprintf(stderr, "%s\n", p->e_mesg);
        !           127:       }
        !           128:    fatalerrs++;
        !           129:    nocode++;
        !           130:    }
        !           131: /*
        !           132:  * err produces the error messages s1 and s2 (if nonnull).  The
        !           133:  *  current line number is found in tline.
        !           134:  */
        !           135: err(s1, s2)
        !           136: char *s1, *s2;
        !           137:    {
        !           138:    if (*filep)
        !           139:       fprintf(stderr, "%s, ", *filep);
        !           140:    fprintf(stderr, "line %d: ", tline);
        !           141:    if (s2)
        !           142:       fprintf(stderr, "\"%s\": ", s2);
        !           143:    fprintf(stderr, "%s\n", s1);
        !           144:    fatalerrs++;
        !           145:    nocode++;
        !           146:    }
        !           147: 
        !           148: /*
        !           149:  * lerr produces the error message s and associates it with line l.
        !           150:  */
        !           151: lerr(l, s)
        !           152: int l;
        !           153: char *s;
        !           154:    {
        !           155:    if (*filep)
        !           156:       fprintf(stderr, "%s, ", *filep);
        !           157:    fprintf(stderr, "line %d: ", l);
        !           158:    fprintf(stderr, "%s\n", s);
        !           159:    fatalerrs++;
        !           160:    nocode++;
        !           161:    }
        !           162: 
        !           163: /*
        !           164:  * warn produces s1 and s2 (if nonnull) as warning messages.  The current
        !           165:  *  line is in tline.
        !           166:  */
        !           167: warn(s1, s2)
        !           168: char *s1, *s2;
        !           169:    {
        !           170:    if (*filep)
        !           171:       fprintf(stderr, "%s, ", *filep);
        !           172:    fprintf(stderr, "line %d: ", tline);
        !           173:    if (s2)
        !           174:       fprintf(stderr, "\"%s\": ", s2);
        !           175:    fprintf(stderr, "%s\n", s1);
        !           176:    warnings++;
        !           177:    }
        !           178: 
        !           179: /*
        !           180:  * syserr is called for fatal errors.  The message s is produced and the
        !           181:  *  translator exits.
        !           182:  */
        !           183: syserr(s)
        !           184: char *s;
        !           185:    {
        !           186:    if (*filep)
        !           187:       fprintf(stderr, "%s, ", *filep);
        !           188:    fprintf(stderr, "line %d: %s\n", inline, s);
        !           189:    exit(ErrorExit);
        !           190:    }
        !           191: 
        !           192: /*
        !           193:  * mapterm finds a printable string for the given token type
        !           194:  *  and value.
        !           195:  */
        !           196: char *mapterm(typ,val)
        !           197: int typ;
        !           198: nodeptr val;
        !           199:    {
        !           200:    register struct toktab *t;
        !           201:    register i;
        !           202: 
        !           203:    i = typ;
        !           204:    if (i == IDENT || i == INTLIT || i == REALLIT || i == STRINGLIT || i == CSETLIT)
        !           205:       return Str0(val);
        !           206:    for (t = toktab; t->t_type != i; t++)
        !           207:       if (t->t_type == 0)
        !           208:          return "???";
        !           209:    return (t->t_word);
        !           210:    }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.