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 + -
显示快捷键?