⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lexer.l

📁 C程序漏洞检查!
💻 L
📖 第 1 页 / 共 3 页
字号:
                             tokn_ptr += n;                         } else                             yywarn("Comment too long");                         Parse_TOS->yylineno++;                         Parse_TOS->yynxtcol = 0;                         in_preprocess = 0;                       }<CMMT>"*"+"/"          {                         int n = yyleng;                         if (tokn_ptr + n < tokn_end) {                             memcpy(tokn_ptr,yytext,n);                             tokn_ptr += n;                         } else                             yywarn("Comment too long");                         LAST_STATE();                         *tokn_ptr = '\0';                         lvalp->leaf->data.str = emalloc(strlen(tokn_buff)+1);                         strcpy(lvalp->leaf->data.str,tokn_buff);                         return(COMMENT);                       }<CC>\\[0-7]{1,3}"'"    {   /* octal escape sequence */                         uint result;                         if (sscanf(yytext+1, "%o", &result ) < 1)                         {                             yyerr("Invalid octal escape sequence");                             LAST_STATE();                             return(INVALID);                         }                                                      /* error, constant is out-of-bounds */                         if ( result > 0xff ){                             yywarn("Escape sequence out-of-bounds");                             result = 0;                         }                         lvalp->leaf->data.cval = result;                         LAST_STATE();                         return(CHAR_CONST);                       }<CC>\\x{hexdigit}+"'"  {   /* hex escape sequence - ISO C */                         uint result;                         if (sscanf(yytext+2, "%x", &result ) < 1)                         {                             yyerr("Invalid hex escape sequence");                             LAST_STATE();                             return(INVALID);                         }                             /* error, constant is out-of-bounds */                         if ( result > 0xff ){                             yywarn("Escape sequence out-of-bounds");                             result = 0;                         } else if (yyleng > 5){                             yywarn("Hexadecimal escape exceeds two chars");                             result = 0;                         }                         lvalp->leaf->data.cval = (char) result;                         LAST_STATE();                         return(CHAR_CONST);                       }<CC>\\{digits}"'"      {  /* Bad escape sequence */                         yywarn("Bad escape sequence in char constant");                         lvalp->leaf->data.cval = '\0';                         LAST_STATE();                         return(CHAR_CONST);                       }<CC>\n                 { /* Error unterminated char constant */                         Parse_TOS->yylineno++;                         Parse_TOS->yynxtcol = 0;                         yywarn("Unterminated char constant");                         lvalp->leaf->data.cval = '\0';                         LAST_STATE();                         return(CHAR_CONST);                       }<CC>\\n"'"             {                         lvalp->leaf->data.cval = '\n';                         LAST_STATE();                         return(CHAR_CONST);                       }<CC>\\t"'"             {                         lvalp->leaf->data.cval = '\t';                         LAST_STATE();                         return(CHAR_CONST);                       }<CC>\\r"'"             {                         lvalp->leaf->data.cval = '\r';                         LAST_STATE();                         return(CHAR_CONST);                       }<CC>\\b"'"             {                         lvalp->leaf->data.cval = '\b';                         LAST_STATE();                         return(CHAR_CONST);                       }<CC>\\f"'"             {                         lvalp->leaf->data.cval = '\f';                         LAST_STATE();                         return(CHAR_CONST);                       }<CC>\\v"'"             {                         lvalp->leaf->data.cval = '\v';                         LAST_STATE();                         return(CHAR_CONST);                       }<CC>\\a"'"             {                         lvalp->leaf->data.cval = '\a';                         LAST_STATE();                         return(CHAR_CONST);                       }<CC>\\\n"'"            {                         Parse_TOS->yylineno++;                         Parse_TOS->yynxtcol = 1;  /* Oddity */                         lvalp->leaf->data.cval = '\n';                         LAST_STATE();                         return(CHAR_CONST);                       }<CC>\\."'"             {                         lvalp->leaf->data.cval = yytext[1];                         LAST_STATE();                         return(CHAR_CONST);                       }<CC>[^']"'"            {                         lvalp->leaf->data.cval = *yytext;                         LAST_STATE();                         return(CHAR_CONST);                       }<CC>"'"                { /* Empty */                         yywarn("Empty character constant");                         lvalp->leaf->data.cval = '\0';                         LAST_STATE();                         return(CHAR_CONST);                       }<CC>[^\\\n][^']+"'"    { /* Multiple characters */                         yywarn("Invalid character constant");                         lvalp->leaf->data.cval = '\0';                         LAST_STATE();                         return(CHAR_CONST);                       }<INITIAL>{whitespace}+ ;   /* space/tab/formfeed/vertical tab (ignore) */<INITIAL,CMMT>\n|\r    { Parse_TOS->yylineno++;                         Parse_TOS->yynxtcol = 0;                         in_preprocess = 0;                       }<CMMT><<EOF>>          {                          yyerr("EOF reached inside comment");                         in_preprocess = 0;                         return(0);                       }<CC><<EOF>>            {                          yyerr("EOF reached inside character constant");                         return(0);                       }<STR><<EOF>>           {                          yyerr("EOF reached inside string constant");                         return(0);                       }.                      { /* Any unknown char is an error */                        fprintf(stderr,                            "Error: Line %d: Illegal Character",                            Parse_TOS->yylineno);                        if ((yytext[0] >= ' ') && (yytext[0] <= '~'))                            fprintf(stderr,": '%c'\n", yytext[0]);                        else                            fprintf(stderr,                                ", ASCII: %03o (octal)\n", yytext[0]);                       }%%/************************************************************************//// yywrap() - This function is called by the lexer [yylex() or sslex()] when//            the end-of-file (or end-of-string for sslex()) is reached.//            It gets the next file/string ready (if any) and returns 1//            which indicates to the lexer that there are no more files//            remaining.  The lexer returns 0 to the parser, indicating//            no more tokens are remaining. The parser function, yyparse(),//            then returns 0, indicating that the parse is done.  This//            behaviour allows a single item to be parsed to be placed//            on the stack and parsed without the entire stack being consumed.//// **********************************************************************/int yywrap(void){    in_preprocess = 0;    /* Prepare the next file if there is one but return 1 */    /* so that yyparse returns anyway. */    /*  get_next_file(ParseStack);  */    return(1);}/***********************************************************************/int cnt_nl(char *txt, int len){  int ret = 0;  do {    switch (*txt++) {      case '\n':        ret++;        Parse_TOS->yylineno++;        Parse_TOS->yynxtcol = 0;        break;      default:        break;    }  } while(--len > 0);  return ret;}voidget_lineno(void)	/*  Process a #line directive */{	char	*pnt;	int	ln = 0;	pnt = strchr(line_buf,'#');	if (pnt)	{	pnt++;		if (*pnt == 'l')		pnt += 4;	}	do {	if (pnt)		{	if (sscanf(pnt,"%d", &ln) < 1)				break;			Parse_TOS->yylineno = ln - 1;			pnt = strchr(pnt,'"');			if (pnt)			{	char *pnt_end;				pnt++;				pnt_end = strchr(pnt,'"');				if (pnt_end)					*pnt_end = '\0';				else					break;				/* free(Parse_TOS->filename);	gjh */				Parse_TOS->filename = emalloc(strlen(pnt)+1);				strcpy(Parse_TOS->filename,pnt);			}			return;		}	} while(0);	/* so we can use break to exit this block */	yywarn("Malformed #line directive");}voidprint_caret(char *s, int pos){    char *str;    int i = 0;    for (str=s; *str && (i<pos); i++, str++)        if (*str=='\t')            fputs("\t",stderr);        else            fputs(" ",stderr);    fputs("^\n",stderr);} voidyywarn(char *s){    fprintf(stderr,"%s:%d: Warning - %s:\n%s",         Parse_TOS->filename, Parse_TOS->yylineno, s, line_buf);     print_caret(line_buf,Parse_TOS->yycolno);}intyyerr(char *s){    fprintf(stderr,"%s:%d: %s:\n%s",         Parse_TOS->filename, Parse_TOS->yylineno, s, line_buf);     print_caret(line_buf,Parse_TOS->yycolno);    if (++err_cnt >= 10){        fprintf(stderr,"Too many errors (%d detected) - quitting.\n",                err_cnt );        fclose(yyin);        return(1);    }    return(0); }intyyerror(char *s){	extern int uno, allerr;	line_buf[MAX_TOKN_LEN-1] = '\0';	/* ensure temination */	fprintf(stderr,"%s:%d: Error (%s) before '%s'\n%s",		Parse_TOS->filename, Parse_TOS->yylineno,		s, toksym(err_tok,0), line_buf); 	print_caret(line_buf,Parse_TOS->yycolno);	err_cnt++;	if ((uno == 0 || allerr) && err_cnt >= 10)	{	fprintf(stderr,"too many errors (%d detected)\n",			err_cnt);		fclose(yyin);		return(1);	}	return(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -