📄 lexer.l
字号:
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 + -