- "'" STRING_GROW; c_context = YY_START; BEGIN SC_CHARACTER;
- "\"" STRING_GROW; c_context = YY_START; BEGIN SC_STRING;
- "/"{splice}"*" STRING_GROW; c_context = YY_START; BEGIN SC_COMMENT;
- "/"{splice}"/" STRING_GROW; c_context = YY_START; BEGIN SC_LINE_COMMENT;
+ "'" {
+ STRING_GROW;
+ context_state = YY_START;
+ token_start = loc->start;
+ BEGIN SC_CHARACTER;
+ }
+ "\"" {
+ STRING_GROW;
+ context_state = YY_START;
+ token_start = loc->start;
+ BEGIN SC_STRING;
+ }
+ "/"{splice}"*" {
+ STRING_GROW;
+ context_state = YY_START;
+ token_start = loc->start;
+ BEGIN SC_COMMENT;
+ }
+ "/"{splice}"/" {
+ STRING_GROW;
+ context_state = YY_START;
+ BEGIN SC_LINE_COMMENT;
+ }
+}
+
+
+ /*---------------------------------------------------------------.
+ | Scanning after %union etc., possibly followed by white space. |
+ | For %union only, allow arbitrary C code to appear before the |
+ | following brace, as an extension to POSIX. |
+ `---------------------------------------------------------------*/
+
+<SC_PRE_CODE>
+{
+ . {
+ bool valid = yytext[0] == '{' || token_type == PERCENT_UNION;
+ scanner_cursor.column -= mbsnwidth (yytext, yyleng, 0);
+ yyless (0);
+
+ if (valid)
+ {
+ braces_level = -1;
+ code_start = loc->start;
+ BEGIN SC_BRACED_CODE;
+ }
+ else
+ {
+ complain_at (*loc, _("missing `{' in `%s'"),
+ token_name (token_type));
+ obstack_sgrow (&obstack_for_string, "{}");
+ STRING_FINISH;
+ val->chars = last_string;
+ BEGIN INITIAL;
+ return token_type;
+ }
+ }
+
+ <<EOF>> unexpected_eof (scanner_cursor, "{}"); BEGIN INITIAL;