Index: deffilep.y =================================================================== RCS file: /cvs/src/src/ld/deffilep.y,v retrieving revision 1.33 diff -u -3 -r1.33 deffilep.y --- deffilep.y 25 May 2010 10:05:16 -0000 1.33 +++ deffilep.y 9 Jul 2010 11:44:15 -0000 @@ -107,7 +107,7 @@ }; %token NAME LIBRARY DESCRIPTION STACKSIZE_K HEAPSIZE CODE DATAU DATAL -%token SECTIONS EXPORTS IMPORTS VERSIONK BASE CONSTANTU CONSTANTL +%token SECTIONS SEGMENTS EXPORTS IMPORTS VERSIONK BASE CONSTANTU CONSTANTL %token PRIVATEU PRIVATEL ALIGNCOMM %token READ WRITE EXECUTE SHARED NONAMEU NONAMEL DIRECTIVE EQUAL %token ID @@ -116,7 +116,7 @@ %type opt_digits %type opt_base opt_ordinal %type attr attr_list opt_number exp_opt_list exp_opt -%type opt_name opt_equal_name dot_name anylang_id opt_id +%type opt_name opt_equal_name dot_name anylang_id opt_id allids %type opt_equalequal_name %% @@ -128,17 +128,18 @@ command: NAME opt_name opt_base { def_image_name ($2, $3, 0); } | LIBRARY opt_name opt_base { def_image_name ($2, $3, 1); } - | DESCRIPTION ID { def_description ($2);} + | DESCRIPTION allids { def_description ($2);} | STACKSIZE_K NUMBER opt_number { def_stacksize ($2, $3);} | HEAPSIZE NUMBER opt_number { def_heapsize ($2, $3);} | CODE attr_list { def_section ("CODE", $2);} | DATAU attr_list { def_section ("DATA", $2);} | SECTIONS seclist + | SEGMENTS seclist | EXPORTS explist | IMPORTS implist | VERSIONK NUMBER { def_version ($2, 0);} | VERSIONK NUMBER '.' NUMBER { def_version ($2, $4);} - | DIRECTIVE ID { def_directive ($2);} + | DIRECTIVE allids { def_directive ($2);} | ALIGNCOMM anylang_id ',' NUMBER { def_aligncomm ($2, $4);} ; @@ -179,17 +180,17 @@ ; impline: - ID '=' ID '.' ID '.' ID opt_equalequal_name + allids '=' allids '.' allids '.' allids opt_equalequal_name { def_import ($1, $3, $5, $7, -1, $8); } - | ID '=' ID '.' ID '.' NUMBER opt_equalequal_name + | allids '=' allids '.' allids '.' NUMBER opt_equalequal_name { def_import ($1, $3, $5, 0, $7, $8); } - | ID '=' ID '.' ID opt_equalequal_name + | allids '=' allids '.' allids opt_equalequal_name { def_import ($1, $3, 0, $5, -1, $6); } - | ID '=' ID '.' NUMBER opt_equalequal_name + | allids '=' allids '.' NUMBER opt_equalequal_name { def_import ($1, $3, 0, 0, $5, $6); } - | ID '.' ID '.' ID opt_equalequal_name + | allids '.' allids '.' allids opt_equalequal_name { def_import( 0, $1, $3, $5, -1, $6); } - | ID '.' ID opt_equalequal_name + | allids '.' allids opt_equalequal_name { def_import ( 0, $1, 0, $3, -1, $4); } ; @@ -199,8 +200,8 @@ ; secline: - ID attr_list { def_section ($1, $2);} - | ID ID { def_section_alt ($1, $2);} + allids attr_list { def_section ($1, $2);} + | allids allids { def_section_alt ($1, $2);} ; attr_list: @@ -223,14 +224,14 @@ | SHARED { $$=8;} ; -opt_name: ID { $$ = $1; } - | '.' ID +opt_name: allids { $$ = $1; } + | '.' allids { char *name = xmalloc (strlen ($2) + 2); sprintf (name, ".%s", $2); $$ = name; } - | ID '.' ID + | allids '.' allids { char *name = xmalloc (strlen ($1) + 1 + strlen ($3) + 1); sprintf (name, "%s.%s", $1, $3); @@ -239,7 +240,7 @@ | { $$ = ""; } ; -opt_equalequal_name: EQUAL ID { $$ = $2; } +opt_equalequal_name: EQUAL allids { $$ = $2; } | { $$ = 0; } ; @@ -257,14 +258,14 @@ | { $$ = -1;} ; -dot_name: ID { $$ = $1; } - | '.' ID +dot_name: allids { $$ = $1; } + | '.' allids { char *name = xmalloc (strlen ($2) + 2); sprintf (name, ".%s", $2); $$ = name; } - | dot_name '.' ID + | dot_name '.' allids { char *name = xmalloc (strlen ($1) + 1 + strlen ($3) + 1); sprintf (name, "%s.%s", $1, $3); @@ -272,8 +273,8 @@ } ; -anylang_id: ID { $$ = $1; } - | '.' ID +anylang_id: allids { $$ = $1; } + | '.' allids { char *id = xmalloc (strlen ($2) + 2); sprintf (id, ".%s", $2); @@ -291,12 +292,40 @@ | { $$ = ""; } ; -opt_id: ID { $$ = $1; } +opt_id: allids { $$ = $1; } | { $$ = ""; } ; NUMBER: DIGITS { $$ = strtoul ($1, 0, 0); } +allids: ID { $$ = $1; } + | BASE { $$ = xstrdup ("BASE"); } + | CODE { $$ = xstrdup ("CODE"); } + | CONSTANTU { $$ = xstrdup ("CONSTANT"); } + | CONSTANTL { $$ = xstrdup ("constant"); } + | DATAU { $$ = xstrdup ("DATA"); } + | DATAL { $$ = xstrdup ("data"); } + | DESCRIPTION { $$ = xstrdup ("DESCRIPTION"); } + | DIRECTIVE { $$ = xstrdup ("DIRECTIVE"); } + | EXECUTE { $$ = xstrdup ("EXECUTE"); } + | EXPORTS { $$ = xstrdup ("EXPORTS"); } + | HEAPSIZE { $$ = xstrdup ("HEAPSIZE"); } + | IMPORTS { $$ = xstrdup ("IMPORTS"); } + | LIBRARY { $$ = xstrdup ("LIBRARY"); } + | NAME { $$ = xstrdup ("NAME"); } + | NONAMEU { $$ = "NONAME"; } + | NONAMEL { $$ = xstrdup ("noname"); } + | PRIVATEU { $$ = xstrdup ("PRIVATE"); } + | PRIVATEL { $$ = xstrdup ("private"); } + | READ { $$ = xstrdup ("READ"); } + | SECTIONS { $$ = xstrdup ("SECTIONS"); } + | SEGMENTS { $$ = xstrdup ("SEGMENTS"); } + | SHARED { $$ = xstrdup ("SHARED"); } + | STACKSIZE_K { $$ = xstrdup ("STACKSIZE"); } + | VERSIONK { $$ = xstrdup ("VERSION"); } + | WRITE { $$ = xstrdup ("WRITE"); } +; + %% /***************************************************************************** @@ -957,6 +986,7 @@ char *name; int token; } + tokens[] = { { "BASE", BASE }, @@ -979,7 +1009,7 @@ { "private", PRIVATEL }, { "READ", READ }, { "SECTIONS", SECTIONS }, - { "SEGMENTS", SECTIONS }, + { "SEGMENTS", SEGMENTS }, { "SHARED", SHARED }, { "STACKSIZE", STACKSIZE_K }, { "VERSION", VERSIONK }, @@ -1109,7 +1139,7 @@ } if (c != EOF) def_ungetc (c); - if (ISALPHA (q)) /* Check for tokens. */ + if (ISALPHA (q) && (c != EOF && c != '.')) /* Check for tokens. */ { for (i = 0; tokens[i].name; i++) if (strcmp (tokens[i].name, buffer) == 0)