"/=" L F(tk::SlashEqual, hi::Operator);
":" L F(tk::Colon, hi::Structure);
"," L F(tk::Comma, hi::Structure);
"?" L F(tk::Question, hi::Structure);
";" L F(tk::SemiColon, hi::Structure);
"(" L F(tk::OpenParen, hi::Structure);
")" L F(tk::CloseParen, hi::Structure);
"{" L yyextra->template_.push(false); F(yyextra->newline_ ? tk::OpenBrace_ : tk::OpenBrace, hi::Structure);
"}" L yyextra->template_.pop(); F(tk::CloseBrace, hi::Structure);
"[" L F(tk::OpenBracket, hi::Structure);
"]" L F(tk::CloseBracket, hi::Structure);
/* }}} */
/* Keyword {{{ */
"@error" L F(tk::At_error_, hi::Error);
@begin Java
"@class" L F(tk::At_class_, hi::Meta);
@end
@begin C
"@encode" L F(tk::At_encode_, hi::Meta);
@end
@begin ObjectiveC
"@end" L F(tk::At_end_, hi::Meta);
"@false" L F(tk::At_false_, hi::Constant);
"@implementation" L F(tk::At_implementation_, hi::Meta);
"@import" L F(tk::At_import_, hi::Special);
"@NO" L F(tk::At_NO_, hi::Constant);
"@null" L F(tk::At_null_, hi::Constant);
"@selector" L F(tk::At_selector_, hi::Meta);
"@true" L F(tk::At_true_, hi::Constant);
"@YES" L F(tk::At_YES_, hi::Constant);
@end
@({UnicodeStart}{UnicodeScrap}|{UnicodeFail}) L E("invalid keyword")
/* }}} */
/* Highlight {{{ */
"undefined" L F(tk::_undefined_, hi::Operator);
@begin ObjectiveC
"bool" L F(tk::_bool_, hi::Type);
"BOOL" L F(tk::_BOOL_, hi::Type);
"id" L F(tk::_id_, hi::Type);
"nil" L F(tk::_nil_, hi::Constant);
"NULL" L F(tk::_NULL_, hi::Constant);
"SEL" L F(tk::_SEL_, hi::Type);
@end
/* }}} */
/* Reserved {{{ */
"abstract" L /*FII*/ F(tk::_abstract_, hi::Meta);
"await" L /*II?*/ F(tk::_await_, hi::Meta);
"boolean" L /*FII*/ F(tk::_boolean_, hi::Type);
"break" L /*KKK*/ F(tk::_break_, hi::Control);
"byte" L /*FII*/ F(tk::_byte_, hi::Type);
"case" L /*KKK*/ F(tk::_case_, hi::Control);
"catch" L /*KKK*/ F(tk::_catch_, hi::Control);
"char" L /*FII*/ F(tk::_char_, hi::Type);
"class" L /*FFK*/ F(tk::_class_, hi::Meta);
"const" L /*FFK*/ F(tk::_const_, hi::Meta);
"continue" L /*KKK*/ F(tk::_continue_, hi::Control);
"debugger" L /*FKK*/ F(tk::_debugger_, hi::Meta);
"default" L /*KKK*/ F(tk::_default_, hi::Control);
"delete" L /*KKK*/ F(tk::_delete_, hi::Operator);
"do" L /*KKK*/ F(tk::_do_, hi::Control);
"double" L /*FII*/ F(tk::_double_, hi::Type);
"else" L /*KKK*/ F(tk::_else_, hi::Control);
"enum" L /*FFF*/ F(tk::_enum_, hi::Meta);
"export" L /*FFK*/ F(tk::_export_, hi::Meta);
"extends" L /*FFK*/ F(tk::_extends_, hi::Meta);
"false" L /*LLL*/ F(tk::_false_, hi::Constant);
"final" L /*FII*/ F(tk::_final_, hi::Meta);
"finally" L /*KKK*/ F(tk::_finally_, hi::Control);
"float" L /*FII*/ F(tk::_float_, hi::Type);
"for" L /*KKK*/ F(tk::_for_, hi::Control);
"function" L /*KKK*/ F(tk::_function_, hi::Meta);
"goto" L /*FII*/ F(tk::_goto_, hi::Control);
"if" L /*KKK*/ F(tk::_if_, hi::Control);
"implements" L /*FSS*/ F(tk::_implements_, hi::Meta);
"import" L /*FFK*/ F(tk::_import_, hi::Meta);
"in" L /*KKK*/ F(yyextra->in_.top() ? tk::_in__ : tk::_in_, hi::Operator);
"instanceof" L /*KKK*/ F(tk::_instanceof_, hi::Operator);
"int" L /*FII*/ F(tk::_int_, hi::Type);
"interface" L /*FSS*/ F(tk::_interface_, hi::Meta);
"let" L /*IS?*/ F(tk::_let_, hi::Meta);
"long" L /*FII*/ F(tk::_long_, hi::Type);
"native" L /*FII*/ F(tk::_native_, hi::Meta);
"new" L /*KKK*/ F(tk::_new_, hi::Operator);
"null" L /*LLL*/ F(tk::_null_, hi::Constant);
"package" L /*FSS*/ F(tk::_package_, hi::Meta);
"private" L /*FSS*/ F(tk::_private_, hi::Meta);
"protected" L /*FSS*/ F(tk::_protected_, hi::Meta);
"public" L /*FSS*/ F(tk::_public_, hi::Meta);
"return" L /*KKK*/ F(tk::_return_, hi::Control);
"short" L /*FII*/ F(tk::_short_, hi::Type);
"static" L /*FS?*/ F(tk::_static_, hi::Meta);
"super" L /*FFK*/ F(tk::_super_, hi::Constant);
"switch" L /*KKK*/ F(tk::_switch_, hi::Control);
"synchronized" L /*FII*/ F(tk::_synchronized_, hi::Meta);
"this" L /*KKK*/ F(tk::_this_, hi::Constant);
"throw" L /*KKK*/ F(tk::_throw_, hi::Control);
"throws" L /*FII*/ F(tk::_throws_, hi::Meta);
"transient" L /*FII*/ F(tk::_transient_, hi::Meta);
"true" L /*LLL*/ F(tk::_true_, hi::Constant);
"try" L /*KKK*/ F(tk::_try_, hi::Control);
"typeof" L /*KKK*/ F(tk::_typeof_, hi::Operator);
"var" L /*KKK*/ F(tk::_var_, hi::Meta);
"void" L /*KKK*/ F(tk::_void_, hi::Operator);
"volatile" L /*FII*/ F(tk::_volatile_, hi::Meta);
"while" L /*KKK*/ F(tk::_while_, hi::Control);
"with" L /*KKK*/ F(tk::_with_, hi::Control);
"yield" L /*IS?*/ F(tk::_yield_, hi::Control);
"auto" L F(tk::_auto_, hi::Meta);
"each" L F(tk::_each_, hi::Control);
"of" L F(tk::_of_, hi::Operator);
@begin C
"extern" L F(tk::_extern_, hi::Type);
"signed" L F(tk::_signed_, hi::Type);
"typedef" L F(tk::_typedef_, hi::Meta);
"unsigned" L F(tk::_unsigned_, hi::Type);
@end
@begin ObjectiveC
"NO" L F(tk::_NO_, hi::Constant);
"YES" L F(tk::_YES_, hi::Constant);
@end
@begin E4X
"namespace" L F(tk::_namespace_, hi::Meta);
"xml" L F(tk::_xml_, hi::Meta);
@end
/* }}} */
/* Identifier {{{ */
{UnicodeStart}{UnicodePart}* L I(identifier, Identifier(Y), tk::Identifier_, hi::Identifier);
{IdentifierStart}{IdentifierPart}* L {
char *value(A char[yyleng + 1]);
char *local(value);
for (yy_size_t i(0), e(yyleng); i != e; ++i) {
char next(yytext[i]);
if (next != '\\')
*local++ = next;
else
U(local, yytext, ++i);
}
*local = '\0';
I(identifier, Identifier(value), tk::Identifier_, hi::Identifier);
}
({IdentifierStart}{IdentifierPart}*)?{IdentifierFail} L E("invalid identifier")
/* }}} */
/* Number {{{ */
0[0-7]+ L I(number, Number(strtoull(yytext + 1, NULL, 8)), tk::NumericLiteral, hi::Constant);
0[0-9]+ L I(number, Number(strtoull(yytext + 1, NULL, 10)), tk::NumericLiteral, hi::Constant);
0[xX][0-9a-fA-F]+ L I(number, Number(strtoull(yytext + 2, NULL, 16)), tk::NumericLiteral, hi::Constant);
0[oO][0-7]+ L I(number, Number(strtoull(yytext + 2, NULL, 8)), tk::NumericLiteral, hi::Constant);
0[bB][0-1]+ L I(number, Number(strtoull(yytext + 2, NULL, 2)), tk::NumericLiteral, hi::Constant);
(\.[0-9]+|(0|[1-9][0-9]*)(\.[0-9]*)?)([eE][+-]?[0-9]+)? L I(number, Number(strtod(yytext, NULL)), tk::NumericLiteral, hi::Constant);
(\.[0-9]+|(0|[1-9][0-9]*)(\.[0-9]*)?)[eE][+-]?{IdentifierScrap} L E("invalid exponent")
(\.?[0-9]|(0|[1-9][0-9]*)\.){IdentifierScrap} L E("invalid number")
/* }}} */
/* String {{{ */
\' L CYLexBufferStart(LegacySingleString);
{
\' R CYLexBufferEnd(string, String, tk::StringLiteral, hi::Constant);
{SingleCharacter}+ R CYLexBufferUnits(yytext, yyleng);
{SingleCharacter}*{UnicodeFail} R E("invalid character");
{LineTerminatorSequence} R E("invalid newline");
}
\" L CYLexBufferStart(LegacyDoubleString);
{
\" R CYLexBufferEnd(string, String, tk::StringLiteral, hi::Constant);
{DoubleCharacter}+ R CYLexBufferUnits(yytext, yyleng);
{DoubleCharacter}*{UnicodeFail} R E("invalid character");
{LineTerminatorSequence} R E("invalid newline");
}
/* }}} */
/* Template {{{ */
"`" L yyextra->tail_ = false; CYLexBufferStart(StrictAccentString);
"}" L yyextra->tail_ = true; yyextra->template_.pop(); CYLexBufferStart(StrictAccentString);
{
"`" R CYLexBufferEnd(string, String, yyextra->tail_ ? tk::TemplateTail : tk::NoSubstitutionTemplate, hi::Constant);
"${" R yyextra->template_.push(true); CYLexBufferEnd(string, String, yyextra->tail_ ? tk::TemplateMiddle : tk::TemplateHead, hi::Constant);
"$" R CYLexBufferUnit('$');
{PlateCharacter}+ R CYLexBufferUnits(yytext, yyleng);
{PlateCharacter}*{UnicodeFail} R E("invalid character");
{LineTerminatorSequence} R E("invalid newline");
}
/* }}} */
/* Escapes {{{ */
{
\\[0-3][0-7][0-7] R CYLexBufferPoint(X(yytext[1]) << 6 | X(yytext[2]) << 3 | X(yytext[3]));
\\[0-7][0-7] R CYLexBufferUnit(X(yytext[1]) << 3 | X(yytext[2]));
\\[0-7] R CYLexBufferUnit(X(yytext[1]));
}
{
\\0[0-7] R E("legacy escape");
\\0 R CYLexBufferUnit('\0');
}
{
\\b R CYLexBufferUnit('\b');
\\f R CYLexBufferUnit('\f');
\\n R CYLexBufferUnit('\n');
\\r R CYLexBufferUnit('\r');
\\t R CYLexBufferUnit('\t');
\\v R CYLexBufferUnit('\v');
\\x{HexDigit}{2} R CYLexBufferPoint(X(yytext[2]) << 4 | X(yytext[3]));
\\u{HexDigit}{4} R CYLexBufferPoint(X(yytext[2]) << 12 | X(yytext[3]) << 8 | X(yytext[4]) << 4 | X(yytext[5]));
\\u\{{HexDigit}+\} R {
unsigned point(0);
for (yy_size_t i(3); i != yyleng - 1; ++i)
point = point << 4 | X(yytext[i]);
CYLexBufferPoint(point);
}
\\{LineTerminatorSequence} yylloc->end.lines();
\\(.|{NotLineTerminator}) R CYLexBufferUnits(yytext + 1, yyleng - 1);
\\(x{HexDigit}{0,1}|u({HexDigit}{0,3}|\{{HexDigit}*)|{UnicodeFail})? R E("invalid escape");
<> R E("invalid string");
}
/* }}} */
{LineTerminatorSequence} yylloc->step(); yylloc->end.lines(); yyextra->last_ = true; N
{WhiteSpace} L
<> if (yyextra->auto_) { yyextra->auto_ = false; F(tk::AutoComplete, hi::Nothing); } L yyterminate();
. L E("invalid character")
%%
void CYDriver::ScannerInit() {
cylex_init(&scanner_);
cyset_extra(this, scanner_);
}
void CYDriver::ScannerDestroy() {
cylex_destroy(scanner_);
}
void CYDriver::SetCondition(Condition condition) {
struct yyguts_t *yyg(reinterpret_cast(scanner_));
switch (condition) {
case RegExpCondition:
BEGIN(template_.top() ? RegExpOrTemplateTail : RegExp);
break;
@begin E4X
case XMLContentCondition:
BEGIN(XMLContent);
break;
case XMLTagCondition:
BEGIN(XMLTag);
break;
@end
default:
_assert(false);
}
}
void CYDriver::PushCondition(Condition condition) {
switch (condition) {
case RegExpCondition:
yy_push_state(RegExp, scanner_);
break;
@begin E4X
case XMLContentCondition:
yy_push_state(XMLContent, scanner_);
break;
case XMLTagCondition:
yy_push_state(XMLTag, scanner_);
break;
@end
default:
_assert(false);
}
}
void CYDriver::PopCondition() {
yy_pop_state(scanner_);
}
#if defined(__clang__)
#pragma clang diagnostic pop
#else
// must not pop -Wunused-function
//#pragma GCC diagnostic pop
#endif