nasl_grammar.y
来自「大国补丁后的nessus2.2.8的源代码」· Y 代码 · 共 1,217 行 · 第 1/2 页
Y
1,217 行
ST_R_SHIFT, ST_R_USHIFT, ST_L_SHIFT, ST_NOT, ST_EQ, ST_AND, ST_OR };static intmylex(lvalp, parm) YYSTYPE *lvalp; void *parm;{ char *p; naslctxt *ctx = parm; FILE *fp; int c, st = ST_START, len, r; int x, i; if ( parm == NULL ) return -1; fp = ctx->fp; p = ctx->buffer; len = 0; while ((c = getc(fp)) != EOF) { if (c == '\n') ctx->line_nb ++; switch(st) { case ST_START: if (c == '#') st = ST_COMMENT; else if (isalpha(c) || c == '_') { st = ST_IDENT; *p++ = c; len ++; } else if (isspace(c)) st = ST_SPACE; else if (c == '0') st = ST_ZERO; else if (isdigit(c)) { st = ST_DEC; *p++ = c; len ++; } else if (c == '\'') st = ST_STRING1; else if (c == '"') st = ST_STRING2; else if (c == '+') st = ST_PLUS; else if (c == '-') st = ST_MINUS; else if (c == '*') st = ST_MULT; else if (c == '/') st = ST_DIV; else if (c == '%') st = ST_MODULO; else if (c == '>') st = ST_SUP; else if (c == '<') st = ST_INF; else if (c == '=') st = ST_EQ; else if (c == '|') st = ST_OR; else if (c == '!') st = ST_NOT; else if (c == '&') st = ST_AND; else { return c; } break; case ST_STRING2: if (c == '"') goto exit_loop; *p++ = c; len ++; break; case ST_STRING1: if (c == '\'') goto exit_loop; else if (c == '\\') { c = getc(fp); switch (c) { case EOF: nasl_perror(NULL, "Unfinished string\n"); goto exit_loop; /* parse error? */ case '\n': /* escaped end of line */ ctx->line_nb ++; break; case '\\': *p++ ='\\'; len ++; break; case 'n': *p++ = '\n'; len++; break; case 'f': *p++ = '\f'; len ++; break; case 't': *p++ = '\t'; len ++; break; case 'r': *p++ = '\r'; len++; break; case 'v': *p++ = '\v'; len ++; break; case '"': *p ++ = '"'; len ++; break; /* Not yet, as we do not return the length of the string */ case '0': *p++ = '\0'; len++; break; case '\'': *p++ = '\''; len++; break; case 'x': x = 0; for (i = 0; i < 2; i ++) { c = getc(fp); if (c == EOF) { nasl_perror(NULL, "Unfinished \\x escape sequence (EOF)\n"); goto exit_loop; } if (c == '\n') ctx->line_nb ++; c = tolower(c); if (c >= '0' && c <= '9') x = x * 16 + (c - '0'); else if (c >= 'a' && c <= 'f') x = x * 16 + 10 + (c - 'a'); else { nasl_perror(NULL, "Unfinished \\x escape sequence\n"); ungetc(c, fp); if (c == '\n') ctx->line_nb --; break; } } *p++ = x; len ++; break; default: nasl_perror(NULL, "Unknown escape sequence \\%c\n", c); *p++ = c; len ++; break; } } else { *p++ = c; len ++; } break; case ST_IDENT: if (isalnum(c) || c == '_') { st = ST_IDENT; *p++ = c; len ++; } else { ungetc(c, fp); if (c == '\n') ctx->line_nb --; goto exit_loop; } break; case ST_ZERO: if (c == 'x' || c == 'X') st = ST_ZEROX; else if (isdigit(c)) { if (c <= '7') st = ST_OCT; else st = ST_DEC; *p ++ = c; len ++; } else { ungetc(c, fp); if (c == '\n') ctx->line_nb --; goto exit_loop; } break; case ST_ZEROX: if (isxdigit(c)) { st = ST_HEX; *p++ = c; len ++; } else { /* This should be a parse error */ ungetc(c, fp); if (c == '\n') ctx->line_nb --; goto exit_loop; } break; case ST_OCT: if (c >= '0') { if (c <= '7') { *p++ = c; len ++; break; } else if (c <= '9') { *p++ = c; len ++; st = ST_DEC; break; } } ungetc(c, fp); if (c == '\n') ctx->line_nb --; goto exit_loop; case ST_DEC: if (isdigit(c)) { *p++ = c; len ++; } else { ungetc(c, fp); if (c == '\n') ctx->line_nb --; goto exit_loop; } break; case ST_HEX: if (isxdigit(c)) { *p++ = c; len ++; } else { ungetc(c, fp); if (c == '\n') ctx->line_nb --; goto exit_loop; } break; case ST_SPACE: if (! isspace(c)) { ungetc(c, fp); if (c == '\n') ctx->line_nb --; st = ST_START; } break; case ST_COMMENT: if (c == '\n') st = ST_START; break; case ST_SUP_EXCL: if (c == '<') return NOMATCH; else { ungetc(c, fp); if (c == '\n') ctx->line_nb --; if (! isprint(c)) c = '.'; fprintf(stderr, "lexer error: invalid token >!%c parsed as >!< %c\n", c, c); return NOMATCH; } break; case ST_SUP: if (c == '=') return SUPEQ; else if (c == '<') return MATCH; else if (c == '>') st = ST_R_SHIFT; else if (c == '!') st = ST_SUP_EXCL; else { ungetc(c, fp); if (c == '\n') ctx->line_nb --; return '>'; } break; case ST_INF: if (c == '=') return INFEQ; else if (c == '<') st = ST_L_SHIFT; else { ungetc(c, fp); if (c == '\n') ctx->line_nb --; return '<'; } break; case ST_R_SHIFT: if (c == '=') return R_SHIFT_EQ; else if (c == '>') st = ST_R_USHIFT; else { ungetc(c, fp); if (c == '\n') ctx->line_nb --; return R_SHIFT; } /*NOTREACHED*/ break; case ST_R_USHIFT: if (c == '=') return R_USHIFT_EQ; else { ungetc(c, fp); if (c == '\n') ctx->line_nb --; return R_USHIFT; } /*NOTREACHED*/ break; case ST_L_SHIFT: if (c == '=') return L_SHIFT_EQ; else { ungetc(c, fp); if (c == '\n') ctx->line_nb --; return L_SHIFT; } /*NOTREACHED*/ break; case ST_AND: if (c == '&') return AND; ungetc(c, fp); if (c == '\n') ctx->line_nb --; return '&'; case ST_OR: if (c == '|') return OR; ungetc(c, fp); if (c == '\n') ctx->line_nb --; return '|'; case ST_NOT: if (c == '=') return NEQ; else if (c == '~') return RE_NOMATCH; ungetc(c, fp); if (c == '\n') ctx->line_nb --; return '!'; case ST_EQ: if (c == '=') return EQ; else if (c == '~') return RE_MATCH; else if (c == '>') return ARROW; ungetc(c, fp); if (c == '\n') ctx->line_nb --; return '='; case ST_PLUS: if (c == '+') return PLUS_PLUS; else if (c == '=') return PLUS_EQ; ungetc(c, fp); if (c == '\n') ctx->line_nb --; return '+'; case ST_MINUS: if (c == '-') return MINUS_MINUS; else if (c == '=') return MINUS_EQ; ungetc(c, fp); if (c == '\n') ctx->line_nb --; return '-'; case ST_MULT: if (c == '=') return MULT_EQ; else if (c == '*') return EXPO; ungetc(c, fp); if (c == '\n') ctx->line_nb --; return '*'; case ST_DIV: if (c == '=') return DIV_EQ; ungetc(c, fp); if (c == '\n') ctx->line_nb --; return '/'; case ST_MODULO: if (c == '=') return MODULO_EQ; ungetc(c, fp); if (c == '\n') ctx->line_nb --; return '%'; } if (len >= ctx->maxlen) { int offs = p - ctx->buffer; char *buf2; ctx->maxlen += 80; buf2 = erealloc(ctx->buffer, ctx->maxlen + 1); if (buf2 == NULL) { perror("realloc"); abort(); } p = buf2 + offs; ctx->buffer = buf2; } } exit_loop: ctx->buffer[len] = '\0'; switch (st) { case ST_START: case ST_COMMENT: case ST_SPACE: return 0; case ST_STRING2: r = STRING2; lvalp->str = estrdup(ctx->buffer); return r; case ST_STRING1: r = STRING1; lvalp->data.val = emalloc(len+2); memcpy(lvalp->data.val, ctx->buffer, len+1); lvalp->data.len = len; return r; case ST_IDENT: if (strcmp(ctx->buffer, "if") == 0) r = IF; else if (strcmp(ctx->buffer, "else") == 0) r = ELSE; else if (strcmp(ctx->buffer, "for") == 0) r = FOR; else if (strcmp(ctx->buffer, "while") == 0) r = WHILE; else if (strcmp(ctx->buffer, "repeat") == 0) r = REPEAT; else if (strcmp(ctx->buffer, "until") == 0) r = UNTIL; else if (strcmp(ctx->buffer, "foreach") == 0) r = FOREACH; else if (strcmp(ctx->buffer, "function") == 0) r = FUNCTION; else if (strcmp(ctx->buffer, "return") == 0) r = RETURN; else if (strcmp(ctx->buffer, "x") == 0) r = REP; else if (strcmp(ctx->buffer, "include") == 0) r = INCLUDE; else if (strcmp(ctx->buffer, "break") == 0) r = BREAK; else if (strcmp(ctx->buffer, "continue") == 0) r = CONTINUE; else if (strcmp(ctx->buffer, "local_var") == 0) r = LOCAL; else if (strcmp(ctx->buffer, "global_var") == 0) r = GLOBAL; else { r = IDENT; lvalp->str = estrdup(ctx->buffer); return r; } return r; case ST_DEC: /* -123 is parsed as "-" and "123" so that we can write "4-2" without * inserting a white space after the minus operator * Note that strtoul would also work on negative integers */ lvalp->num = x = strtoul(ctx->buffer, NULL, 10);#if NASL_DEBUG > 1 && defined(ULONG_MAX) && defined(ERANGE) if (x == ULONG_MAX && errno == ERANGE) nasl_perror(NULL, "Integer overflow while converting %s at or near line %d\n", ctx->buffer, ctx->line_nb);#endif return INTEGER; case ST_OCT: lvalp->num = x = strtoul(ctx->buffer, NULL, 8);#if NASL_DEBUG > 1 && defined(ULONG_MAX) && defined(ERANGE) if (x == ULONG_MAX && errno == ERANGE) nasl_perror(NULL, "Integer overflow while converting %s at or near line %d\n", ctx->buffer, ctx->line_nb);#endif return INTEGER; case ST_HEX: lvalp->num = x = strtoul(ctx->buffer, NULL, 16);#if NASL_DEBUG > 1 && defined(ULONG_MAX) if (x == ULONG_MAX) nasl_perror(NULL, "Possible integer overflow while converting %s at or near line %d\n", ctx->buffer, ctx->line_nb);#endif return INTEGER; case ST_ZEROX: nasl_perror(NULL, "Invalid token 0x parsed as 0 at line %d\n", ctx->line_nb); case ST_ZERO: lvalp->num = 0; return INTEGER; default: abort(); }}intnasllex(lvalp, parm) YYSTYPE *lvalp; void *parm;{ int x = mylex(lvalp, parm);#if 0 naslctxt *ctx = parm; if (isprint(x)) fprintf(stderr, "Line %d\t: '%c'\n", ctx->line_nb, x); else fprintf(stderr, "Line %d\t: %d\n", ctx->line_nb, x);#endif return x;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?