*** empty log message ***
[fw/sdcc] / src / SDCC.lex
index 365d56f27498e162b65761eccb9af0d863f11418..b67cda3da8f7c1fd7747e2eb381e20574cea6955 100644 (file)
@@ -39,12 +39,11 @@ IS       (u|U|l|L)*
 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
 
@@ -77,7 +76,8 @@ struct options  save_options  ;
      P_NOGCSE    ,
      P_CALLEE_SAVES,
      P_EXCLUDE   ,
-     P_LOOPREV
+     P_LOOPREV   ,
+     P_OVERLAY
  };
 
 %}
@@ -85,14 +85,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) ;
 }
 <asm>"_endasm" { 
   count();
   *asmp = '\0';
-  yylval.yyinline = Safe_calloc (1, strlen(asmbuff)+1);
+  yylval.yyinline = malloc (strlen(asmbuff)+1);
   strcpy(yylval.yyinline,asmbuff);
   BEGIN(INITIAL);
   return (INLINEASM);
@@ -102,7 +102,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 +113,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 +171,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 +237,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 +275,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 */
@@ -285,40 +285,21 @@ int checkCurrFile ( char *s)
     s++ ;
 
     if ( strncmp(s,fullSrcFileName,strlen(fullSrcFileName)) == 0) {
-           yylineno = lNum - 2;                                        
-           currFname = fullSrcFileName ;
+      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);
+       currFname = malloc (strlen(sb)+1);
        strcpy(currFname,sb);
-       yylineno = lNum - 2;
+       lineno = yylineno = lNum;
     }
     filename = currFname ;
     return 0;
 }
     
-void comment()
-{
-  char c, c1;
-  
- loop:
-  while ((c = input()) != '*' && c) {
-    if ( c == '\n') {
-      lineno=++yylineno;
-    }
-  }
-  
-  if (c && (c1 = input()) != '/') {
-    unput(c1);
-    goto loop;
-  }
-}
-   
-   
-
 int column = 0;
 int plineIdx=0;
 
@@ -375,13 +356,10 @@ char *stringLiteral () {
     /* if it is a \ then escape char's are allowed */
     if (ch == '\\') {
       ch=input();
-      if (ch=='\r') {
-       // input() translates \n into \r\n
-       if ((ch=input())!='\n') {
-         unput (ch);
-       }
+      if (ch=='\n') {
        /* \<newline> is a continuator */
        lineno=++yylineno;
+       column=0;
        continue;
       }
       *str++ = '\\'; /* backslash in place */
@@ -390,14 +368,11 @@ char *stringLiteral () {
     }
     
     /* if new line we have a new line break, which is illegal */
-    if (ch == '\r') {
-      // input() translates \n into \r\n
-      if ((ch=input())!='\n') {
-       unput (ch);
-      }
+    if (ch == '\n') {
       werror (W_NEWLINE_IN_STRING);
       *str++ = '\n';
       lineno=++yylineno;
+      column=0;
       continue;
     }
     
@@ -409,7 +384,13 @@ char *stringLiteral () {
       while ((ch = input()) && (isspace(ch) || ch=='\\')) {
        switch (ch) {
        case '\\':
-         //werror (W_STRAY_BACKSLASH)
+         if ((ch=input())!='\n') {
+           werror (W_STRAY_BACKSLASH, column);
+           unput(ch);
+         } else {
+           lineno=++yylineno;
+           column=0;
+         }
          break;
        case '\n':
          yylineno++;
@@ -419,7 +400,7 @@ char *stringLiteral () {
 
       if (!ch) 
        break; 
-      
+
       if (ch != '\"') {
        unput(ch) ;
        break ;
@@ -470,15 +451,17 @@ void doPragma (int op, char *cp)
            /* 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_LOOPREV:
        optimize.noLoopReverse = 1;
        break;
+    case P_OVERLAY:
+       break; /* notyet */
     }
 }
 
@@ -560,7 +543,7 @@ int process_pragma(char *s)
     }
 
     if (strncmp(cp,PRAGMA_NOLOOPREV,strlen(PRAGMA_NOLOOPREV)) == 0) {
-       doPragma(P_EXCLUDE,NULL);
+       doPragma(P_LOOPREV,NULL);
        return 0;
     }
 
@@ -590,10 +573,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;
 }