Index: src/lexer/lexer_py.re |
diff --git a/src/lexer/lexer_py.re b/src/lexer/lexer_py.re |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f7cd6c0ed30e0e8ff71fce8dafd238db24a1e7c2 |
--- /dev/null |
+++ b/src/lexer/lexer_py.re |
@@ -0,0 +1,196 @@ |
+# Copyright 2013 the V8 project authors. All rights reserved. |
+# Redistribution and use in source and binary forms, with or without |
+# modification, are permitted provided that the following conditions are |
+# met: |
+# |
+# * Redistributions of source code must retain the above copyright |
+# notice, this list of conditions and the following disclaimer. |
+# * Redistributions in binary form must reproduce the above |
+# copyright notice, this list of conditions and the following |
+# disclaimer in the documentation and/or other materials provided |
+# with the distribution. |
+# * Neither the name of Google Inc. nor the names of its |
+# contributors may be used to endorse or promote products derived |
+# from this software without specific prior written permission. |
+# |
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ |
+whitespace_char = [ \t\v\f\r\240:ws:]; |
+whitespace = whitespace_char+; |
+identifier_start = [$_a-zA-Z:lit:]; |
+identifier_char = [$_a-zA-Z0-9:lit:]; |
+not_identifier_char = [^:identifier_char:]; |
+line_terminator = [\n\r]+; |
+digit = [0-9]; |
+hex_digit = [0-9a-fA-F]; |
+maybe_exponent = ("e" [-+]? digit+)?; |
+number = ("0x" hex_digit+) | (("." digit+ maybe_exponent) | (digit+ ("." digit*)? maybe_exponent)); |
+ |
+<Normal> "break" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::BREAK); } |
+<Normal> "case" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::CASE); } |
+<Normal> "catch" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::CATCH); } |
+<Normal> "class" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::FUTURE_RESERVED_WORD); } |
+<Normal> "const" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::CONST); } |
+<Normal> "continue" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::CONTINUE); } |
+<Normal> "debugger" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::DEBUGGER); } |
+<Normal> "default" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::DEFAULT); } |
+<Normal> "delete" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::DELETE); } |
+<Normal> "do" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::DO); } |
+<Normal> "else" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::ELSE); } |
+<Normal> "enum" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::FUTURE_RESERVED_WORD); } |
+<Normal> "export" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::FUTURE_RESERVED_WORD); } |
+<Normal> "extends" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::FUTURE_RESERVED_WORD); } |
+<Normal> "false" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::FALSE_LITERAL); } |
+<Normal> "finally" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::FINALLY); } |
+<Normal> "for" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::FOR); } |
+<Normal> "function" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::FUNCTION); } |
+<Normal> "if" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::IF); } |
+<Normal> "implements" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::FUTURE_STRICT_RESERVED_WORD); } |
+<Normal> "import" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::FUTURE_RESERVED_WORD); } |
+<Normal> "in" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::IN); } |
+<Normal> "instanceof" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::INSTANCEOF); } |
+<Normal> "interface" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::FUTURE_STRICT_RESERVED_WORD); } |
+<Normal> "let" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::FUTURE_STRICT_RESERVED_WORD); } |
+<Normal> "new" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::NEW); } |
+<Normal> "null" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::NULL_LITERAL); } |
+<Normal> "package" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::FUTURE_STRICT_RESERVED_WORD); } |
+<Normal> "private" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::FUTURE_STRICT_RESERVED_WORD); } |
+<Normal> "protected" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::FUTURE_STRICT_RESERVED_WORD); } |
+<Normal> "public" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::FUTURE_STRICT_RESERVED_WORD); } |
+<Normal> "return" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::RETURN); } |
+<Normal> "static" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::FUTURE_STRICT_RESERVED_WORD); } |
+<Normal> "super" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::FUTURE_RESERVED_WORD); } |
+<Normal> "switch" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::SWITCH); } |
+<Normal> "this" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::THIS); } |
+<Normal> "throw" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::THROW); } |
+<Normal> "true" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::TRUE_LITERAL); } |
+<Normal> "try" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::TRY); } |
+<Normal> "typeof" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::TYPEOF); } |
+<Normal> "var" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::VAR); } |
+<Normal> "void" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::VOID); } |
+<Normal> "while" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::WHILE); } |
+<Normal> "with" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::WITH); } |
+<Normal> "yield" not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::YIELD); } |
+ |
+<Normal> "|=" { PUSH_TOKEN(Token::ASSIGN_BIT_OR); } |
+<Normal> "^=" { PUSH_TOKEN(Token::ASSIGN_BIT_XOR); } |
+<Normal> "&=" { PUSH_TOKEN(Token::ASSIGN_BIT_AND); } |
+<Normal> "+=" { PUSH_TOKEN(Token::ASSIGN_ADD); } |
+<Normal> "-=" { PUSH_TOKEN(Token::ASSIGN_SUB); } |
+<Normal> "*=" { PUSH_TOKEN(Token::ASSIGN_MUL); } |
+<Normal> "/=" { PUSH_TOKEN(Token::ASSIGN_DIV); } |
+<Normal> "%=" { PUSH_TOKEN(Token::ASSIGN_MOD); } |
+ |
+<Normal> "===" { PUSH_TOKEN(Token::EQ_STRICT); } |
+<Normal> "==" { PUSH_TOKEN(Token::EQ); } |
+<Normal> "=" { PUSH_TOKEN(Token::ASSIGN); } |
+<Normal> "!==" { PUSH_TOKEN(Token::NE_STRICT); } |
+<Normal> "!=" { PUSH_TOKEN(Token::NE); } |
+<Normal> "!" { PUSH_TOKEN(Token::NOT); } |
+ |
+<Normal> "//" :=> SingleLineComment |
+<Normal> whitespace* "-->" { if (just_seen_line_terminator_) { YYSETCONDITION(kConditionSingleLineComment); goto yyc_SingleLineComment; } else { --cursor_; send(Token::DEC); start_ = cursor_; goto yyc_Normal; } } |
+<Normal> "/*" :=> MultiLineComment |
+<Normal> "<!--" :=> HtmlComment |
+ |
+<Normal> ">>>=" { PUSH_TOKEN(Token::ASSIGN_SHR); } |
+<Normal> ">>>" { PUSH_TOKEN(Token::SHR); } |
+<Normal> "<<=" { PUSH_TOKEN(Token::ASSIGN_SHL); } |
+<Normal> ">>=" { PUSH_TOKEN(Token::ASSIGN_SAR); } |
+<Normal> "<=" { PUSH_TOKEN(Token::LTE); } |
+<Normal> ">=" { PUSH_TOKEN(Token::GTE); } |
+<Normal> "<<" { PUSH_TOKEN(Token::SHL); } |
+<Normal> ">>" { PUSH_TOKEN(Token::SAR); } |
+<Normal> "<" { PUSH_TOKEN(Token::LT); } |
+<Normal> ">" { PUSH_TOKEN(Token::GT); } |
+ |
+<Normal> number not_identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::NUMBER); } |
+<Normal> number identifier_char { PUSH_TOKEN_LOOKAHEAD(Token::ILLEGAL); } |
+ |
+<Normal> "(" { PUSH_TOKEN(Token::LPAREN); } |
+<Normal> ")" { PUSH_TOKEN(Token::RPAREN); } |
+<Normal> "[" { PUSH_TOKEN(Token::LBRACK); } |
+<Normal> "]" { PUSH_TOKEN(Token::RBRACK); } |
+<Normal> "{" { PUSH_TOKEN(Token::LBRACE); } |
+<Normal> "}" { PUSH_TOKEN(Token::RBRACE); } |
+<Normal> ":" { PUSH_TOKEN(Token::COLON); } |
+<Normal> ";" { PUSH_TOKEN(Token::SEMICOLON); } |
+<Normal> "." { PUSH_TOKEN(Token::PERIOD); } |
+<Normal> "?" { PUSH_TOKEN(Token::CONDITIONAL); } |
+<Normal> "++" { PUSH_TOKEN(Token::INC); } |
+<Normal> "--" { PUSH_TOKEN(Token::DEC); } |
+ |
+<Normal> "||" { PUSH_TOKEN(Token::OR); } |
+<Normal> "&&" { PUSH_TOKEN(Token::AND); } |
+ |
+<Normal> "|" { PUSH_TOKEN(Token::BIT_OR); } |
+<Normal> "^" { PUSH_TOKEN(Token::BIT_XOR); } |
+<Normal> "&" { PUSH_TOKEN(Token::BIT_AND); } |
+<Normal> "+" { PUSH_TOKEN(Token::ADD); } |
+<Normal> "-" { PUSH_TOKEN(Token::SUB); } |
+<Normal> "*" { PUSH_TOKEN(Token::MUL); } |
+<Normal> "/" { PUSH_TOKEN(Token::DIV); } |
+<Normal> "%" { PUSH_TOKEN(Token::MOD); } |
+<Normal> "~" { PUSH_TOKEN(Token::BIT_NOT); } |
+<Normal> "," { PUSH_TOKEN(Token::COMMA); } |
+ |
+<Normal> line_terminator { PUSH_LINE_TERMINATOR(); } |
+<Normal> whitespace { SKIP(); } |
+ |
+<Normal> "\"" :=> DoubleQuoteString |
+<Normal> "'" :=> SingleQuoteString |
+ |
+<Normal> identifier_start :=> Identifier |
+<Normal> "\\u[0-9a-fA-F]{4}" { if (ValidIdentifierStart()) { YYSETCONDITION(kConditionIdentifier); goto yyc_Identifier; } send(Token::ILLEGAL); start_ = cursor_; goto yyc_Normal; } |
+<Normal> "\\" { PUSH_TOKEN(Token::ILLEGAL); } |
+ |
+<Normal> eof { PUSH_EOF_AND_RETURN();} |
+<Normal> any { PUSH_TOKEN(Token::ILLEGAL); } |
+ |
+<DoubleQuoteString> "\\\\" { goto yyc_DoubleQuoteString; } |
+<DoubleQuoteString> "\\\"" { goto yyc_DoubleQuoteString; } |
+<DoubleQuoteString> "\"" { PUSH_TOKEN(Token::STRING);} |
+<DoubleQuoteString> "\\\n\r?" { goto yyc_DoubleQuoteString; } |
+<DoubleQuoteString> "\\\r\n?" { goto yyc_DoubleQuoteString; } |
+<DoubleQuoteString> "\n" => Normal { PUSH_TOKEN_LOOKAHEAD(Token::ILLEGAL); } |
+<DoubleQuoteString> "\r" => Normal { PUSH_TOKEN_LOOKAHEAD(Token::ILLEGAL); } |
+<DoubleQuoteString> eof { TERMINATE_ILLEGAL(); } |
+<DoubleQuoteString> any { goto yyc_DoubleQuoteString; } |
+ |
+<SingleQuoteString> "\\\\" { goto yyc_SingleQuoteString; } |
+<SingleQuoteString> "\\'" { goto yyc_SingleQuoteString; } |
+<SingleQuoteString> "'" { PUSH_TOKEN(Token::STRING);} |
+<SingleQuoteString> "\\\n\r?" { goto yyc_SingleQuoteString; } |
+<SingleQuoteString> "\\\r\n?" { goto yyc_SingleQuoteString; } |
+<SingleQuoteString> "\n" => Normal { PUSH_TOKEN_LOOKAHEAD(Token::ILLEGAL); } |
+<SingleQuoteString> "\r" => Normal { PUSH_TOKEN_LOOKAHEAD(Token::ILLEGAL); } |
+<SingleQuoteString> eof { TERMINATE_ILLEGAL(); } |
+<SingleQuoteString> any { goto yyc_SingleQuoteString; } |
+ |
+<Identifier> identifier_char+ { goto yyc_Identifier; } |
+<Identifier> "\\u[0-9a-fA-F]{4}" { if (ValidIdentifierPart()) { goto yyc_Identifier; } YYSETCONDITION(kConditionNormal); send(Token::ILLEGAL); start_ = cursor_; goto yyc_Normal; } |
+<Identifier> "\\" { PUSH_TOKEN(Token::ILLEGAL); } |
+<Identifier> any { PUSH_TOKEN_LOOKAHEAD(Token::IDENTIFIER); } |
+ |
+<SingleLineComment> line_terminator { PUSH_LINE_TERMINATOR();} |
+<SingleLineComment> eof { start_ = cursor_ - 1; PUSH_TOKEN(Token::EOS); } |
+<SingleLineComment> any { goto yyc_SingleLineComment; } |
+ |
+<MultiLineComment> "*//" { PUSH_LINE_TERMINATOR();} |
+<MultiLineComment> eof { start_ = cursor_ - 1; PUSH_TOKEN(Token::EOS); } |
+<MultiLineComment> any { goto yyc_MultiLineComment; } |
+ |
+<HtmlComment> eof { start_ = cursor_ - 1; PUSH_TOKEN(Token::EOS); } |
+<HtmlComment> "-->" { PUSH_LINE_TERMINATOR();} |
+<HtmlComment> line_terminator+ { PUSH_LINE_TERMINATOR();} |
+<HtmlComment> any { goto yyc_HtmlComment; } |