From 9d1fe8a4103b93f4de17d0f80b3b80c687811754 Mon Sep 17 00:00:00 2001 From: Steve Chamberlain Date: Sun, 5 Apr 1992 01:47:16 +0000 Subject: New lexer. New targets for h8/300 simulator and DOS --- ld/ldlex.l | 817 +++++++++++++++++++++++++++---------------------------------- 1 file changed, 355 insertions(+), 462 deletions(-) (limited to 'ld/ldlex.l') diff --git a/ld/ldlex.l b/ld/ldlex.l index cf7fd47..147db3e 100644 --- a/ld/ldlex.l +++ b/ld/ldlex.l @@ -18,521 +18,414 @@ along with GLD; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* - * $Id$ - - * +This was written by steve chamberlain + sac@cygnus.com */ +typedef int bfd_vma; +#include +#include "ldgram.h" -/*SUPPRESS 529*/ -/*SUPPRESS 26*/ -/*SUPPRESS 29*/ -/*#define LEXDEBUG 0*/ -#include "bfd.h" -#include "sysdep.h" +int ldgram_in_defsym; +int ldgram_had_equals; +int ldgram_in_script; -#include -#include "ldlex.h" +int hex_mode; +extern int fgetc(); +extern int yyparse(); -#include "ld.h" -#include "ldexp.h" -#include "ldgram.h" -#include "ldmisc.h" -#undef input -#undef unput -#define input lex_input -#define unput lex_unput -int debug; +char *buystring(); +int lineno = 1; +int old; -static boolean ldgram_in_defsym; -static boolean ldgram_had_equals; -extern boolean ldgram_in_script; -static char *command_line; +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) yy_input(buf, &result, max_size) +#undef YY_FATAL_ERROR +#define YY_FATAL_ERROR ; +#define MAX_INCLUDE_DEPTH 10 +YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; +unsigned int include_stack_ptr = 0; -extern int fgetc(); -extern int yyparse(); -typedef struct { - char *name; -int value; -} keyword_type; +/* FOUR STATES + COMMAND on command line + COMMENT in a C comment + EXPRESSION definiatelyt in an expression + SCRIPT definately in a script + SOMEWHERE either EXPRESSION or SCRIPT +*/ #define RTOKEN(x) { yylval.token = x; return x; } -keyword_type keywords[] = -{ -"/", '/', -"MEMORY",MEMORY, -"ORIGIN",ORIGIN, -"BLOCK",BLOCK, -"LENGTH",LENGTH, -"ALIGN",ALIGN_K, -"ADDR",ADDR, -"ENTRY",ENTRY, -"NEXT",NEXT, -"sizeof_headers",SIZEOF_HEADERS, -"SIZEOF_HEADERS",SIZEOF_HEADERS, -"MAP",MAP, -"SIZEOF",SIZEOF, -"TARGET",TARGET_K, -"SEARCH_DIR",SEARCH_DIR, -"OUTPUT",OUTPUT, -"INPUT",INPUT, -"DEFINED",DEFINED, -"CREATE_OBJECT_SYMBOLS",CREATE_OBJECT_SYMBOLS, -"CONSTRUCTORS", CONSTRUCTORS, -"FORCE_COMMON_ALLOCATION",FORCE_COMMON_ALLOCATION, -"SECTIONS",SECTIONS, -"FILL",FILL, -"STARTUP",STARTUP, -"OUTPUT_FORMAT",OUTPUT_FORMAT, -"OUTPUT_ARCH", OUTPUT_ARCH, -"HLL",HLL, -"SYSLIB",SYSLIB, -"FLOAT",FLOAT, -"LONG", LONG, -"SHORT", SHORT, -"BYTE", BYTE, -"NOFLOAT",NOFLOAT, - -"NOLOAD",NOLOAD, -"DSECT",DSECT, -"COPY",COPY, -"INFO",INFO, -"OVERLAY",OVERLAY, - -"o",ORIGIN, -"org",ORIGIN, -"l", LENGTH, -"len", LENGTH, -0,0}; -unsigned int lineno; -extern boolean hex_mode; -FILE *ldlex_input_stack; -static unsigned int have_pushback; - -#define NPUSHBACK 10 -int pushback[NPUSHBACK]; -int thischar; -extern char *ldfile_input_filename; -int donehash = 0; -int -lex_input() -{ - if (have_pushback > 0) - { - have_pushback --; - return thischar = pushback[have_pushback]; - } - if (ldlex_input_stack) { - thischar = fgetc(ldlex_input_stack); - - if (thischar == EOF) { - fclose(ldlex_input_stack); - ldlex_input_stack = (FILE *)NULL; - ldfile_input_filename = (char *)NULL; - /* First char after script eof is a @ so that we can tell the grammer - that we've left */ - thischar = '@'; +%} - } - } - else if (command_line && *command_line) { - thischar = *(command_line++); - } - else { - thischar = 0; - } - if(thischar == '\t') thischar = ' '; - if (thischar == '\n') { thischar = ' '; lineno++; } - return thischar ; -} +%a 4000 +%o 5000 +FILENAMECHAR1 [_a-zA-Z\/\.\\] +FILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\] +FILENAME {FILENAMECHAR}+ +WHITE [ \t\n]+ -void -lex_unput(c) -int c; -{ - if (have_pushback > NPUSHBACK) { - info("%F%P Too many pushbacks\n"); +%x COMMAND +%x SCRIPT +%x EXPRESSION +%x COMMENT +%x BOTH +%% + +"-defsym" { return OPTION_defsym; } +"-noinhibit_exec" { return OPTION_noinhibit_exec; } +"-noinhibit-exec" { return OPTION_noinhibit_exec; } +"-sort_common" { return OPTION_sort_common;} +"-sort-common" { return OPTION_sort_common;} +"-format" { return OPTION_format; } +"-n" { return OPTION_n; } +"-N" { return OPTION_N; } +"-r" { return OPTION_r; } +"-relax" { return OPTION_relax; } +"-i" { return OPTION_r; } +"-Ur" { return OPTION_Ur; } +"-o" { return OPTION_o; } +"-g" { return OPTION_g; } +"-e" { return OPTION_e; } +"-b" { return OPTION_b; } +"-dc" { return OPTION_dc; } +"-dp" { return OPTION_dp; } +"-d" { return OPTION_d; } +"-v" { return OPTION_v; } +"-V" { return OPTION_V; } +"-M" { return OPTION_M; } +"-Map" { return OPTION_Map;} +"-t" { return OPTION_t; } +"-X" { return OPTION_X; } +"-x" { return OPTION_x; } +"-c" { return OPTION_c; } +"-R" { return OPTION_R; } +"-u" { return OPTION_u; } +"-s" { return OPTION_s; } +"-S" { return OPTION_S; } +"-Bstat" { return OPTION_Bstatic; } +"-B"{FILENAME} { /* Ignored */ } +"-l"{FILENAME} { + yylval.name = buystring(yytext+2); + return OPTION_l; + } + +"-L"{FILENAME} { + yylval.name = buystring(yytext+2); + return OPTION_L; + } +"-Ttext" { + yylval.name = ".text"; + return OPTION_Texp; + } +"-Tdata" { + yylval.name = ".data"; + return OPTION_Texp; + } +"-Tbss" { + yylval.name = ".bss"; + return OPTION_Texp; + } +"-O"{FILENAME} { + yylval.name = buystring(yytext+2); + return OPTION_Texp; + } + +"-T"{FILENAME} { + yylval.name = buystring(yytext+2); + return OPTION_Tfile; + } +"-T" { + return OPTION_T; + } + +"-F"{FILENAME} { + return OPTION_F; + } +"-F" { + return OPTION_F; + } + +"-A"{FILENAME} { + yylval.name = buystring(yytext+2); + return OPTION_Aarch; + } +"0x"?([0-9A-Fa-f])+(M|K|m|k)? { + yylval.integer = strtol(yytext,0,hex_mode); + if (yytext[yyleng-1]=='M' + || yytext[yyleng-1] == 'm') { + yylval.integer *= 1024*1024; + } + if (yytext[yyleng-1]=='K' + || yytext[yyleng-1]=='k') { + yylval.integer *= 1024; + } + return INT; + } +"]" { RTOKEN(']');} +"[" { RTOKEN('[');} +"<<=" { RTOKEN(LSHIFTEQ);} +">>=" { RTOKEN(RSHIFTEQ);} +"||" { RTOKEN(OROR);} +"==" { RTOKEN(EQ);} +"!=" { RTOKEN(NE);} +">=" { RTOKEN(GE);} +"<=" { RTOKEN(LE);} +"<<" { RTOKEN(LSHIFT);} +">>" { RTOKEN(RSHIFT);} +"+=" { RTOKEN(PLUSEQ);} +"-=" { RTOKEN(MINUSEQ);} +"*=" { RTOKEN(MULTEQ);} +"/=" { RTOKEN(DIVEQ);} +"&=" { RTOKEN(ANDEQ);} +"|=" { RTOKEN(OREQ);} +"&&" { RTOKEN(ANDAND);} +">" { RTOKEN('>');} +"," { RTOKEN(',');} +"&" { RTOKEN('&');} +"|" { RTOKEN('|');} +"~" { RTOKEN('~');} +"!" { RTOKEN('!');} +"?" { RTOKEN('?');} +"*" { RTOKEN('*');} +"+" { RTOKEN('+');} +"-" { RTOKEN('-');} +"/" { RTOKEN('/');} +"%" { RTOKEN('%');} +"<" { RTOKEN('<');} +">" { RTOKEN('>');} +"=" { RTOKEN('=');} +"}" { RTOKEN('}') ; } +"{" { RTOKEN('{'); } +")" { RTOKEN(')');} +"(" { RTOKEN('(');} +"]" { RTOKEN(']');} +"[" { RTOKEN('[');} +":" { RTOKEN(':'); } +";" { RTOKEN(';');} +"-" { RTOKEN('-');} +"/" { RTOKEN('/');} +"MEMORY" { RTOKEN(MEMORY);} +"ORIGIN" { RTOKEN(ORIGIN);} +"BLOCK" { RTOKEN(BLOCK);} +"LENGTH" { RTOKEN(LENGTH);} +"ALIGN" { RTOKEN(ALIGN_K);} +"ADDR" { RTOKEN(ADDR);} +"ENTRY" { RTOKEN(ENTRY);} +"NEXT" { RTOKEN(NEXT);} +"sizeof_headers" { RTOKEN(SIZEOF_HEADERS);} +"SIZEOF_HEADERS" { RTOKEN(SIZEOF_HEADERS);} +"MAP" { RTOKEN(MAP);} +"SIZEOF" { RTOKEN(SIZEOF);} +"TARGET" { RTOKEN(TARGET_K);} +"SEARCH_DIR" { RTOKEN(SEARCH_DIR);} +"OUTPUT" { RTOKEN(OUTPUT);} +"INPUT" { RTOKEN(INPUT);} +"DEFINED" { RTOKEN(DEFINED);} +"CREATE_OBJECT_SYMBOLS" { RTOKEN(CREATE_OBJECT_SYMBOLS);} +"CONSTRUCTORS" { RTOKEN( CONSTRUCTORS);} +"FORCE_COMMON_ALLOCATION" { RTOKEN(FORCE_COMMON_ALLOCATION);} +"SECTIONS" { RTOKEN(SECTIONS);} +"FILL" { RTOKEN(FILL);} +"STARTUP" { RTOKEN(STARTUP);} +"OUTPUT_FORMAT" { RTOKEN(OUTPUT_FORMAT);} +"OUTPUT_ARCH" { RTOKEN( OUTPUT_ARCH);} +"HLL" { RTOKEN(HLL);} +"SYSLIB" { RTOKEN(SYSLIB);} +"FLOAT" { RTOKEN(FLOAT);} +"LONG" { RTOKEN( LONG);} +"SHORT" { RTOKEN( SHORT);} +"BYTE" { RTOKEN( BYTE);} +"NOFLOAT" { RTOKEN(NOFLOAT);} +"NOLOAD" { RTOKEN(NOLOAD);} +"DSECT" { RTOKEN(DSECT);} +"COPY" { RTOKEN(COPY);} +"INFO" { RTOKEN(INFO);} +"OVERLAY" { RTOKEN(OVERLAY);} +"o" { RTOKEN(ORIGIN);} +"org" { RTOKEN(ORIGIN);} +"l" { RTOKEN( LENGTH);} +"len" { RTOKEN( LENGTH);} + +{FILENAMECHAR1}{FILENAMECHAR}* { + yylval.name = buystring(yytext); + return NAME; + } +{FILENAMECHAR}* { yylval.name = buystring(yytext); + return NAME; + } + +"\""[^\"]*"\"" { + /* No matter the state, quotes + give what's inside */ + yylval.name = buystring(yytext+1); + yylval.name[yyleng-2] = 0; + return NAME; + } +"\n" { lineno++;} +[ \t] + +"/*" { old = INITIAL; BEGIN(COMMENT); } +"/*" { old = COMMAND; BEGIN(COMMENT); } +"/*" { old =BOTH; BEGIN(COMMENT); } +