Universal binary!
[cycript.git] / Cycript.l.in
index 72f814d75f460a2cbc62af4b27a28167e3b56e4c..bdd25ed31d661177c039b1f2b215f06b96124d27 100644 (file)
@@ -107,7 +107,8 @@ int H(char c) {
     } else if (yyextra->size_ == 0) \
         value = YY_NULL; \
     else { \
     } else if (yyextra->size_ == 0) \
         value = YY_NULL; \
     else { \
-        size_t copy(std::min(size, yyextra->size_)); \
+        size_t copy(size); \
+        copy = (std::min(copy, yyextra->size_)); \
         memcpy(data, yyextra->data_, copy); \
         yyextra->data_ += copy; \
         yyextra->size_ -= copy; \
         memcpy(data, yyextra->data_, copy); \
         yyextra->data_ += copy; \
         yyextra->size_ -= copy; \
@@ -160,7 +161,11 @@ XMLName {XMLNameStart}{XMLNamePart}*
 <RegExp>\/{RegularExpressionBody}\/{RegularExpressionFlags} E("")
 
 \/\/[^\n]* L
 <RegExp>\/{RegularExpressionBody}\/{RegularExpressionFlags} E("")
 
 \/\/[^\n]* L
-\/\*(\n|[^\*]|\*[^/])*\*\/ V(N)
+
+       /* http://ostermiller.org/findcomment.html */
+       /* XXX: unify these two rules using !? */
+\/\*!([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/ V() C yylval->comment_ = new(yyextra->pool_) CYComment(apr_pstrmemdup(yyextra->pool_, yytext, yyleng)); return tk::Comment;
+\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/ V(N)
 
 @begin E4X
 <RegExp>"<>"      L return tk::LeftRight;
 
 @begin E4X
 <RegExp>"<>"      L return tk::LeftRight;
@@ -188,11 +193,14 @@ XMLName {XMLNameStart}{XMLNamePart}*
 @end
 
 @begin E4X
 @end
 
 @begin E4X
-"@"    L C return tk::At;
 "::"   L C return tk::ColonColon;
 ".."   L C return tk::PeriodPeriod;
 @end
 
 "::"   L C return tk::ColonColon;
 ".."   L C return tk::PeriodPeriod;
 @end
 
+@begin E4X ObjectiveC
+"@"    L C return tk::At;
+@end
+
 "&"    L C return tk::Ampersand;
 "&&"   L C return tk::AmpersandAmpersand;
 "&="   L C return tk::AmpersandEqual;
 "&"    L C return tk::Ampersand;
 "&&"   L C return tk::AmpersandAmpersand;
 "&="   L C return tk::AmpersandEqual;
@@ -335,14 +343,14 @@ XMLName {XMLNameStart}{XMLNamePart}*
 (\.[0-9]+|(0|[1-9][0-9]*)(\.[0-9]*)?){Exponent}? L C yylval->number_ = new(yyextra->pool_) CYNumber(strtod(yytext, NULL)); return tk::NumericLiteral;
 
 0[xX][0-9a-fA-F]+ L C yylval->number_ = new(yyextra->pool_) CYNumber(strtoull(yytext + 2, NULL, 16)); return tk::NumericLiteral;
 (\.[0-9]+|(0|[1-9][0-9]*)(\.[0-9]*)?){Exponent}? L C yylval->number_ = new(yyextra->pool_) CYNumber(strtod(yytext, NULL)); return tk::NumericLiteral;
 
 0[xX][0-9a-fA-F]+ L C yylval->number_ = new(yyextra->pool_) CYNumber(strtoull(yytext + 2, NULL, 16)); return tk::NumericLiteral;
-
+0[0-7]+ L C yylval->number_ = new(yyextra->pool_) CYNumber(strtoull(yytext + 1, NULL, 8)); return tk::NumericLiteral;
 0[bB][0-1]+ L C yylval->number_ = new(yyextra->pool_) CYNumber(strtoull(yytext + 2, NULL, 2)); return tk::NumericLiteral;
 
 \"([^"\\\n]|{Escape})*\"|'([^'\\\n]|{Escape})*' L C {
     char *value(reinterpret_cast<char *>(apr_palloc(yyextra->pool_, yyleng)));
     char *local(value);
 
 0[bB][0-1]+ L C yylval->number_ = new(yyextra->pool_) CYNumber(strtoull(yytext + 2, NULL, 2)); return tk::NumericLiteral;
 
 \"([^"\\\n]|{Escape})*\"|'([^'\\\n]|{Escape})*' L C {
     char *value(reinterpret_cast<char *>(apr_palloc(yyextra->pool_, yyleng)));
     char *local(value);
 
-    for (int i(1); i != yyleng - 1; ++i) {
+    for (yy_size_t i(1), e(yyleng - 1); i != e; ++i) {
         char next(yytext[i]);
 
         if (yytext[i] == '\\')
         char next(yytext[i]);
 
         if (yytext[i] == '\\')
@@ -376,7 +384,8 @@ XMLName {XMLNameStart}{XMLNamePart}*
 \r?\n yylloc->end.lines(); yylloc->step(); N
 
 [ \t] L
 \r?\n yylloc->end.lines(); yylloc->step(); N
 
 [ \t] L
-<<EOF>> L yyterminate();
+
+<<EOF>> if (yyextra->auto_) { yyextra->auto_ = false; return tk::AutoComplete; } L yyterminate();
 
 . L {
     CYDriver::Error error;
 
 . L {
     CYDriver::Error error;