#define I(type, Type, value, highlight) do { \
yylval->semantic_.type ## _ = A CY ## Type; \
+ yylval->semantic_.type ## _->location_ = *yylloc; \
F(value, highlight); \
} while (false)
nl = reinterpret_cast<const char *>(memchr(nl + 1, '\n', left)); \
} while (nl != NULL); \
yylloc->step(); \
- yylloc->end.lines(lines); \
- yylloc->end.columns(left); \
+ yylloc->end.Lines(lines); \
+ yylloc->end.Columns(left); \
more \
} else L \
}
-#define R yylloc->end.columns(yyleng);
+#define R yylloc->end.Columns(yyleng);
#define L yylloc->step(); R
#define H(value, highlight) do { \
U3 [\xe0-\xef]
U4 [\xf0-\xf4]
UN [\xc0-\xc1\xf5-\xff]
+UE {U1}|{U2}|{U3}|{U4}|{UN}
HexDigit [0-9a-fA-F]
LineTerminatorSequence \r?\n|\r|\xe2\x80[\xa8\xa9]
UnicodeStart {IdentifierMore}|{UnicodeIDStart}
UnicodePart {IdentifierMore}|\xe2\x80[\x8c\x8d]|{UnicodeIDContinue}
-UnicodeFail {U2}|{U3}|{U3}{U0}|{U4}|{U4}{U0}|{U4}{U0}{U0}|{UN}|{U0}
-UnicodeScrap {UnicodePart}*{UnicodeFail}?
+UnicodeScrap {U2}|{U3}{U0}{0,1}|{U4}{U0}{0,2}|{UN}|{U0}
+UnicodeError ({U2}|{U3}{U0}{0,1}|{U4}{U0}{0,2}){UE}|{UN}|{U0}
IdentifierStart {UnicodeStart}|{UnicodeEscape}
IdentifierPart {UnicodePart}|{UnicodeEscape}
-IdentifierFail {UnicodeFail}|\\(u({HexDigit}{0,3}|\{{HexDigit}*))?
+IdentifierFail {UnicodeError}|\\(u({HexDigit}{0,3}|\{{HexDigit}*))?
IdentifierScrap {IdentifierPart}*{IdentifierFail}?
RegularExpressionBackslashSequence \\{NoneTerminatorCharacter}
/* RegEx {{{ */
<RegularExpression>{
\/{UnicodePart}* R CYLexBufferUnits(yytext, yyleng); CYLexBufferEnd(literal, RegEx, tk::RegularExpressionLiteral, hi::Constant);
- \/{UnicodePart}*{UnicodeFail} R E("invalid flags")
+ \/{UnicodePart}*{UnicodeError} R E("invalid character");
{RegExCharacter}+ R CYLexBufferUnits(yytext, yyleng);
- {RegExCharacter}*{UnicodeFail} R E("invalid character");
{RegularExpressionBackslashSequence} R CYLexBufferUnits(yytext, yyleng);
- \\{UnicodeFail}? R E("invalid escape")
+ \\ R E("invalid escape")
+
+ (\\|{RegExCharacter}+)?{LineTerminatorSequence} R E("invalid newline");
+ (\\|{RegExCharacter}+)?{UnicodeScrap} R E("invalid character");
"["{RegularExpressionClassChars}"]" R CYLexBufferUnits(yytext, yyleng);
"["{RegularExpressionClassChars}\\? R E("invalid class");
- "["{RegularExpressionClassChars}\\?{UnicodeFail} R E("invalid character");
+
"["{RegularExpressionClassChars}\\?{LineTerminatorSequence} R E("invalid newline");
+ "["{RegularExpressionClassChars}\\?{UnicodeScrap} R E("invalid character");
- (\\|{RegExCharacter}+)?{LineTerminatorSequence} R E("invalid newline");
<<EOF>> R E("unterminated regex")
}
/* }}} */
<MultiLine>{
\**\*\/ R yy_pop_state(yyscanner); M N
- \**{LineTerminatorSequence} yylloc->end.lines(); yyextra->last_ = true;
+ \**{LineTerminatorSequence} yylloc->end.Lines(); yyextra->last_ = true;
\**{CommentCharacter}|\/ R
- \**({UnicodeFail}|\*) R E("invalid comment");
+
+ \**{UnicodeScrap} R E("invalid character");
+ \**\* R E("invalid comment");
+
<<EOF>> R E("invalid comment")
}
/* }}} */
"@YES" L F(tk::At_YES_, hi::Constant);
@end
-@({UnicodeStart}{UnicodeScrap}|{UnicodeFail}) L E("invalid keyword")
+@({UnicodeStart}{UnicodePart}*{UnicodeError}?|{UnicodeError}) L E("invalid keyword")
/* }}} */
/* Highlight {{{ */
"undefined" L F(tk::_undefined_, hi::Operator);
"enum" L /*FFF*/ F(tk::_enum_, hi::Meta);
"export" L /*FFK*/ F(tk::_export_, hi::Meta);
"extends" L /*FFK*/ F(tk::_extends_, hi::Meta);
+"eval" L /*III*/ F(tk::_eval_, hi::Special);
"false" L /*LLL*/ F(tk::_false_, hi::Constant);
"final" L /*FII*/ F(tk::_final_, hi::Meta);
"finally" L /*KKK*/ F(tk::_finally_, 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);
+"Infinity" L /*III*/ F(tk::_Infinity_, hi::Constant);
"instanceof" L /*KKK*/ F(tk::_instanceof_, hi::Operator);
"int" L /*FII*/ F(tk::_int_, hi::Type);
"interface" L /*FSS*/ F(tk::_interface_, hi::Meta);
<LegacySingleString,StrictSingleString>{
\' R CYLexBufferEnd(string, String, tk::StringLiteral, hi::Constant);
{SingleCharacter}+ R CYLexBufferUnits(yytext, yyleng);
- {SingleCharacter}*{UnicodeFail} R E("invalid character");
- {LineTerminatorSequence} R E("invalid newline");
+ {SingleCharacter}*{LineTerminatorSequence} R E("invalid newline");
+ {SingleCharacter}*{UnicodeScrap} R E("invalid character");
}
\" L CYLexBufferStart(LegacyDoubleString);
<LegacyDoubleString,StrictDoubleString>{
\" R CYLexBufferEnd(string, String, tk::StringLiteral, hi::Constant);
{DoubleCharacter}+ R CYLexBufferUnits(yytext, yyleng);
- {DoubleCharacter}*{UnicodeFail} R E("invalid character");
- {LineTerminatorSequence} R E("invalid newline");
+ {DoubleCharacter}*{LineTerminatorSequence} R E("invalid newline");
+ {DoubleCharacter}*{UnicodeScrap} R E("invalid character");
}
/* }}} */
/* Template {{{ */
"$" R CYLexBufferUnit('$');
{PlateCharacter}+ R CYLexBufferUnits(yytext, yyleng);
- {PlateCharacter}*{UnicodeFail} R E("invalid character");
- {LineTerminatorSequence} R E("invalid newline");
+ {PlateCharacter}*{LineTerminatorSequence} R E("invalid newline");
+ {PlateCharacter}*{UnicodeScrap} R E("invalid character");
}
/* }}} */
/* Escapes {{{ */
CYLexBufferPoint(point);
}
- \\{LineTerminatorSequence} yylloc->end.lines();
- \\(.|{NotLineTerminator}) R CYLexBufferUnits(yytext + 1, yyleng - 1);
+ \\{LineTerminatorSequence} yylloc->end.Lines();
+ \\{NoneTerminatorCharacter} R CYLexBufferUnits(yytext + 1, yyleng - 1);
+ \\{UnicodeScrap} R E("invalid character");
- \\(x{HexDigit}{0,1}|u({HexDigit}{0,3}|\{{HexDigit}*)|{UnicodeFail})? R E("invalid escape");
+ \\(x{HexDigit}{0,1}|u({HexDigit}{0,3}|\{{HexDigit}*))? R E("invalid escape");
<<EOF>> R E("invalid string");
}
/* }}} */
-{LineTerminatorSequence} yylloc->step(); yylloc->end.lines(); yyextra->last_ = true; N
+{LineTerminatorSequence} yylloc->step(); yylloc->end.Lines(); yyextra->last_ = true; N
{WhiteSpace} L
+{U1}|{UnicodeScrap} L E("invalid character");
<<EOF>> if (yyextra->auto_) { yyextra->auto_ = false; F(tk::AutoComplete, hi::Nothing); } L yyterminate();
-. L E("invalid character")
-
%%
#undef yyextra