X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCC.lex;h=d844195103eb346ea77685273834fc42976be36e;hb=d5e163c45df3f0603c1f52c7d4467b60a5e0afee;hp=d80995fbc2a8469723bd28e6e623d0ea0c544e91;hpb=ec91ae40b0c4a39b3b7b546cb876846c60c92cfa;p=fw%2Fsdcc diff --git a/src/SDCC.lex b/src/SDCC.lex index d80995fb..d8441951 100644 --- a/src/SDCC.lex +++ b/src/SDCC.lex @@ -35,16 +35,15 @@ IS (u|U|l|L)* #include #include "common.h" #include "newalloc.h" - +#include "dbuf.h" + char *stringLiteral(); char *currFname; -extern int lineno ; +extern int lineno, column; extern char *filename ; -extern char *fullSrcFileName ; int yylineno = 1 ; void count() ; -void comment(); int process_pragma(char *); #undef yywrap @@ -74,10 +73,14 @@ struct options save_options ; P_STACKAUTO , P_NOJTBOUND , P_NOOVERLAY , + P_LESSPEDANTIC, P_NOGCSE , P_CALLEE_SAVES, P_EXCLUDE , - P_LOOPREV + P_NOIV , + P_LOOPREV , + P_OVERLAY_ /* I had a strange conflict with P_OVERLAY while */ + /* cross-compiling for MINGW32 with gcc 3.2 */ }; %} @@ -85,15 +88,14 @@ struct options save_options ; %% "_asm" { count(); - asmp = asmbuff = Safe_realloc (asmbuff, INITIAL_INLINEASM); + asmp = asmbuff = realloc (asmbuff, INITIAL_INLINEASM); asmbuffSize=INITIAL_INLINEASM; BEGIN(asm) ; } "_endasm" { count(); *asmp = '\0'; - yylval.yyinline = Safe_calloc (1, strlen(asmbuff)+1); - strcpy(yylval.yyinline,asmbuff); + yylval.yyinline = strdup (asmbuff); BEGIN(INITIAL); return (INLINEASM); } @@ -102,7 +104,7 @@ struct options save_options ; // increase the buffersize with 50% int size=asmp-asmbuff; asmbuffSize=asmbuffSize*3/2; - asmbuff = Safe_realloc (asmbuff, asmbuffSize); + asmbuff = realloc (asmbuff, asmbuffSize); asmp=asmbuff+size; } *asmp++ = yytext[0]; @@ -113,12 +115,11 @@ struct options save_options ; // increase the buffersize with 50% int size=asmp-asmbuff; asmbuffSize=asmbuffSize*3/2; - asmbuff = Safe_realloc (asmbuff, asmbuffSize); + asmbuff = realloc (asmbuff, asmbuffSize); asmp=asmbuff+size; } *asmp++ = '\n' ; } -"/*" { comment(); } "at" { count(); TKEYWORD(AT) ; } "auto" { count(); return(AUTO); } "bit" { count(); TKEYWORD(BIT) ; } @@ -172,22 +173,15 @@ struct options save_options ; "_naked" { count(); TKEYWORD(NAKED); } "while" { count(); return(WHILE); } "xdata" { count(); TKEYWORD(XDATA); } -"_data" { count(); TKEYWORD(_NEAR); } -"_code" { count(); TKEYWORD(_CODE); } -"_eeprom" { count(); TKEYWORD(_EEPROM); } -"_flash" { count(); TKEYWORD(_CODE); } -"_generic" { count(); TKEYWORD(_GENERIC); } -"_near" { count(); TKEYWORD(_NEAR); } -"_sram" { count(); TKEYWORD(_XDATA);} -"_xdata" { count(); TKEYWORD(_XDATA);} -"_pdata" { count(); TKEYWORD(_PDATA); } -"_idata" { count(); TKEYWORD(_IDATA); } "..." { count(); return(VAR_ARGS);} +"__typeof" { count(); return TYPEOF;} +"_JavaNative" { count(); TKEYWORD(JAVANATIVE);} +"_overlay" { count(); TKEYWORD(OVERLAY);} {L}({L}|{D})* { count(); return(check_type()); } 0[xX]{H}+{IS}? { count(); yylval.val = constVal(yytext); return(CONSTANT); } 0{D}+{IS}? { count(); yylval.val = constVal(yytext); return(CONSTANT); } {D}+{IS}? { count(); yylval.val = constVal(yytext); return(CONSTANT); } -'(\\.|[^\\'])+' { count();yylval.val = charVal (yytext); return(CONSTANT); } +'(\\.|[^\\'])+' { count();yylval.val = charVal (yytext); return(CONSTANT); /* ' make syntax highliter happy */} {D}+{E}{FS}? { count(); yylval.val = constFloatVal(yytext);return(CONSTANT); } {D}*"."{D}+({E})?{FS}? { count(); yylval.val = constFloatVal(yytext);return(CONSTANT); } {D}+"."{D}*({E})?{FS}? { count(); yylval.val = constFloatVal(yytext);return(CONSTANT); } @@ -245,9 +239,17 @@ struct options save_options ; "\r\n" { count(); } "\n" { count(); } [ \t\v\f] { count(); } +\\ { + char ch=input(); + if (ch!='\n') { + // that could have been removed by the preprocessor anyway + werror (W_STRAY_BACKSLASH, column); + unput(ch); + } +} . { count() ; } %% - + int checkCurrFile ( char *s) { char lineNum[10] ; @@ -275,8 +277,8 @@ int checkCurrFile ( char *s) /* set the current line number to */ /* line number if printFlag is on */ if (!*s) { - yylineno = lNum ; - return 0; + lineno = yylineno = lNum ; + return 0; } /* if we have a filename then check */ @@ -284,136 +286,143 @@ int checkCurrFile ( char *s) /* get the currentfile name info */ s++ ; - if ( strncmp(s,fullSrcFileName,strlen(fullSrcFileName)) == 0) { - yylineno = lNum - 2; - currFname = fullSrcFileName ; + /* in c1mode fullSrcFileName is NULL */ + if ( fullSrcFileName && + strncmp(s,fullSrcFileName,strlen(fullSrcFileName)) == 0) { + lineno = yylineno = lNum; + currFname = fullSrcFileName ; } else { char *sb = s; /* mark the end of the filename */ while (*s != '"') s++; *s = '\0'; - currFname = Safe_calloc(1,strlen(sb)+1); - strcpy(currFname,sb); - yylineno = lNum - 2; + currFname = strdup (sb); + lineno = yylineno = lNum; } filename = currFname ; return 0; } -void comment() -{ - char c, c1; - - loop: - while ((c = input()) != '*' && c) - if ( c == '\n') - yylineno++ ; - - if (c && (c1 = input()) != '/') { - unput(c1); - goto loop; - } -} - - - int column = 0; int plineIdx=0; void count() { - int i; - for (i = 0; yytext[i] != '\0'; i++) { - if (yytext[i] == '\n') { - column = 0; - lineno = ++yylineno ; - } - else - if (yytext[i] == '\t') - column += 8 - (column % 8); - else - column++; - } - - /* ECHO; */ + int i; + for (i = 0; yytext[i] != '\0'; i++) { + if (yytext[i] == '\n') { + column = 0; + lineno = ++yylineno ; + } + else + if (yytext[i] == '\t') + column += 8 - (column % 8); + else + column++; + } + /* ECHO; */ } int check_type() { /* check if it is in the typedef table */ if (findSym(TypedefTab,NULL,yytext)) { - strcpy(yylval.yychar,yytext); + strncpyz(yylval.yychar,yytext, SDCC_NAME_MAX); return (TYPE_NAME) ; } else { - strcpy (yylval.yychar,yytext); + strncpyz (yylval.yychar,yytext, SDCC_NAME_MAX); return(IDENTIFIER); } } -char strLitBuff[2048] ; - /* * Change by JTV 2001-05-19 to not concantenate strings * to support ANSI hex and octal escape sequences in string liteals */ -char *stringLiteral () { +char *stringLiteral() +{ +#define STR_BUF_CHUNCK_LEN 1024 int ch; - char *str = strLitBuff; - - *str++ = '\"'; + static struct dbuf_s dbuf; + char buf[2]; + + if (dbuf.alloc == 0) + dbuf_init(&dbuf, STR_BUF_CHUNCK_LEN); + else + dbuf_set_size(&dbuf, 0); + + + dbuf_append(&dbuf, "\"", 1); /* put into the buffer till we hit the first \" */ - - while (1) { - ch = input(); - - if (!ch) - break; /* end of input */ - - /* if it is a \ then escape char's are allowed */ - if (ch == '\\') { - *str++ = ch; /* backslash in place */ - *str++=input(); /* get the escape char, no check */ - continue; /* carry on */ - } - - /* if new line we have a new line break */ - if (ch == '\n') { - yylineno++; - continue; - } - - /* if this is a quote then we have work to do */ - /* find the next non whitespace character */ - /* if that is a double quote then carry on */ - if (ch == '\"') { - *str++ = ch ; /* Pass end of this string or substring to evaluator */ - + + while ((ch = input()) != 0) { + switch (ch) { + case '\\': + /* if it is a \ then escape char's are allowed */ + ch = input(); + if (ch == '\n') { + /* \ is a continuator */ + lineno = ++yylineno; + column = 0; + } + else { + buf[0] = '\\'; + buf[1] = ch; + dbuf_append(&dbuf, buf, 2); /* get the escape char, no further check */ + } + break; /* carry on */ + + case '\n': + /* if new line we have a new line break, which is illegal */ + werror(W_NEWLINE_IN_STRING); + dbuf_append(&dbuf, "\n", 1); + lineno = ++yylineno; + column = 0; + break; + + case '"': + /* if this is a quote then we have work to do */ + /* find the next non whitespace character */ + /* if that is a double quote then carry on */ + dbuf_append(&dbuf, "\"", 1); /* Pass end of this string or substring to evaluator */ while ((ch = input()) && (isspace(ch) || ch=='\\')) { - switch (ch) { - case '\\': - werror (W_STRAY_BACKSLASH, filename, yylineno); - break; - case '\n': - yylineno++; - break; - } + switch (ch) { + case '\\': + if ((ch = input()) != '\n') { + werror(W_STRAY_BACKSLASH, column); + unput(ch); + } + else { + lineno = ++yylineno; + column = 0; + } + break; + + case '\n': + yylineno++; + break; + } } if (!ch) - break; - + goto out; + if (ch != '\"') { - unput(ch) ; - break ; + unput(ch) ; + goto out; } + break; + + default: + buf[0] = ch; + dbuf_append(&dbuf, buf, 1); /* Put next substring introducer into output string */ } - *str++ = ch; /* Put next substring introducer into output string */ - } - *str = '\0'; - - return strLitBuff; + } + +out: + return (char *)dbuf_c_str(&dbuf); } void doPragma (int op, char *cp) @@ -448,21 +457,29 @@ void doPragma (int op, char *cp) case P_NOOVERLAY: options.noOverlay = 1; break; + case P_LESSPEDANTIC: + options.lessPedantic = 1; + break; case P_CALLEE_SAVES: { int i=0; /* append to the functions already listed in callee-saves */ for (; options.calleeSaves[i] ;i++); - parseWithComma(&options.calleeSaves[i],strdup(cp)); + parseWithComma(&options.calleeSaves[i], Safe_strdup(cp)); } break; case P_EXCLUDE: - parseWithComma(options.excludeRegs,strdup(cp)); + parseWithComma(options.excludeRegs, Safe_strdup(cp)); + break; + case P_NOIV: + options.noiv = 1; break; case P_LOOPREV: optimize.noLoopReverse = 1; break; + case P_OVERLAY_: + break; /* notyet */ } } @@ -533,6 +550,11 @@ int process_pragma(char *s) return 0; } + if (strncmp(cp,PRAGMA_LESSPEDANTIC,strlen(PRAGMA_LESSPEDANTIC)) == 0) { + doPragma(P_LESSPEDANTIC,cp+strlen(PRAGMA_LESSPEDANTIC)); + return 0; + } + if (strncmp(cp,PRAGMA_CALLEESAVES,strlen(PRAGMA_CALLEESAVES)) == 0) { doPragma(P_CALLEE_SAVES,cp+strlen(PRAGMA_CALLEESAVES)); return 0; @@ -543,8 +565,13 @@ int process_pragma(char *s) return 0; } + if (strncmp(cp,PRAGMA_NOIV,strlen(PRAGMA_NOIV)) == 0) { + doPragma(P_NOIV,cp+strlen(PRAGMA_NOIV)); + return 0; + } + if (strncmp(cp,PRAGMA_NOLOOPREV,strlen(PRAGMA_NOLOOPREV)) == 0) { - doPragma(P_EXCLUDE,NULL); + doPragma(P_LOOPREV,NULL); return 0; } @@ -574,10 +601,13 @@ int yyerror(char *s) { fflush(stdout); - if (yylineno && filename) - fprintf(stdout,"\n%s(%d) %s: token -> '%s' ; column %d\n", - filename,yylineno, - s,yytext,column); - fatalError++; + if (yylineno && filename) { + fprintf(stdout,"\n%s:%d: %s: token -> '%s' ; column %d\n", + filename,yylineno, + s,yytext,column); + fatalError++; + } else { + // this comes from an empy file, no problem + } return 0; }