X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=ld%2Fldlex.l;h=3a4158df98ae90b0afbfdaa434163d0ea7906869;hb=85e38cfa01d6ac71297b26b5c653c35a891e8932;hp=cf7fd47a88c5e91a42b909d7dbee6d254f750f75;hpb=2e2bf962db00b2e23a222687e4bc3c5971c645b7;p=platform%2Fupstream%2Fbinutils.git diff --git a/ld/ldlex.l b/ld/ldlex.l index cf7fd47..3a4158d 100644 --- a/ld/ldlex.l +++ b/ld/ldlex.l @@ -1,4 +1,5 @@ %{ + /* Copyright (C) 1991 Free Software Foundation, Inc. This file is part of GLD, the Gnu Linker. @@ -18,521 +19,533 @@ 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(); +unsigned int lineno = 1; +int old; -static boolean ldgram_in_defsym; -static boolean ldgram_had_equals; -extern boolean ldgram_in_script; -static char *command_line; +static comment(); + +#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; +/* 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 + MRI in an MRI 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 = '@'; +%} +%a 4000 +%o 5000 + +CMDFILENAMECHAR [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\-\~] +CMDFILENAMECHAR1 [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\~] +FILENAMECHAR1 [_a-zA-Z\/\.\\\$\_\~] +SYMBOLCHARN [_a-zA-Z\/\.\\0-9] +FILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~] +FILENAME {FILENAMECHAR}+ +WHITE [ \t\n]+ + +NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~] + + +%s COMMAND +%s SCRIPT +%s EXPRESSION +%s COMMENT +%s BOTH +%s DEFSYMEXP +%s MRI +%% + + +"/*" { comment(); } + + +"-" { RTOKEN('-');} +"+" { RTOKEN('+');} +{FILENAMECHAR1}{SYMBOLCHARN}* { yylval.name = buystring(yytext); return NAME; } +[ \t] { RTOKEN(DEFSYMEND); } +"=" { RTOKEN('='); } +"-defsym"{WHITE}* { 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; + } + +"-y"{FILENAME} { + yylval.name = buystring(yytext+2); + return OPTION_y; + } + +"-A"{FILENAME} { + yylval.name = buystring(yytext+2); + return OPTION_Aarch; + } + +"-retain-symbols-file" { return OPTION_RETAIN_SYMBOLS_FILE; } + +"$"([0-9A-Fa-f])+ { + yylval.integer = strtoul(yytext+1, 0,16); + return INT; + } + +([0-9A-Fa-f])+(H|X|B|O|D) { + int base ; + switch (yytext[yyleng-1]) { + case 'X': + case 'H': + base = 16; + break; + case 'O': + base = 8; + break; + case 'B': + base = 2; + break; + default: + base = 10; + } + yylval.integer = strtoul(yytext+1, 0, base); + return INT; + } +"$"?"0x"?([0-9A-Fa-f])+(M|K|m|k)? { + yylval.integer = strtoul(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);} +"\n" { ++ lineno; RTOKEN(NEWLINE); } +"*".* { /* Mri comment line */ } +"END" { RTOKEN(ENDWORD); } +"ALIGNMOD" { RTOKEN(ALIGNMOD);} +"ALIGN" { RTOKEN(ALIGN_K);} + +"CHIP" { RTOKEN(CHIP); } +"BASE" { RTOKEN(BASE); } +"ALIAS" { RTOKEN(ALIAS); } +"TRUNCATE" { RTOKEN(TRUNCATE); } +"LOAD" { RTOKEN(LOAD); } +"PUBLIC" { RTOKEN(PUBLIC); } +"ORDER" { RTOKEN(ORDER); } +"NAME" { RTOKEN(NAMEWORD); } +"FORMAT" { RTOKEN(FORMAT); } +"LIST".* { RTOKEN(LIST); /* LIST and ignore to end of line */ } +"SECT" { RTOKEN(SECT); } +"ABSOLUTE" { RTOKEN(ABSOLUTE); } +"end" { RTOKEN(ENDWORD); } +"chip" { RTOKEN(CHIP); } +"load" { RTOKEN(LOAD); } +"order" { RTOKEN(ORDER); } +"name" { RTOKEN(NAMEWORD); } +"format" { RTOKEN(FORMAT); } +"list".* { RTOKEN(LIST); /* LIST and ignore to end of line */ } +"sect" { RTOKEN(SECT); } +"absolute" { RTOKEN(ABSOLUTE); } + +{CMDFILENAMECHAR1}{CMDFILENAMECHAR}* { + yylval.name = buystring(yytext); + return NAME; + } + + +{FILENAMECHAR1}{NOCFILENAMECHAR}* { +/* Filename without commas, needed to parse mri stuff */ + yylval.name = buystring(yytext); + return NAME; + } + + +{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] + +<> { + include_stack_ptr--; + + if (include_stack_ptr == 0) + { + yyterminate(); } + else + { + yy_switch_to_buffer(include_stack[include_stack_ptr]); + } + BEGIN(COMMAND); + return END; } - else if (command_line && *command_line) { - thischar = *(command_line++); - } - else { - thischar = 0; - } - if(thischar == '\t') thischar = ' '; - if (thischar == '\n') { thischar = ' '; lineno++; } - return thischar ; -} + +%% void -lex_unput(c) -int c; +DEFUN(lex_push_file,(file), + FILE *file) { - if (have_pushback > NPUSHBACK) { - info("%F%P Too many pushbacks\n"); + if (include_stack_ptr >= MAX_INCLUDE_DEPTH) + { + einfo("%F:includes nested too deeply"); } + include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER; + yyin = file; + yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); - pushback[have_pushback] = c; - have_pushback ++; + BEGIN(SCRIPT); } +YY_BUFFER_STATE +DEFUN(yy_create_string_buffer,(string, size), + CONST char *string AND + int size ) +{ + YY_BUFFER_STATE b; - int -yywrap() - { return 1; } -/*VARARGS*/ + b = (YY_BUFFER_STATE) malloc( sizeof( struct yy_buffer_state ) ); + b->yy_input_file = 0; + + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); -void -allprint(x) -int x; -{ -fprintf(yyout,"%d",x); -} + b->yy_buf_size = size; -void -sprint(x) -char *x; -{ -fprintf(yyout,"%s",x); -} + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (YY_CHAR *) malloc( (unsigned) (b->yy_buf_size + 3) ); -int thischar; + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); -void parse_line(arg) -char *arg; -{ - command_line = arg; - have_pushback = 0; - yyparse(); + + b->yy_ch_buf[0] = '\n'; + strcpy(b->yy_ch_buf+1, string); + b->yy_ch_buf[size+1] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[size+2] = YY_END_OF_BUFFER_CHAR; + b->yy_n_chars = size+1; + b->yy_buf_pos = &b->yy_ch_buf[1]; + + b->yy_eof_status = EOF_NOT_SEEN; + + return ( b ); } void -parse_args(ac, av) -int ac; -char **av; +DEFUN(lex_redirect,( string), + CONST char *string) { - char *p; - int i; - size_t size = 0; - char *dst; - debug = 1; - for (i= 1; i < ac; i++) { - size += strlen(av[i]) + 2; + YY_BUFFER_STATE tmp; + + int len = strlen(string); +yy_init = 0 ; + if (include_stack_ptr >= MAX_INCLUDE_DEPTH) + { + einfo("%F: macros nested too deeply"); } - dst = p = (char *)ldmalloc(size + 2); -/* Put a space arount each option */ + include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER; + tmp = yy_create_string_buffer(string, len); + + yy_switch_to_buffer(tmp); + BEGIN(COMMAND); +yyout = stdout; +} - for (i =1; i < ac; i++) { +int state_stack[20]; +int *state_stack_p = state_stack; - unsigned int s = strlen(av[i]); - *dst++ = ' '; - memcpy(dst, av[i], s); - dst[s] = ' '; - dst += s + 1; - } - *dst = 0; - parse_line(p); +void +DEFUN_VOID(ldlex_script) +{ +*(state_stack_p)++ = yy_start; - free(p); +BEGIN(SCRIPT); +} +void +DEFUN_VOID(ldlex_mri_script) +{ +*(state_stack_p)++ = yy_start; +BEGIN(MRI); } -static long -DEFUN(number,(default_if_zero,base), - int default_if_zero AND - int base) +void +DEFUN_VOID(ldlex_defsym) { - unsigned long l = 0; - int ch = yytext[0]; - if (ch == 0) { - base = default_if_zero; - } - while (1) { - switch (ch) { - case 'x': - base = 16; - break; - case 'k': - case 'K': - l =l * 1024; - break; - case 'm': - case 'M': - l =l * 1024 * 1024; - break; - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - l = l * base + ch - '0'; - break; - case 'a': case 'b': case 'c' : case 'd' : case 'e': case 'f': - l =l *base + ch - 'a' + 10; - break; - case 'A': case 'B': case 'C' : case 'D' : case 'E': case 'F': - l =l *base + ch - 'A' + 10; - break; - default: - unput(ch); - yylval.integer = l; - return INT; - } -ch = input(); - } +*(state_stack_p)++ = yy_start; +BEGIN(DEFSYMEXP); } -%} - -%a 4000 -%o 5000 -FILENAMECHAR [a-zA-Z0-9\/\.\-\_\+\=] -FILENAME {FILENAMECHAR}+ -WHITE [ \t]+ - -%% - -"@" { return '}'; } -"\ -defsym\ " { ldgram_in_defsym = true; return OPTION_defsym; } -"\ -noinhibit_exec\ " { return OPTION_noinhibit_exec; } -"\ -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; } -"\ -Bstatic" { return OPTION_Bstatic; } -"\ -B{FILENAME}\ " { /* Ignored */ } -"\ -l"{FILENAME} { - yylval.name = buystring(yytext+3); - return OPTION_l; - } - -"\ -L"{FILENAME} { - yylval.name = buystring(yytext+3); - 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+3); - return OPTION_Texp; - } - -"\ -T"{FILENAME} { - yylval.name = buystring(yytext+3); - return OPTION_Tfile; - } -"\ -T\ " { - return OPTION_T; - } - -"\ -F"{FILENAME} { - return OPTION_F; - } -"\ -F\ " { - return OPTION_F; - } - -"\ -A"{FILENAME} { - yylval.name = buystring(yytext+3); - return OPTION_Aarch; - } - -" " { - if (ldgram_had_equals == true) { - ldgram_in_defsym = false; - ldgram_had_equals = false; - } - } -"<<=" { 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('-');} - - - -"/*" { - while (1) { - int ch; - ch = input(); - while (ch != '*') { - ch = input(); - } - - + +void +DEFUN_VOID(ldlex_expression) +{ +*(state_stack_p)++ = yy_start; +BEGIN(EXPRESSION); - if (input() == '/') { - break; - } - unput(yytext[yyleng-1]); - } } - -"\""[^\"]*"\"" { - - yylval.name = buystring(yytext+1); - yylval.name[yyleng-2] = 0; /* Fry final quote */ - return NAME; +void +DEFUN_VOID(ldlex_both) +{ +*(state_stack_p)++ = yy_start; +BEGIN(BOTH); +} +void +DEFUN_VOID(ldlex_command) +{ +*(state_stack_p)++ = yy_start; +BEGIN(COMMAND); } -{FILENAMECHAR} { - - boolean loop = false; - int ch; - keyword_type *k; - - /* If we're in hex mode (only after a -T) then all we can see are numbers - hex digit we see will be a number. */ - - if (hex_mode) { - return number(16, 16); - } - - /* If we're in a defsym then all things starting with a digit are in - hex */ +void +DEFUN_VOID(ldlex_popstate) +{ +yy_start = *(--state_stack_p); +} - if (isdigit(yytext[0]) && ldgram_in_defsym) { - return number(16,16); +yy_input(buf, result, max_size) +char *buf; +int *result; +int max_size; +{ + *result = 0; + if (yy_current_buffer->yy_input_file) + { + if (yyin) + if ( (*result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) + YY_FATAL_ERROR( "read() in flex scanner failed" ); } +} +static +comment() +{ + int c; + while (1) + { + c = input(); + while (c !='*' && c != EOF) + { + if (c == '\n') lineno++; + c = input(); + } - /* Otherwise if we're in a script we will parse the numbers - normally */ - - if (ldgram_in_script == true && isdigit(yytext[0])) { - return number(8,10); - } - /* Anywhere not in a script or defsym, an opertor is part of a - filename, except / and, which is an operator when on its own */ - if (ldgram_in_script == true|| ldgram_in_defsym == true) { - - switch (yytext[0]) { - case '*': RTOKEN('*'); - - case '=': { - ldgram_had_equals = true; - RTOKEN('='); - } - break; - case '/': { - if (ldgram_in_defsym) RTOKEN('/'); - } - break; - case '+': RTOKEN('+'); - case '-': RTOKEN('-'); - case '!': RTOKEN('!'); - case '~': RTOKEN('~'); - } + if (c == '*') + { + c = input(); + while ( c == '*') + c = input(); + if ( c == '/' ) + break; /* found the end */ } - -/* Otherwise this must be a file or a symbol name, and it will continue to be a - filename until we get to something strange. In scripts operator looking - things are taken to be operators, except /, which will be left - */ - ch = input(); - while (true) - { - if (ldgram_in_defsym == true) { - switch (ch) { - case '*': - case '=': - case '+': - case '/': - case '-': - case '!': - case '~': - goto quit; - } - - } - if(ldgram_in_script == true) { - switch (ch) { - case '*': - case '=': - case '+': - case '-': - case '!': - case '~': - goto quit; - } - } - - if (isalpha(ch) || isdigit(ch) || ch == '.' || ch == '_' || - ch == '/' || ch == '.' || ch == '+' || ch == '-' || ch =='=') { - yytext[yyleng++] = ch; - } - else - break; - ch = input(); - } - quit:; - yytext[yyleng] = 0; - unput(ch); - - for(k = keywords; k ->name != (char *)NULL; k++) { - if (strcmp(k->name, yytext)==0) { - yylval.token = k->value; - return k->value; + if ( c == EOF ) + { + einfo( "%F%P :EOF in comment"); + break; } } - yylval.name = buystring(yytext); - return NAME; } - - - - - -%%