#include <stdio.h>
#include <string.h>
#include <ctype.h>
-#include "SDCCglobl.h"
-#include "SDCCsymt.h"
-#include "SDCCval.h"
-#include "SDCCast.h"
-#include "SDCCy.h"
-#include "SDCChasht.h"
-#include "SDCCmem.h"
+#include "common.h"
+#include "newalloc.h"
char *stringLiteral();
char *currFname;
{
return(1);
}
-
+#define TKEYWORD(token) return (isTargetKeyword(yytext) ? token :\
+ check_type(yytext))
char asmbuff[MAX_INLINEASM] ;
char *asmp ;
-extern int check_type ( );
+extern int check_type ();
+ extern int isTargetKeyword ();
extern int checkCurrFile (char *);
extern int processPragma (char *);
extern int printListing (int );
<asm>. { *asmp++ = yytext[0] ; }
<asm>\n { count(); *asmp++ = '\n' ;}
"/*" { comment(); }
-"at" { count(); return(AT) ; }
-"auto" { count(); return(AUTO); }
-"bit" { count(); return(BIT) ; }
-"break" { count(); return(BREAK); }
-"case" { count(); return(CASE); }
+"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(); return(CODE); }
+"code" { count(); TKEYWORD(CODE); }
"const" { count(); return(CONST); }
"continue" { count(); return(CONTINUE); }
-"critical" { count(); return(CRITICAL); }
-"data" { count(); return(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(); return(XDATA); }
+"far" { count(); TKEYWORD(XDATA); }
+"eeprom" { count(); TKEYWORD(EEPROM); }
"float" { count(); return(FLOAT); }
+"flash" { count(); TKEYWORD(CODE);}
"for" { count(); return(FOR); }
"goto" { count(); return(GOTO); }
-"idata" { count(); return(IDATA);}
+"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(); return(DATA);}
-"pdata" { count(); return(PDATA); }
-"reentrant" { count(); return(REENTRANT);}
+"near" { count(); TKEYWORD(DATA);}
+"pdata" { count(); TKEYWORD(PDATA); }
+"reentrant" { count(); TKEYWORD(REENTRANT);}
"register" { count(); return(REGISTER); }
"return" { count(); return(RETURN); }
-"sfr" { count(); return(SFR) ; }
-"sbit" { count(); return(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);}
"static" { count(); return(STATIC); }
"struct" { count(); return(STRUCT); }
"switch" { count(); return(SWITCH); }
"unsigned" { count(); return(UNSIGNED); }
"void" { count(); return(VOID); }
"volatile" { count(); return(VOLATILE); }
-"using" { count(); return(USING); }
+"using" { count(); TKEYWORD(USING); }
"while" { count(); return(WHILE); }
-"xdata" { count(); return(XDATA); }
-"_data" { count(); return(_NEAR); }
-"_code" { count(); return(_CODE); }
-"_generic" { count(); return(_GENERIC); }
-"_near" { count(); return(_NEAR); }
-"_xdata" { count(); return(_XDATA);}
-"_pdata" { count () ; return(_PDATA); }
-"_idata" { count () ; return(_IDATA); }
-"..." { count(); return(VAR_ARGS);}
+"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);}
{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); }
"==" { 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('='); }
/* mark the end of the filename */
while (*s != '"') s++;
*s = '\0';
- ALLOC_ATOMIC(currFname,strlen(sb)+1);
+ currFname = Safe_calloc(1,strlen(sb)+1);
strcpy(currFname,sb);
yylineno = lNum - 2;
}
(*s != '\n'))
s++ ;
+ /* First give the port a chance */
+ if (port->process_pragma && !port->process_pragma(cp))
+ return 0;
+
/* now compare and do what needs to be done */
if (strncmp(cp,PRAGMA_SAVE,strlen(PRAGMA_SAVE)) == 0) {
doPragma(P_SAVE,cp+strlen(PRAGMA_SAVE));
werror(W_UNKNOWN_PRAGMA,cp);
return 0;
}
+
+/* will return 1 if the string is a part
+ of a target specific keyword */
+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;
+ }
+
+ return 0;
+}
+
+extern int fatalError;
+
+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++;
+ return 0;
+}