X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCC.lex;h=e0038cc65202abf5aa30a0557481a7cfa8a14573;hb=7575290515a0fd3b571a609d33d7e655a0a28186;hp=7fbe4e7f456ff670b835ff1518fd85f10682ee9e;hpb=c03aeb7c6e0f49d55a275fa3cfc63a380d6c57cf;p=fw%2Fsdcc diff --git a/src/SDCC.lex b/src/SDCC.lex index 7fbe4e7f..e0038cc6 100644 --- a/src/SDCC.lex +++ b/src/SDCC.lex @@ -1,6 +1,6 @@ /*----------------------------------------------------------------------- - SDCC.lex - lexical analyser for use with sdcc ( a freeware compiler for - 8/16 bit microcontrollers) + SDCC.lex - lexical analyser for use with sdcc (free open source + compiler for 8/16 bit microcontrollers) Written by : Sandeep Dutta . sandeep.dutta@usa.net (1997) This program is free software; you can redistribute it and/or modify it @@ -23,8 +23,7 @@ -------------------------------------------------------------------------*/ D [0-9] -L [a-zA-Z_] -L_DOLL [a-zA-Z_$] +L [a-zA-Z_$] H [a-fA-F0-9] E [Ee][+-]?{D}+ FS (f|F|l|L) @@ -50,10 +49,15 @@ extern char *filename; extern int lineno; int column = 0; /* current column */ +/* global definitions */ +char *lexFilename; +int lexLineno = 1; + /* local definitions */ static struct dbuf_s asmbuff; /* reusable _asm buffer */ /* forward declarations */ +int yyerror(char *s); static const char *stringLiteral(void); static void count(void); static void count_char(int); @@ -187,15 +191,13 @@ _?"_asm" { "__overlay" { count(); TKEYWORD(OVERLAY); } "inline" { count(); TKEYWORD99(INLINE); } "restrict" { count(); TKEYWORD99(RESTRICT); } -{L}({L}|{D})* { count(); return(check_type()); } -{L_DOLL}({L_DOLL}|{D})* { - if (options.dollars_in_ident) +{L}({L}|{D})* { + if (!options.dollars_in_ident && strchr(yytext, '$')) { - count(); - return(check_type()); + yyerror("stray '$' in program"); } - else - REJECT; + count(); + return(check_type()); } 0[xX]{H}+{IS}? { count(); yylval.val = constVal(yytext); return(CONSTANT); } 0[0-7]*{IS}? { count(); yylval.val = constVal(yytext); return(CONSTANT); } @@ -303,7 +305,7 @@ static int checkCurrFile (const char *s) s = tptr; /* adjust the line number */ - lineno = lNum; + lineno = lexLineno = lNum; /* now see if we have a file name */ while (*s != '"' && *s) @@ -323,20 +325,26 @@ static int checkCurrFile (const char *s) if (fullSrcFileName && strncmp(s, fullSrcFileName, strlen(fullSrcFileName)) == 0 && fullSrcFileName[strlen(fullSrcFileName) - 1] == '"') { - filename = fullSrcFileName; + lexFilename = fullSrcFileName; } else { const char *sb = s; + char *tmpFname; - /* find the end of the filename */ + /* find the end of the file name */ while (*s && *s != '"') ++s; - filename = Safe_malloc(s - sb + 1); - memcpy(filename, sb, s - sb); - filename[s - sb] = '\0'; + tmpFname = Safe_malloc(s - sb + 1); + memcpy(tmpFname, sb, s - sb); + tmpFname[s - sb] = '\0'; + + lexFilename = Safe_malloc(s - sb + 1); + copyStr(lexFilename, tmpFname); } + filename = lexFilename; + return 0; } @@ -346,7 +354,7 @@ static void count_char(int ch) { case '\n': column = 0; - ++lineno; + lineno = ++lexLineno; break; case '\t': @@ -493,8 +501,10 @@ static const char *stringLiteral(void) dbuf_destroy(&linebuf); } else - unput(ch); - break; + { + unput(ch); + goto out; + } default: count_char(ch); @@ -1121,10 +1131,10 @@ int yyerror(char *s) if(options.vc_err_style) fprintf(stderr, "\n%s(%d) : %s: token -> '%s' ; column %d\n", - filename, lineno, s, yytext, column); + lexFilename, lexLineno, s, yytext, column); else fprintf(stderr, "\n%s:%d: %s: token -> '%s' ; column %d\n", - filename, lineno, s ,yytext, column); + lexFilename, lexLineno, s ,yytext, column); fatalError++; return 0;