Added support fun for long shifts
[fw/sdcc] / src / SDCC.lex
index 23ee5a102f2bdba229f7acf7b93a1c03a0ba1100..92061f169ad503d380e5e4d61083acfd4329764d 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
 
@@ -118,7 +117,6 @@ struct options  save_options  ;
   }
   *asmp++ = '\n' ;
 }
-"/*"          { comment(); }
 "at"          { count(); TKEYWORD(AT)  ; }
 "auto"        { count(); return(AUTO); }
 "bit"         { count(); TKEYWORD(BIT) ; }
@@ -245,6 +243,14 @@ 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()    ; }
 %%
    
@@ -300,46 +306,24 @@ int checkCurrFile ( char *s)
     return 0;
 }
     
-void comment()
-{
-       char c, c1;
-
-loop:
-       while ((c = input()) != '*' && c != 0)
-               if ( c == '\n')
-                       yylineno++ ;
-
-       if ((c1 = input()) != '/' && c != 0)  {
-               if ( c1 == '\n' )
-                       yylineno++ ;
-
-               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()
@@ -355,69 +339,84 @@ int check_type()
        }
 }
 
-char strLitBuff[2048]                  ;
+char strLitBuff[2048]; // TODO: this is asking for the next bug :)
 
 /*
  * Change by JTV 2001-05-19 to not concantenate strings
  * to support ANSI hex and octal escape sequences in string liteals 
  */
 
-char *stringLiteral ()
-
-{
-int ch;
-char *str = strLitBuff                 ;
-
-*str++ = '\"'                  ;
-/* put into the buffer till we hit the */
-/* first \" */
-
-while (1) 
-  {
-  ch = input()                 ;
-
-  if (!ch)
-    break      ; /* end of input */
-
-  /* if it is a \ then everything allowed */
-
-  if (ch == '\\') 
-    {
-    *str++ = ch     ; /* backslash in place */
-    *str++ = input()           ; /* following char in place */
-    continue                   ;      /* carry on */
+char *stringLiteral () {
+  int ch;
+  char *str = strLitBuff;
+  
+  *str++ = '\"';
+  /* 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 == '\\') {
+      ch=input();
+      if (ch=='\n') {
+       /* \<newline> is a continuator */
+       lineno=++yylineno;
+       column=0;
+       continue;
+      }
+      *str++ = '\\'; /* backslash in place */
+      *str++ = ch; /* get the escape char, no further check */
+      continue; /* carry on */
     }
+    
+    /* if new line we have a new line break, which is illegal */
+    if (ch == '\n') {
+      werror (W_NEWLINE_IN_STRING);
+      *str++ = '\n';
+      lineno=++yylineno;
+      column=0;
+      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()) && (isspace(ch) || ch=='\\')) {
+       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 new line we have a new line break */
-  if (ch == '\n') 
-    break              ;
-
-  /* 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()) && isspace(ch)) ;
-
-    if (!ch) 
-      break ; 
+      if (!ch) 
+       break; 
 
-    if (ch != '\"') 
-      {
-      unput(ch) ;
-      break ;
+      if (ch != '\"') {
+       unput(ch) ;
+       break ;
       }
     }
-
-  *str++  = ch;              /* Put next substring introducer into output string */
+    *str++  = ch; /* Put next substring introducer into output string */
   }  
-
-*str = '\0';
-
-return strLitBuff                      ;
+  *str = '\0';
+  
+  return strLitBuff;
 }
 
 void doPragma (int op, char *cp)