}
\n {
+ /* XXX: Printing here (rather than in a parser production)
+ * *and* frobbing a bit of the parser state here are both ugly
+ * things. But all my attempts to avoid this by returning a
+ * NEWLINE token here have led to even more ugly things. */
printf ("\n");
+ yyextra->just_printed_separator = 1;
}
{HSPACE}+
%lex-param {glcpp_parser_t *parser}
%token DEFINE FUNC_MACRO IDENTIFIER IDENTIFIER_FINALIZED OBJ_MACRO NEWLINE SEPARATOR SPACE TOKEN UNDEF
-%type <ival> input punctuator
+%type <ival> punctuator
%type <str> content FUNC_MACRO IDENTIFIER IDENTIFIER_FINALIZED OBJ_MACRO
%type <argument_list> argument_list
%type <string_list> macro parameter_list
* character between any two. */
input:
/* empty */ {
- $$ = SEPARATOR;
+ parser->just_printed_separator = 1;
}
| input content {
int is_token;
(c >= '0' && c <= '9') ||
(c == '_'));
- if ($1 == TOKEN && is_not_separator)
+ if (! parser->just_printed_separator && is_not_separator)
+ {
printf (" ");
+ }
printf ("%s", $2);
+
if (is_not_separator)
- $$ = TOKEN;
+ parser->just_printed_separator = 0;
else
- $$ = SEPARATOR;
- } else {
- $$ = $1;
+ parser->just_printed_separator = 1;
}
+
if ($2)
talloc_free ($2);
}
hash_table_string_compare);
parser->expansions = NULL;
+ parser->just_printed_separator = 1;
+
return parser;
}
yyscan_t scanner;
struct hash_table *defines;
expansion_node_t *expansions;
+ int just_printed_separator;
};
void