bool Scanner::lex_str_chr(char quote, ASTChar &ast)
{
    tok = cur;
    ast.loc = cur_loc();
    #line 839 "../src/parse/lex.re"

    if (globopts->input_encoding == Enc::ASCII) {
        
#line 4647 "src/parse/lex.cc"
{
	unsigned char yych;
	unsigned int yyaccept = 0;
	if ((lim - cur) < 10) { if (!fill(10)) { error("unexpected end of input"); exit(1); } }
	yych = (unsigned char)*cur;
	if (yych <= '\f') {
		if (yych <= 0x00) goto yy521;
		if (yych == '\n') goto yy524;
		goto yy522;
	} else {
		if (yych <= '\r') goto yy525;
		if (yych == '\\') goto yy526;
		goto yy522;
	}
yy521:
	++cur;
#line 821 "../src/parse/lex.re"
	{ fail_if_eof(); ast.chr = 0; return true; }
#line 4666 "src/parse/lex.cc"
yy522:
	++cur;
yy523:
#line 823 "../src/parse/lex.re"
	{ ast.chr = decode(tok); return tok[0] != quote; }
#line 4672 "src/parse/lex.cc"
yy524:
	++cur;
#line 815 "../src/parse/lex.re"
	{ msg.error(ast.loc, "newline in character string"); exit(1); }
#line 4677 "src/parse/lex.cc"
yy525:
	yych = (unsigned char)*++cur;
	if (yych == '\n') goto yy524;
	goto yy523;
yy526:
	yych = (unsigned char)*++cur;
	if (yych <= '`') {
		if (yych <= '3') {
			if (yych <= '\n') {
				if (yych <= 0x00) goto yy527;
				if (yych <= '\t') goto yy528;
				goto yy524;
			} else {
				if (yych == '\r') goto yy530;
				if (yych <= '/') goto yy528;
				goto yy531;
			}
		} else {
			if (yych <= 'W') {
				if (yych <= '7') goto yy533;
				if (yych == 'U') goto yy534;
				goto yy528;
			} else {
				if (yych <= 'X') goto yy536;
				if (yych == '\\') goto yy537;
				goto yy528;
			}
		}
	} else {
		if (yych <= 'q') {
			if (yych <= 'e') {
				if (yych <= 'a') goto yy538;
				if (yych <= 'b') goto yy539;
				goto yy528;
			} else {
				if (yych <= 'f') goto yy540;
				if (yych == 'n') goto yy541;
				goto yy528;
			}
		} else {
			if (yych <= 'u') {
				if (yych <= 'r') goto yy542;
				if (yych <= 's') goto yy528;
				if (yych <= 't') goto yy543;
				goto yy536;
			} else {
				if (yych <= 'v') goto yy544;
				if (yych == 'x') goto yy545;
				goto yy528;
			}
		}
	}
yy527:
#line 818 "../src/parse/lex.re"
	{ msg.error(ast.loc, "syntax error in escape sequence"); exit(1); }
#line 4733 "src/parse/lex.cc"
yy528:
	++cur;
yy529:
#line 834 "../src/parse/lex.re"
	{
        ast.chr = decode(tok + 1);
        if (tok[1] != quote) msg.warn.useless_escape(ast.loc, tok, cur);
        return true;
    }
#line 4743 "src/parse/lex.cc"
yy530:
	yych = (unsigned char)*++cur;
	if (yych == '\n') goto yy524;
	goto yy529;
yy531:
	yyaccept = 0;
	yych = (unsigned char)*(mar = ++cur);
	if (yych <= '/') goto yy532;
	if (yych <= '7') goto yy546;
yy532:
#line 817 "../src/parse/lex.re"
	{ msg.error(ast.loc, "syntax error in octal escape sequence"); exit(1); }
#line 4756 "src/parse/lex.cc"
yy533:
	++cur;
	goto yy532;
yy534:
	yyaccept = 1;
	yych = (unsigned char)*(mar = ++cur);
	if (yych <= '@') {
		if (yych <= '/') goto yy535;
		if (yych <= '9') goto yy548;
	} else {
		if (yych <= 'F') goto yy548;
		if (yych <= '`') goto yy535;
		if (yych <= 'f') goto yy548;
	}
yy535:
#line 816 "../src/parse/lex.re"
	{ msg.error(ast.loc, "syntax error in hexadecimal escape sequence"); exit(1); }
#line 4774 "src/parse/lex.cc"
yy536:
	yyaccept = 1;
	yych = (unsigned char)*(mar = ++cur);
	if (yych <= '@') {
		if (yych <= '/') goto yy535;
		if (yych <= '9') goto yy549;
		goto yy535;
	} else {
		if (yych <= 'F') goto yy549;
		if (yych <= '`') goto yy535;
		if (yych <= 'f') goto yy549;
		goto yy535;
	}
yy537:
	++cur;
#line 833 "../src/parse/lex.re"
	{ ast.chr = static_cast<uint8_t>('\\'); return true; }
#line 4792 "src/parse/lex.cc"
yy538:
	++cur;
#line 826 "../src/parse/lex.re"
	{ ast.chr = static_cast<uint8_t>('\a'); return true; }
#line 4797 "src/parse/lex.cc"
yy539:
	++cur;
#line 827 "../src/parse/lex.re"
	{ ast.chr = static_cast<uint8_t>('\b'); return true; }
#line 4802 "src/parse/lex.cc"
yy540:
	++cur;
#line 828 "../src/parse/lex.re"
	{ ast.chr = static_cast<uint8_t>('\f'); return true; }
#line 4807 "src/parse/lex.cc"
yy541:
	++cur;
#line 829 "../src/parse/lex.re"
	{ ast.chr = static_cast<uint8_t>('\n'); return true; }
#line 4812 "src/parse/lex.cc"
yy542:
	++cur;
#line 830 "../src/parse/lex.re"
	{ ast.chr = static_cast<uint8_t>('\r'); return true; }
#line 4817 "src/parse/lex.cc"
yy543:
	++cur;
#line 831 "../src/parse/lex.re"
	{ ast.chr = static_cast<uint8_t>('\t'); return true; }
#line 4822 "src/parse/lex.cc"
yy544:
	++cur;
#line 832 "../src/parse/lex.re"
	{ ast.chr = static_cast<uint8_t>('\v'); return true; }
#line 4827 "src/parse/lex.cc"
yy545:
	yyaccept = 1;
	yych = (unsigned char)*(mar = ++cur);
	if (yych <= '@') {
		if (yych <= '/') goto yy535;
		if (yych <= '9') goto yy550;
		goto yy535;
	} else {
		if (yych <= 'F') goto yy550;
		if (yych <= '`') goto yy535;
		if (yych <= 'f') goto yy550;
		goto yy535;
	}
yy546:
	yych = (unsigned char)*++cur;
	if (yych <= '/') goto yy547;
	if (yych <= '7') goto yy551;
yy547:
	cur = mar;
	if (yyaccept == 0) {
		goto yy532;
	} else {
		goto yy535;
	}
yy548:
	yych = (unsigned char)*++cur;
	if (yych <= '@') {
		if (yych <= '/') goto yy547;
		if (yych <= '9') goto yy552;
		goto yy547;
	} else {
		if (yych <= 'F') goto yy552;
		if (yych <= '`') goto yy547;
		if (yych <= 'f') goto yy552;
		goto yy547;
	}
yy549:
	yych = (unsigned char)*++cur;
	if (yych <= '@') {
		if (yych <= '/') goto yy547;
		if (yych <= '9') goto yy553;
		goto yy547;
	} else {
		if (yych <= 'F') goto yy553;
		if (yych <= '`') goto yy547;
		if (yych <= 'f') goto yy553;
		goto yy547;
	}
yy550:
	yych = (unsigned char)*++cur;
	if (yych <= '@') {
		if (yych <= '/') goto yy547;
		if (yych <= '9') goto yy554;
		goto yy547;
	} else {
		if (yych <= 'F') goto yy554;
		if (yych <= '`') goto yy547;
		if (yych <= 'f') goto yy554;
		goto yy547;
	}
yy551:
	++cur;
#line 825 "../src/parse/lex.re"
	{ ast.chr = unesc_oct(tok, cur); return true; }
#line 4892 "src/parse/lex.cc"
yy552:
	yych = (unsigned char)*++cur;
	if (yych <= '@') {
		if (yych <= '/') goto yy547;
		if (yych <= '9') goto yy555;
		goto yy547;
	} else {
		if (yych <= 'F') goto yy555;
		if (yych <= '`') goto yy547;
		if (yych <= 'f') goto yy555;
		goto yy547;
	}
yy553:
	yych = (unsigned char)*++cur;
	if (yych <= '@') {
		if (yych <= '/') goto yy547;
		if (yych <= '9') goto yy550;
		goto yy547;
	} else {
		if (yych <= 'F') goto yy550;
		if (yych <= '`') goto yy547;
		if (yych <= 'f') goto yy550;
		goto yy547;
	}
yy554:
	++cur;
#line 824 "../src/parse/lex.re"
	{ ast.chr = unesc_hex(tok, cur); return true; }
#line 4921 "src/parse/lex.cc"
yy555:
	yych = (unsigned char)*++cur;
	if (yych <= '@') {
		if (yych <= '/') goto yy547;
		if (yych >= ':') goto yy547;
	} else {
		if (yych <= 'F') goto yy556;
		if (yych <= '`') goto yy547;
		if (yych >= 'g') goto yy547;
	}
yy556:
	yych = (unsigned char)*++cur;
	if (yych <= '@') {
		if (yych <= '/') goto yy547;
		if (yych <= '9') goto yy549;
		goto yy547;
	} else {
		if (yych <= 'F') goto yy549;
		if (yych <= '`') goto yy547;
		if (yych <= 'f') goto yy549;
		goto yy547;
	}
}
#line 841 "../src/parse/lex.re"

    }
    else {
        
#line 4950 "src/parse/lex.cc"
{
	unsigned char yych;
	unsigned int yyaccept = 0;
	if ((lim - cur) < 10) { if (!fill(10)) { error("unexpected end of input"); exit(1); } }
	yych = (unsigned char)*cur;
	if (yych <= 0x7F) {
		if (yych <= '\f') {
			if (yych <= 0x00) goto yy558;
			if (yych == '\n') goto yy561;
			goto yy559;
		} else {
			if (yych <= '\r') goto yy562;
			if (yych == '\\') goto yy563;
			goto yy559;
		}
	} else {
		if (yych <= 0xEF) {
			if (yych <= 0xC1) goto yy565;
			if (yych <= 0xDF) goto yy567;
			if (yych <= 0xE0) goto yy568;
			goto yy569;
		} else {
			if (yych <= 0xF0) goto yy570;
			if (yych <= 0xF3) goto yy571;
			if (yych <= 0xF4) goto yy572;
			goto yy565;
		}
	}
yy558:
	++cur;
#line 821 "../src/parse/lex.re"
	{ fail_if_eof(); ast.chr = 0; return true; }
#line 4983 "src/parse/lex.cc"
yy559:
	++cur;
yy560:
#line 823 "../src/parse/lex.re"
	{ ast.chr = decode(tok); return tok[0] != quote; }
#line 4989 "src/parse/lex.cc"
yy561:
	++cur;
#line 815 "../src/parse/lex.re"
	{ msg.error(ast.loc, "newline in character string"); exit(1); }
#line 4994 "src/parse/lex.cc"
yy562:
	yych = (unsigned char)*++cur;
	if (yych == '\n') goto yy561;
	goto yy560;
yy563:
	yyaccept = 0;
	yych = (unsigned char)*(mar = ++cur);
	if (yych <= 'f') {
		if (yych <= 'T') {
			if (yych <= '\f') {
				if (yych <= 0x00) goto yy564;
				if (yych == '\n') goto yy561;
				goto yy573;
			} else {
				if (yych <= '/') {
					if (yych <= '\r') goto yy575;
					goto yy573;
				} else {
					if (yych <= '3') goto yy576;
					if (yych <= '7') goto yy578;
					goto yy573;
				}
			}
		} else {
			if (yych <= '\\') {
				if (yych <= 'W') {
					if (yych <= 'U') goto yy579;
					goto yy573;
				} else {
					if (yych <= 'X') goto yy581;
					if (yych <= '[') goto yy573;
					goto yy582;
				}
			} else {
				if (yych <= 'a') {
					if (yych <= '`') goto yy573;
					goto yy583;
				} else {
					if (yych <= 'b') goto yy584;
					if (yych <= 'e') goto yy573;
					goto yy585;
				}
			}
		}
	} else {
		if (yych <= 'w') {
			if (yych <= 'r') {
				if (yych == 'n') goto yy586;
				if (yych <= 'q') goto yy573;
				goto yy587;
			} else {
				if (yych <= 't') {
					if (yych <= 's') goto yy573;
					goto yy588;
				} else {
					if (yych <= 'u') goto yy581;
					if (yych <= 'v') goto yy589;
					goto yy573;
				}
			}
		} else {
			if (yych <= 0xE0) {
				if (yych <= 0x7F) {
					if (yych <= 'x') goto yy590;
					goto yy573;
				} else {
					if (yych <= 0xC1) goto yy564;
					if (yych <= 0xDF) goto yy591;
					goto yy593;
				}
			} else {
				if (yych <= 0xF0) {
					if (yych <= 0xEF) goto yy594;
					goto yy595;
				} else {
					if (yych <= 0xF3) goto yy596;
					if (yych <= 0xF4) goto yy597;
				}
			}
		}
	}
yy564:
#line 818 "../src/parse/lex.re"
	{ msg.error(ast.loc, "syntax error in escape sequence"); exit(1); }
#line 5079 "src/parse/lex.cc"
yy565:
	++cur;
yy566:
#line 819 "../src/parse/lex.re"
	{ msg.error(ast.loc, "syntax error"); exit(1); }
#line 5085 "src/parse/lex.cc"
yy567:
	yych = (unsigned char)*++cur;
	if (yych <= 0x7F) goto yy566;
	if (yych <= 0xBF) goto yy559;
	goto yy566;
yy568:
	yyaccept = 1;
	yych = (unsigned char)*(mar = ++cur);
	if (yych <= 0x9F) goto yy566;
	if (yych <= 0xBF) goto yy598;
	goto yy566;
yy569:
	yyaccept = 1;
	yych = (unsigned char)*(mar = ++cur);
	if (yych <= 0x7F) goto yy566;
	if (yych <= 0xBF) goto yy598;
	goto yy566;
yy570:
	yyaccept = 1;
	yych = (unsigned char)*(mar = ++cur);
	if (yych <= 0x8F) goto yy566;
	if (yych <= 0xBF) goto yy599;
	goto yy566;
yy571:
	yyaccept = 1;
	yych = (unsigned char)*(mar = ++cur);
	if (yych <= 0x7F) goto yy566;
	if (yych <= 0xBF) goto yy599;
	goto yy566;
yy572:
	yyaccept = 1;
	yych = (unsigned char)*(mar = ++cur);
	if (yych <= 0x7F) goto yy566;
	if (yych <= 0x8F) goto yy599;
	goto yy566;
yy573:
	++cur;
yy574:
#line 834 "../src/parse/lex.re"
	{
        ast.chr = decode(tok + 1);
        if (tok[1] != quote) msg.warn.useless_escape(ast.loc, tok, cur);
        return true;
    }
#line 5130 "src/parse/lex.cc"
yy575:
	yych = (unsigned char)*++cur;
	if (yych == '\n') goto yy561;
	goto yy574;
yy576:
	yyaccept = 2;
	yych = (unsigned char)*(mar = ++cur);
	if (yych <= '/') goto yy577;
	if (yych <= '7') goto yy600;
yy577:
#line 817 "../src/parse/lex.re"
	{ msg.error(ast.loc, "syntax error in octal escape sequence"); exit(1); }
#line 5143 "src/parse/lex.cc"
yy578:
	++cur;
	goto yy577;
yy579:
	yyaccept = 3;
	yych = (unsigned char)*(mar = ++cur);
	if (yych <= '@') {
		if (yych <= '/') goto yy580;
		if (yych <= '9') goto yy601;
	} else {
		if (yych <= 'F') goto yy601;
		if (yych <= '`') goto yy580;
		if (yych <= 'f') goto yy601;
	}
yy580:
#line 816 "../src/parse/lex.re"
	{ msg.error(ast.loc, "syntax error in hexadecimal escape sequence"); exit(1); }
#line 5161 "src/parse/lex.cc"
yy581:
	yyaccept = 3;
	yych = (unsigned char)*(mar = ++cur);
	if (yych <= '@') {
		if (yych <= '/') goto yy580;
		if (yych <= '9') goto yy602;
		goto yy580;
	} else {
		if (yych <= 'F') goto yy602;
		if (yych <= '`') goto yy580;
		if (yych <= 'f') goto yy602;
		goto yy580;
	}
yy582:
	++cur;
#line 833 "../src/parse/lex.re"
	{ ast.chr = static_cast<uint8_t>('\\'); return true; }
#line 5179 "src/parse/lex.cc"
yy583:
	++cur;
#line 826 "../src/parse/lex.re"
	{ ast.chr = static_cast<uint8_t>('\a'); return true; }
#line 5184 "src/parse/lex.cc"
yy584:
	++cur;
#line 827 "../src/parse/lex.re"
	{ ast.chr = static_cast<uint8_t>('\b'); return true; }
#line 5189 "src/parse/lex.cc"
yy585:
	++cur;
#line 828 "../src/parse/lex.re"
	{ ast.chr = static_cast<uint8_t>('\f'); return true; }
#line 5194 "src/parse/lex.cc"
yy586:
	++cur;
#line 829 "../src/parse/lex.re"
	{ ast.chr = static_cast<uint8_t>('\n'); return true; }
#line 5199 "src/parse/lex.cc"
yy587:
	++cur;
#line 830 "../src/parse/lex.re"
	{ ast.chr = static_cast<uint8_t>('\r'); return true; }
#line 5204 "src/parse/lex.cc"
yy588:
	++cur;
#line 831 "../src/parse/lex.re"
	{ ast.chr = static_cast<uint8_t>('\t'); return true; }
#line 5209 "src/parse/lex.cc"
yy589:
	++cur;
#line 832 "../src/parse/lex.re"
	{ ast.chr = static_cast<uint8_t>('\v'); return true; }
#line 5214 "src/parse/lex.cc"
yy590:
	yyaccept = 3;
	yych = (unsigned char)*(mar = ++cur);
	if (yych <= '@') {
		if (yych <= '/') goto yy580;
		if (yych <= '9') goto yy603;
		goto yy580;
	} else {
		if (yych <= 'F') goto yy603;
		if (yych <= '`') goto yy580;
		if (yych <= 'f') goto yy603;
		goto yy580;
	}
yy591:
	yych = (unsigned char)*++cur;
	if (yych <= 0x7F) goto yy592;
	if (yych <= 0xBF) goto yy573;
yy592:
	cur = mar;
	if (yyaccept <= 1) {
		if (yyaccept == 0) {
			goto yy564;
		} else {
			goto yy566;
		}
	} else {
		if (yyaccept == 2) {
			goto yy577;
		} else {
			goto yy580;
		}
	}
yy593:
	yych = (unsigned char)*++cur;
	if (yych <= 0x9F) goto yy592;
	if (yych <= 0xBF) goto yy591;
	goto yy592;
yy594:
	yych = (unsigned char)*++cur;
	if (yych <= 0x7F) goto yy592;
	if (yych <= 0xBF) goto yy591;
	goto yy592;
yy595:
	yych = (unsigned char)*++cur;
	if (yych <= 0x8F) goto yy592;
	if (yych <= 0xBF) goto yy594;
	goto yy592;
yy596:
	yych = (unsigned char)*++cur;
	if (yych <= 0x7F) goto yy592;
	if (yych <= 0xBF) goto yy594;
	goto yy592;
yy597:
	yych = (unsigned char)*++cur;
	if (yych <= 0x7F) goto yy592;
	if (yych <= 0x8F) goto yy594;
	goto yy592;
yy598:
	yych = (unsigned char)*++cur;
	if (yych <= 0x7F) goto yy592;
	if (yych <= 0xBF) goto yy559;
	goto yy592;
yy599:
	yych = (unsigned char)*++cur;
	if (yych <= 0x7F) goto yy592;
	if (yych <= 0xBF) goto yy598;
	goto yy592;
yy600:
	yych = (unsigned char)*++cur;
	if (yych <= '/') goto yy592;
	if (yych <= '7') goto yy604;
	goto yy592;
yy601:
	yych = (unsigned char)*++cur;
	if (yych <= '@') {
		if (yych <= '/') goto yy592;
		if (yych <= '9') goto yy605;
		goto yy592;
	} else {
		if (yych <= 'F') goto yy605;
		if (yych <= '`') goto yy592;
		if (yych <= 'f') goto yy605;
		goto yy592;
	}
yy602:
	yych = (unsigned char)*++cur;
	if (yych <= '@') {
		if (yych <= '/') goto yy592;
		if (yych <= '9') goto yy606;
		goto yy592;
	} else {
		if (yych <= 'F') goto yy606;
		if (yych <= '`') goto yy592;
		if (yych <= 'f') goto yy606;
		goto yy592;
	}
yy603:
	yych = (unsigned char)*++cur;
	if (yych <= '@') {
		if (yych <= '/') goto yy592;
		if (yych <= '9') goto yy607;
		goto yy592;
	} else {
		if (yych <= 'F') goto yy607;
		if (yych <= '`') goto yy592;
		if (yych <= 'f') goto yy607;
		goto yy592;
	}
yy604:
	++cur;
#line 825 "../src/parse/lex.re"
	{ ast.chr = unesc_oct(tok, cur); return true; }
#line 5327 "src/parse/lex.cc"
yy605:
	yych = (unsigned char)*++cur;
	if (yych <= '@') {
		if (yych <= '/') goto yy592;
		if (yych <= '9') goto yy608;
		goto yy592;
	} else {
		if (yych <= 'F') goto yy608;
		if (yych <= '`') goto yy592;
		if (yych <= 'f') goto yy608;
		goto yy592;
	}
yy606:
	yych = (unsigned char)*++cur;
	if (yych <= '@') {
		if (yych <= '/') goto yy592;
		if (yych <= '9') goto yy603;
		goto yy592;
	} else {
		if (yych <= 'F') goto yy603;
		if (yych <= '`') goto yy592;
		if (yych <= 'f') goto yy603;
		goto yy592;
	}
yy607:
	++cur;
#line 824 "../src/parse/lex.re"
	{ ast.chr = unesc_hex(tok, cur); return true; }
#line 5356 "src/parse/lex.cc"
yy608:
	yych = (unsigned char)*++cur;
	if (yych <= '@') {
		if (yych <= '/') goto yy592;
		if (yych >= ':') goto yy592;
	} else {
		if (yych <= 'F') goto yy609;
		if (yych <= '`') goto yy592;
		if (yych >= 'g') goto yy592;
	}
yy609:
	yych = (unsigned char)*++cur;
	if (yych <= '@') {
		if (yych <= '/') goto yy592;
		if (yych <= '9') goto yy602;
		goto yy592;
	} else {
		if (yych <= 'F') goto yy602;
		if (yych <= '`') goto yy592;
		if (yych <= 'f') goto yy602;
		goto yy592;
	}
}
#line 844 "../src/parse/lex.re"

    }
}