Allow trailing commas in bare lists

This applies to macro arguments, DB, DW, DL, DS,
PRINT, PRINTLN, EXPORT, PURGE, and OPT.

It also removes support for empty entries in DB/DW/DL.
(Deprecating it would require keeping parser support,
which is ambiguous with trailing commas.)

Fixes #753
This commit is contained in:
Rangi
2021-02-28 21:19:15 -05:00
committed by Eldred Habert
parent c637447d5d
commit 56071599e7
16 changed files with 155 additions and 153 deletions

View File

@@ -430,7 +430,6 @@ enum {
int32_t step;
} forArgs;
struct StrFmtArgList strfmtArgs;
bool hasEmpty; // Whether `db`, `dw`, `dl` argument lists contain any empty entries
}
%type <sVal> relocexpr
@@ -445,9 +444,6 @@ enum {
%type <sVal> reloc_16bit
%type <sVal> reloc_16bit_no_str
%type <nConstValue> sectiontype
%type <hasEmpty> constlist_8bit constlist_8bit_entry
%type <hasEmpty> constlist_16bit constlist_16bit_entry
%type <hasEmpty> constlist_32bit constlist_32bit_entry
%type <tzString> string
%type <tzString> strcat_args
@@ -728,6 +724,7 @@ label : %empty
;
macro : T_ID {
// Parsing 'macroargs' will restore the lexer's normal mode
lexer_SetMode(LEXER_RAW);
} macroargs {
fstk_RunMacro($1, $3);
@@ -738,7 +735,7 @@ macroargs : %empty {
$$ = macro_NewArgs();
}
| macroargs T_STRING {
macro_AppendArg(&($$), strdup($2), !lexer_IsRawMode());
macro_AppendArg(&($$), strdup($2));
}
;
@@ -791,6 +788,9 @@ directive : include
| align
;
trailing_comma : %empty | T_COMMA
;
align : T_OP_ALIGN uconst {
if ($2 > 16)
error("Alignment must be between 0 and 16, not %u\n", $2);
@@ -809,14 +809,13 @@ align : T_OP_ALIGN uconst {
;
opt : T_POP_OPT {
// Parsing 'opt_list' will restore the lexer's normal mode
lexer_SetMode(LEXER_RAW);
} opt_list {
lexer_SetMode(LEXER_NORMAL);
}
} opt_list
;
opt_list : opt_list_entry
| opt_list T_COMMA opt_list_entry
| opt_list opt_list_entry
;
opt_list_entry : T_STRING { opt_Parse($1); }
@@ -984,7 +983,7 @@ endu : T_POP_ENDU { sect_EndUnion(); }
;
ds : T_POP_DS uconst { out_Skip($2, true); }
| T_POP_DS uconst T_COMMA ds_args {
| T_POP_DS uconst T_COMMA ds_args trailing_comma {
out_RelBytes($2, $4.args, $4.nbArgs);
freeDsArgList(&$4);
}
@@ -1004,34 +1003,21 @@ ds_args : reloc_8bit {
}
;
/* Authorize empty entries if there is only one */
db : T_POP_DB constlist_8bit_entry T_COMMA constlist_8bit {
if ($2 || $4)
warning(WARNING_EMPTY_ENTRY,
"Empty entry in list of 8-bit elements (treated as padding).\n");
}
| T_POP_DB constlist_8bit_entry
db : T_POP_DB { out_Skip(1, false); }
| T_POP_DB constlist_8bit trailing_comma
;
dw : T_POP_DW constlist_16bit_entry T_COMMA constlist_16bit {
if ($2 || $4)
warning(WARNING_EMPTY_ENTRY,
"Empty entry in list of 16-bit elements (treated as padding).\n");
}
| T_POP_DW constlist_16bit_entry
dw : T_POP_DW { out_Skip(2, false); }
| T_POP_DW constlist_16bit trailing_comma
;
dl : T_POP_DL constlist_32bit_entry T_COMMA constlist_32bit {
if ($2 || $4)
warning(WARNING_EMPTY_ENTRY,
"Empty entry in list of 32-bit elements (treated as padding).\n");
}
| T_POP_DL constlist_32bit_entry
dl : T_POP_DL { out_Skip(4, false); }
| T_POP_DL constlist_32bit trailing_comma
;
purge : T_POP_PURGE {
lexer_ToggleStringExpansion(false);
} purge_list {
} purge_list trailing_comma {
lexer_ToggleStringExpansion(true);
}
;
@@ -1052,7 +1038,7 @@ purge_list : purge_list_entry
purge_list_entry : scoped_id { sym_Purge($1); }
;
export : T_POP_EXPORT export_list
export : T_POP_EXPORT export_list trailing_comma
;
export_list : export_list_entry
@@ -1113,11 +1099,11 @@ pushc : T_POP_PUSHC { charmap_Push(); }
popc : T_POP_POPC { charmap_Pop(); }
;
print : T_POP_PRINT print_exprs
print : T_POP_PRINT print_exprs trailing_comma
;
println : T_POP_PRINTLN { putchar('\n'); }
| T_POP_PRINTLN print_exprs { putchar('\n'); }
| T_POP_PRINTLN print_exprs trailing_comma { putchar('\n'); }
;
print_exprs : print_expr
@@ -1165,18 +1151,11 @@ const_3bit : const {
;
constlist_8bit : constlist_8bit_entry
| constlist_8bit T_COMMA constlist_8bit_entry {
$$ = $1 || $3;
}
| constlist_8bit T_COMMA constlist_8bit_entry
;
constlist_8bit_entry : %empty {
out_Skip(1, false);
$$ = true;
}
| reloc_8bit_no_str {
constlist_8bit_entry : reloc_8bit_no_str {
out_RelByte(&$1, 0);
$$ = false;
}
| string {
uint8_t *output = malloc(strlen($1)); /* Cannot be larger than that */
@@ -1184,23 +1163,15 @@ constlist_8bit_entry : %empty {
out_AbsByteGroup(output, length);
free(output);
$$ = false;
}
;
constlist_16bit : constlist_16bit_entry
| constlist_16bit T_COMMA constlist_16bit_entry {
$$ = $1 || $3;
}
| constlist_16bit T_COMMA constlist_16bit_entry
;
constlist_16bit_entry : %empty {
out_Skip(2, false);
$$ = true;
}
| reloc_16bit_no_str {
constlist_16bit_entry : reloc_16bit_no_str {
out_RelWord(&$1, 0);
$$ = false;
}
| string {
uint8_t *output = malloc(strlen($1)); /* Cannot be larger than that */
@@ -1208,23 +1179,15 @@ constlist_16bit_entry : %empty {
out_AbsWordGroup(output, length);
free(output);
$$ = false;
}
;
constlist_32bit : constlist_32bit_entry
| constlist_32bit T_COMMA constlist_32bit_entry {
$$ = $1 || $3;
}
| constlist_32bit T_COMMA constlist_32bit_entry
;
constlist_32bit_entry : %empty {
out_Skip(4, false);
$$ = true;
}
| relocexpr_no_str {
constlist_32bit_entry :relocexpr_no_str {
out_RelLong(&$1, 0);
$$ = false;
}
| string {
uint8_t *output = malloc(strlen($1)); /* Cannot be larger than that */
@@ -1232,7 +1195,6 @@ constlist_32bit_entry : %empty {
out_AbsLongGroup(output, length);
free(output);
$$ = false;
}
;