From aa19331a763254d88391d0d953725162a654da14 Mon Sep 17 00:00:00 2001 From: borutr Date: Fri, 31 Oct 2003 10:32:26 +0000 Subject: [PATCH] sdcc now understands both formats: '# ' and '#line ' git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2971 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- src/SDCC.lex | 286 ++++++++++++++++++++++++++------------------------- 1 file changed, 144 insertions(+), 142 deletions(-) diff --git a/src/SDCC.lex b/src/SDCC.lex index 04aacc53..3b537bbd 100644 --- a/src/SDCC.lex +++ b/src/SDCC.lex @@ -81,47 +81,47 @@ static int checkCurrFile(char *s); . { dbuf_append(&asmbuff, yytext, 1); } -"at" { count(); TKEYWORD(AT) ; } -"auto" { count(); return(AUTO); } -"bit" { count(); TKEYWORD(BIT) ; } +"at" { count(); TKEYWORD(AT); } +"auto" { count(); return(AUTO); } +"bit" { count(); TKEYWORD(BIT); } "break" { count(); return(BREAK); } "case" { count(); return(CASE); } "char" { count(); return(CHAR); } "code" { count(); TKEYWORD(CODE); } "const" { count(); return(CONST); } "continue" { count(); return(CONTINUE); } -"critical" { count(); TKEYWORD(CRITICAL); } -"data" { count(); TKEYWORD(DATA); } +"critical" { count(); TKEYWORD(CRITICAL); } +"data" { count(); TKEYWORD(DATA); } "default" { count(); return(DEFAULT); } "do" { count(); return(DO); } "double" { count(); werror(W_DOUBLE_UNSUPPORTED);return(FLOAT); } "else" { count(); return(ELSE); } "enum" { count(); return(ENUM); } "extern" { count(); return(EXTERN); } -"far" { count(); TKEYWORD(XDATA); } -"eeprom" { count(); TKEYWORD(EEPROM); } +"far" { count(); TKEYWORD(XDATA); } +"eeprom" { count(); TKEYWORD(EEPROM); } "float" { count(); return(FLOAT); } -"flash" { count(); TKEYWORD(CODE);} +"flash" { count(); TKEYWORD(CODE); } "for" { count(); return(FOR); } -"goto" { count(); return(GOTO); } -"idata" { count(); TKEYWORD(IDATA);} +"goto" { count(); return(GOTO); } +"idata" { count(); TKEYWORD(IDATA); } "if" { count(); return(IF); } "int" { count(); return(INT); } -"interrupt" { count(); return(INTERRUPT);} -"nonbanked" { count(); TKEYWORD(NONBANKED);} -"banked" { count(); TKEYWORD(BANKED);} -"long" { count(); return(LONG); } -"near" { count(); TKEYWORD(DATA);} +"interrupt" { count(); return(INTERRUPT); } +"nonbanked" { count(); TKEYWORD(NONBANKED); } +"banked" { count(); TKEYWORD(BANKED); } +"long" { count(); return(LONG); } +"near" { count(); TKEYWORD(DATA); } "pdata" { count(); TKEYWORD(PDATA); } -"reentrant" { count(); TKEYWORD(REENTRANT);} +"reentrant" { count(); TKEYWORD(REENTRANT); } "register" { count(); return(REGISTER); } "return" { count(); return(RETURN); } -"sfr" { count(); TKEYWORD(SFR) ; } -"sbit" { count(); TKEYWORD(SBIT) ; } +"sfr" { count(); TKEYWORD(SFR); } +"sbit" { count(); TKEYWORD(SBIT); } "short" { count(); return(SHORT); } "signed" { count(); return(SIGNED); } "sizeof" { count(); return(SIZEOF); } -"sram" { count(); TKEYWORD(XDATA);} +"sram" { count(); TKEYWORD(XDATA); } "static" { count(); return(STATIC); } "struct" { count(); return(STRUCT); } "switch" { count(); return(SWITCH); } @@ -134,29 +134,29 @@ static int checkCurrFile(char *s); "_naked" { count(); TKEYWORD(NAKED); } "while" { count(); return(WHILE); } "xdata" { count(); TKEYWORD(XDATA); } -"..." { count(); return(VAR_ARGS);} -"__typeof" { count(); return TYPEOF;} -"_JavaNative" { count(); TKEYWORD(JAVANATIVE);} -"_overlay" { count(); TKEYWORD(OVERLAY);} +"..." { 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); /* ' make syntax highliter happy */} +'(\\.|[^\\'])+' { 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); } -\" { count(); yylval.val=strVal(stringLiteral()); return(STRING_LITERAL);} +{D}+"."{D}*({E})?{FS}? { count(); yylval.val = constFloatVal(yytext);return(CONSTANT); } +\" { count(); yylval.val=strVal(stringLiteral()); return(STRING_LITERAL); } ">>=" { count(); yylval.yyint = RIGHT_ASSIGN ; return(RIGHT_ASSIGN); } -"<<=" { count(); yylval.yyint = LEFT_ASSIGN ; return(LEFT_ASSIGN) ; } -"+=" { count(); yylval.yyint = ADD_ASSIGN ; return(ADD_ASSIGN) ; } -"-=" { count(); yylval.yyint = SUB_ASSIGN ; return(SUB_ASSIGN) ; } -"*=" { count(); yylval.yyint = MUL_ASSIGN ; return(MUL_ASSIGN) ; } -"/=" { count(); yylval.yyint = DIV_ASSIGN ; return(DIV_ASSIGN) ; } -"%=" { count(); yylval.yyint = MOD_ASSIGN ; return(MOD_ASSIGN) ; } -"&=" { count(); yylval.yyint = AND_ASSIGN ; return(AND_ASSIGN) ; } -"^=" { count(); yylval.yyint = XOR_ASSIGN ; return(XOR_ASSIGN) ; } -"|=" { count(); yylval.yyint = OR_ASSIGN ; return(OR_ASSIGN) ; } +"<<=" { count(); yylval.yyint = LEFT_ASSIGN ; return(LEFT_ASSIGN); } +"+=" { count(); yylval.yyint = ADD_ASSIGN ; return(ADD_ASSIGN); } +"-=" { count(); yylval.yyint = SUB_ASSIGN ; return(SUB_ASSIGN); } +"*=" { count(); yylval.yyint = MUL_ASSIGN ; return(MUL_ASSIGN); } +"/=" { count(); yylval.yyint = DIV_ASSIGN ; return(DIV_ASSIGN); } +"%=" { count(); yylval.yyint = MOD_ASSIGN ; return(MOD_ASSIGN); } +"&=" { count(); yylval.yyint = AND_ASSIGN ; return(AND_ASSIGN); } +"^=" { count(); yylval.yyint = XOR_ASSIGN ; return(XOR_ASSIGN); } +"|=" { count(); yylval.yyint = OR_ASSIGN ; return(OR_ASSIGN); } ">>" { count(); return(RIGHT_OP); } "<<" { count(); return(LEFT_OP); } "++" { count(); return(INC_OP); } @@ -169,8 +169,8 @@ static int checkCurrFile(char *s); "==" { count(); return(EQ_OP); } "!=" { count(); return(NE_OP); } ";" { count(); return(';'); } -"{" { count(); NestLevel++ ; return('{'); } -"}" { count(); NestLevel--; return('}'); } +"{" { count(); NestLevel++ ; return('{'); } +"}" { count(); NestLevel--; return('}'); } "," { count(); return(','); } ":" { count(); return(':'); } "=" { count(); return('='); } @@ -192,13 +192,13 @@ static int checkCurrFile(char *s); "^" { count(); return('^'); } "|" { count(); return('|'); } "?" { count(); return('?'); } -^#line.*"\n" { count(); checkCurrFile(yytext); } -^#pragma.*"\n" { count(); process_pragma(yytext); } +^#pragma.*"\n" { count(); process_pragma(yytext); } +^(#line.*"\n")|(#.*"\n") { count(); checkCurrFile(yytext); } -^[^(]+"("[0-9]+") : error"[^\n]+ { werror(E_PRE_PROC_FAILED,yytext);count(); } -^[^(]+"("[0-9]+") : warning"[^\n]+ { werror(W_PRE_PROC_WARNING,yytext);count(); } -"\r\n" { count(); } -"\n" { count(); } +^[^(]+"("[0-9]+") : error"[^\n]+ { werror(E_PRE_PROC_FAILED, yytext); count(); } +^[^(]+"("[0-9]+") : warning"[^\n]+ { werror(W_PRE_PROC_WARNING, yytext); count(); } +"\r\n" { count(); } +"\n" { count(); } [ \t\v\f] { count(); } \\ { int ch = input(); @@ -208,7 +208,7 @@ static int checkCurrFile(char *s); unput(ch); } } -. { count() ; } +. { count(); } %% /* flex 2.5.31 undefines yytext_ptr, so we have to define it again */ @@ -219,93 +219,97 @@ static int checkCurrFile(char *s); static int checkCurrFile (char *s) { - char lineNum[10] ; - int lNum ; - char *tptr ; - - /* first check if this is a #line */ - if ( strncmp(s,"#line",5) ) - return 0 ; - - /* get to the line number */ - while (!isdigit(*s)) - s++ ; - tptr = lineNum ; - while (isdigit(*s)) - *tptr++ = *s++ ; - *tptr = '\0'; - sscanf(lineNum,"%d",&lNum); - + int lNum; + char *tptr; + + /* skip '#' character */ + if (*s++ != '#') + return 0; + + /* check if this is a #line + this is not standard and can be removed in the future */ +#define LINE_STR "line" +#define LINE_LEN ((sizeof LINE_STR) - 1) + + if (strncmp(s, LINE_STR, LINE_LEN) == 0) + s += LINE_LEN; + + /* get the line number */ + lNum = strtol(s, &tptr, 10); + if (tptr == s || !isspace(*tptr)) + return 0; + s = tptr; + /* now see if we have a file name */ - while (*s != '\"' && *s) - s++ ; - + while (*s != '\"' && *s) + s++; + /* if we don't have a filename then */ /* set the current line number to */ /* line number if printFlag is on */ - if (!*s) { - lineno = mylineno = lNum ; + if (!*s) { + lineno = mylineno = lNum; return 0; } - + /* if we have a filename then check */ /* if it is "standard in" if yes then */ /* get the currentfile name info */ s++ ; /* in c1mode fullSrcFileName is NULL */ - if ( fullSrcFileName && - strncmp(s,fullSrcFileName,strlen(fullSrcFileName)) == 0) { - lineno = mylineno = lNum; - currFname = fullSrcFileName ; - } else { - char *sb = s; - /* mark the end of the filename */ - while (*s != '"') s++; - *s = '\0'; - currFname = strdup (sb); - lineno = mylineno = lNum; + if (fullSrcFileName && + strncmp(s, fullSrcFileName, strlen(fullSrcFileName)) == 0) { + lineno = mylineno = lNum; + currFname = fullSrcFileName; + } else { + char *sb = s; + /* mark the end of the filename */ + while (*s != '"') s++; + *s = '\0'; + currFname = strdup (sb); + lineno = mylineno = lNum; } filename = currFname ; return 0; } - + int column = 0; int plineIdx =0; static void count(void) { int i; - for (i = 0; yytext[i] != '\0'; i++) { - if (yytext[i] == '\n') { + for (i = 0; yytext[i] != '\0'; i++) { + if (yytext[i] == '\n') { column = 0; - lineno = ++mylineno ; + lineno = ++mylineno; } - else + else if (yytext[i] == '\t') - column += 8 - (column % 8); + column += 8 - (column % 8); else - column++; + column++; } /* ECHO; */ } static int check_type(void) { - /* check if it is in the typedef table */ - if (findSym(TypedefTab,NULL,yytext)) { - strncpyz(yylval.yychar,yytext, SDCC_NAME_MAX); - return (TYPE_NAME) ; - } - else { - strncpyz (yylval.yychar,yytext, SDCC_NAME_MAX); - return(IDENTIFIER); - } + /* check if it is in the typedef table */ + if (findSym(TypedefTab, NULL, yytext)) { + strncpyz(yylval.yychar, yytext, SDCC_NAME_MAX); + return (TYPE_NAME); + } + else { + strncpyz (yylval.yychar, yytext, SDCC_NAME_MAX); + return(IDENTIFIER); + } } /* * Change by JTV 2001-05-19 to not concantenate strings - * to support ANSI hex and octal escape sequences in string liteals + * to support ANSI hex and octal escape sequences in string liteals */ static char *stringLiteral(void) @@ -320,7 +324,6 @@ static char *stringLiteral(void) else dbuf_set_size(&dbuf, 0); - dbuf_append(&dbuf, "\"", 1); /* put into the buffer till we hit the first \" */ @@ -373,11 +376,11 @@ static char *stringLiteral(void) } } - if (!ch) + if (!ch) goto out; if (ch != '\"') { - unput(ch) ; + unput(ch); goto out; } break; @@ -395,19 +398,19 @@ out: enum pragma_id { P_SAVE = 1, - P_RESTORE , + P_RESTORE, P_NOINDUCTION, P_NOINVARIANT, - P_INDUCTION , - P_STACKAUTO , - P_NOJTBOUND , - P_NOOVERLAY , + P_INDUCTION, + P_STACKAUTO, + P_NOJTBOUND, + P_NOOVERLAY, P_LESSPEDANTIC, - P_NOGCSE , + P_NOGCSE, P_CALLEE_SAVES, - P_EXCLUDE , - P_NOIV , - P_LOOPREV , + P_EXCLUDE, + P_NOIV, + P_LOOPREV, P_OVERLAY_ /* I had a strange conflict with P_OVERLAY while */ /* cross-compiling for MINGW32 with gcc 3.2 */ }; @@ -500,15 +503,15 @@ static void doPragma(int op, char *cp) break; case P_NOINDUCTION: - optimize.loopInduction = 0 ; + optimize.loopInduction = 0; break; case P_NOINVARIANT: - optimize.loopInvariant = 0 ; + optimize.loopInvariant = 0; break; case P_INDUCTION: - optimize.loopInduction = 1 ; + optimize.loopInduction = 1; break; case P_STACKAUTO: @@ -559,8 +562,9 @@ static void doPragma(int op, char *cp) static int process_pragma(char *s) { -#define NELEM(x) (sizeof (x) / sizeof (x)[0]) -#define PRAGMA "#pragma" +#define NELEM(x) (sizeof (x) / sizeof (x)[0]) +#define PRAGMA_STR "#pragma" +#define PRAGMA_LEN ((sizeof PRAGMA_STR) - 1) static struct pragma_s { const char *name; @@ -586,18 +590,18 @@ static int process_pragma(char *s) int i; /* find the pragma */ - while (strncmp(s, PRAGMA, (sizeof PRAGMA) - 1)) + while (strncmp(s, PRAGMA_STR, PRAGMA_LEN)) s++; - s += (sizeof PRAGMA) - 1; - + s += PRAGMA_LEN; + /* look for the directive */ while(isspace(*s)) s++; cp = s; /* look for the end of the directive */ - while ((!isspace(*s)) && (*s != '\n')) - s++ ; + while ((!isspace(*s)) && (*s != '\n')) + s++ ; /* First give the port a chance */ if (port->process_pragma && !port->process_pragma(cp)) @@ -621,15 +625,15 @@ static int process_pragma(char *s) of a target specific keyword */ static int isTargetKeyword(char *s) { - int i; - - if (port->keywords == NULL) - return 0; - for ( i = 0 ; port->keywords[i] ; i++ ) { - if (strcmp(port->keywords[i],s) == 0) - return 1; - } - + int i; + + if (port->keywords == NULL) + return 0; + for (i = 0 ; port->keywords[i] ; i++ ) { + if (strcmp(port->keywords[i],s) == 0) + return 1; + } + return 0; } @@ -643,20 +647,18 @@ int yywrap(void) int yyerror(char *s) { - fflush(stdout); - - if (mylineno && filename) { - if(options.vc_err_style) - fprintf(stderr,"\n%s(%d) : %s: token -> '%s' ; column %d\n", - filename,mylineno, - s,yytext,column); - else - fprintf(stderr,"\n%s:%d: %s: token -> '%s' ; column %d\n", - filename,mylineno, - s,yytext,column); - fatalError++; - } else { - /* this comes from an empy file, no problem */ - } - return 0; + fflush(stdout); + + if (mylineno && filename) { + if(options.vc_err_style) + fprintf(stderr, "\n%s(%d) : %s: token -> '%s' ; column %d\n", + filename, mylineno, s, yytext, column); + else + fprintf(stderr, "\n%s:%d: %s: token -> '%s' ; column %d\n", + filename, mylineno, s ,yytext, column); + fatalError++; + } else { + /* this comes from an empy file, no problem */ + } + return 0; } -- 2.30.2