Revision: 17589
Author:   [email protected]
Date:     Fri Nov  8 11:52:04 2013 UTC
Log:      Experimental parser: better generation

[email protected]

BUG=

Review URL: https://codereview.chromium.org/66533002
http://code.google.com/p/v8/source/detail?r=17589

Modified:
 /branches/experimental/parser/src/lexer/lexer_py.re
 /branches/experimental/parser/tools/lexer_generator/generator.py
 /branches/experimental/parser/tools/lexer_generator/nfa.py

=======================================
--- /branches/experimental/parser/src/lexer/lexer_py.re Wed Nov 6 15:45:04 2013 UTC +++ /branches/experimental/parser/src/lexer/lexer_py.re Fri Nov 8 11:52:04 2013 UTC
@@ -101,16 +101,63 @@
 line_terminator+  { PUSH_LINE_TERMINATOR(); }
 whitespace     <<continue>>

-"\"" <<DoubleQuoteString>> # TODO mark these transitions as ignoring this character
+"\""           <<DoubleQuoteString>>
 "'"            <<SingleQuoteString>>

-identifier_start     <<Identifier>>  # TODO merge identifier dfa...
+# all keywords
+"break"       { PUSH_TOKEN(BREAK); } <<break>>
+"case"        { PUSH_TOKEN(CASE); } <<break>>
+"catch"       { PUSH_TOKEN(CATCH); } <<break>>
+"class"       { PUSH_TOKEN(FUTURE_RESERVED_WORD); } <<break>>
+"const"       { PUSH_TOKEN(CONST); } <<break>>
+"continue"    { PUSH_TOKEN(CONTINUE); } <<break>>
+"debugger"    { PUSH_TOKEN(DEBUGGER); } <<break>>
+"default"     { PUSH_TOKEN(DEFAULT); } <<break>>
+"delete"      { PUSH_TOKEN(DELETE); } <<break>>
+"do"          { PUSH_TOKEN(DO); } <<break>>
+"else"        { PUSH_TOKEN(ELSE); } <<break>>
+"enum"        { PUSH_TOKEN(FUTURE_RESERVED_WORD); } <<break>>
+"export"      { PUSH_TOKEN(FUTURE_RESERVED_WORD); } <<break>>
+"extends"     { PUSH_TOKEN(FUTURE_RESERVED_WORD); } <<break>>
+"false"       { PUSH_TOKEN(FALSE_LITERAL); } <<break>>
+"finally"     { PUSH_TOKEN(FINALLY); } <<break>>
+"for"         { PUSH_TOKEN(FOR); } <<break>>
+"function"    { PUSH_TOKEN(FUNCTION); } <<break>>
+"if"          { PUSH_TOKEN(IF); } <<break>>
+"implements"  { PUSH_TOKEN(FUTURE_STRICT_RESERVED_WORD); } <<break>>
+"import"      { PUSH_TOKEN(FUTURE_RESERVED_WORD); } <<break>>
+"in"          { PUSH_TOKEN(IN); } <<break>>
+"instanceof"  { PUSH_TOKEN(INSTANCEOF); } <<break>>
+"interface"   { PUSH_TOKEN(FUTURE_STRICT_RESERVED_WORD); } <<break>>
+"let"         { PUSH_TOKEN(FUTURE_STRICT_RESERVED_WORD); } <<break>>
+"new"         { PUSH_TOKEN(NEW); } <<break>>
+"null"        { PUSH_TOKEN(NULL_LITERAL); } <<break>>
+"package"     { PUSH_TOKEN(FUTURE_STRICT_RESERVED_WORD); } <<break>>
+"private"     { PUSH_TOKEN(FUTURE_STRICT_RESERVED_WORD); } <<break>>
+"protected"   { PUSH_TOKEN(FUTURE_STRICT_RESERVED_WORD); } <<break>>
+"public"      { PUSH_TOKEN(FUTURE_STRICT_RESERVED_WORD); } <<break>>
+"return"      { PUSH_TOKEN(RETURN); } <<break>>
+"static"      { PUSH_TOKEN(FUTURE_STRICT_RESERVED_WORD); } <<break>>
+"super"       { PUSH_TOKEN(FUTURE_RESERVED_WORD); } <<break>>
+"switch"      { PUSH_TOKEN(SWITCH); } <<break>>
+"this"        { PUSH_TOKEN(THIS); } <<break>>
+"throw"       { PUSH_TOKEN(THROW); } <<break>>
+"true"        { PUSH_TOKEN(TRUE_LITERAL); } <<break>>
+"try"         { PUSH_TOKEN(TRY); } <<break>>
+"typeof"      { PUSH_TOKEN(TYPEOF); } <<break>>
+"var"         { PUSH_TOKEN(VAR); } <<break>>
+"void"        { PUSH_TOKEN(VOID); } <<break>>
+"while"       { PUSH_TOKEN(WHILE); } <<break>>
+"with"        { PUSH_TOKEN(WITH); } <<break>>
+"yield"       { PUSH_TOKEN(YIELD); } <<break>>
+
+identifier_start     <<Identifier>>
 /\\u[0-9a-fA-F]{4}/ {
   if (V8_LIKELY(ValidIdentifierStart())) {
     JUMP(Identifier);
   }
   PUSH_TOKEN(ILLEGAL);
-}
+} <<Identifier>>

 eof           <<terminate>>
 default       { PUSH_TOKEN(ILLEGAL); }
@@ -121,7 +168,7 @@
 "\""      { PUSH_TOKEN(STRING); } <<break>>
 /\\\n\r?/ <<continue>>
 /\\\r\n?/ <<continue>>
-/\n\r/    { PUSH_TOKEN(ILLEGAL); } <<break>>
+/\n|\r/    { PUSH_TOKEN(ILLEGAL); } <<break>>
 eof       <<terminate_illegal>>
 default   <<continue>>

@@ -131,7 +178,7 @@
 "'"       { PUSH_TOKEN(STRING); } <<break>>
 /\\\n\r?/ <<continue>>
 /\\\r\n?/ <<continue>>
-/\n\r/    { PUSH_TOKEN(ILLEGAL); } <<break>>
+/\n|\r/    { PUSH_TOKEN(ILLEGAL); } <<break>>
 eof       <<terminate_illegal>>
 default   <<continue>>

@@ -161,51 +208,3 @@
 line_terminator+ { PUSH_LINE_TERMINATOR(); }
 eof              <<terminate>>
 default          <<continue>>
-
-<default>
-# all keywords
-"break"       { PUSH_TOKEN(BREAK); } <<break>>
-"case"        { PUSH_TOKEN(CASE); } <<break>>
-"catch"       { PUSH_TOKEN(CATCH); } <<break>>
-"class"       { PUSH_TOKEN(FUTURE_RESERVED_WORD); } <<break>>
-"const"       { PUSH_TOKEN(CONST); } <<break>>
-"continue"    { PUSH_TOKEN(CONTINUE); } <<break>>
-"debugger"    { PUSH_TOKEN(DEBUGGER); } <<break>>
-"default"     { PUSH_TOKEN(DEFAULT); } <<break>>
-"delete"      { PUSH_TOKEN(DELETE); } <<break>>
-"do"          { PUSH_TOKEN(DO); } <<break>>
-"else"        { PUSH_TOKEN(ELSE); } <<break>>
-"enum"        { PUSH_TOKEN(FUTURE_RESERVED_WORD); } <<break>>
-"export"      { PUSH_TOKEN(FUTURE_RESERVED_WORD); } <<break>>
-"extends"     { PUSH_TOKEN(FUTURE_RESERVED_WORD); } <<break>>
-"false"       { PUSH_TOKEN(FALSE_LITERAL); } <<break>>
-"finally"     { PUSH_TOKEN(FINALLY); } <<break>>
-"for"         { PUSH_TOKEN(FOR); } <<break>>
-"function"    { PUSH_TOKEN(FUNCTION); } <<break>>
-"if"          { PUSH_TOKEN(IF); } <<break>>
-"implements"  { PUSH_TOKEN(FUTURE_STRICT_RESERVED_WORD); } <<break>>
-"import"      { PUSH_TOKEN(FUTURE_RESERVED_WORD); } <<break>>
-"in"          { PUSH_TOKEN(IN); } <<break>>
-"instanceof"  { PUSH_TOKEN(INSTANCEOF); } <<break>>
-"interface"   { PUSH_TOKEN(FUTURE_STRICT_RESERVED_WORD); } <<break>>
-"let"         { PUSH_TOKEN(FUTURE_STRICT_RESERVED_WORD); } <<break>>
-"new"         { PUSH_TOKEN(NEW); } <<break>>
-"null"        { PUSH_TOKEN(NULL_LITERAL); } <<break>>
-"package"     { PUSH_TOKEN(FUTURE_STRICT_RESERVED_WORD); } <<break>>
-"private"     { PUSH_TOKEN(FUTURE_STRICT_RESERVED_WORD); } <<break>>
-"protected"   { PUSH_TOKEN(FUTURE_STRICT_RESERVED_WORD); } <<break>>
-"public"      { PUSH_TOKEN(FUTURE_STRICT_RESERVED_WORD); } <<break>>
-"return"      { PUSH_TOKEN(RETURN); } <<break>>
-"static"      { PUSH_TOKEN(FUTURE_STRICT_RESERVED_WORD); } <<break>>
-"super"       { PUSH_TOKEN(FUTURE_RESERVED_WORD); } <<break>>
-"switch"      { PUSH_TOKEN(SWITCH); } <<break>>
-"this"        { PUSH_TOKEN(THIS); } <<break>>
-"throw"       { PUSH_TOKEN(THROW); } <<break>>
-"true"        { PUSH_TOKEN(TRUE_LITERAL); } <<break>>
-"try"         { PUSH_TOKEN(TRY); } <<break>>
-"typeof"      { PUSH_TOKEN(TYPEOF); } <<break>>
-"var"         { PUSH_TOKEN(VAR); } <<break>>
-"void"        { PUSH_TOKEN(VOID); } <<break>>
-"while"       { PUSH_TOKEN(WHILE); } <<break>>
-"with"        { PUSH_TOKEN(WITH); } <<break>>
-"yield"       { PUSH_TOKEN(YIELD); } <<break>>
=======================================
--- /branches/experimental/parser/tools/lexer_generator/generator.py Fri Nov 8 10:33:44 2013 UTC +++ /branches/experimental/parser/tools/lexer_generator/generator.py Fri Nov 8 11:52:04 2013 UTC
@@ -90,10 +90,12 @@
       if transition == 'continue':
         if not v['default'][1][2] == 'continue':
           graph = NfaBuilder.add_continue(graph)
+        else:
+          pass # TODO null key
       elif (transition == 'break' or
             transition == 'terminate' or
             transition == 'terminate_illegal'):
-        NfaBuilder.add_action(graph, (-1, transition, None))
+        graph = NfaBuilder.add_action(graph, (10000, transition, None))
       else:
         assert k == 'default'
graph = NfaBuilder.join_subgraph(graph, transition, rule_map[transition])
@@ -104,7 +106,7 @@
     assert transition == 'continue' or transition == 'break'
     if transition == 'continue':
       assert k != 'default'
-      # graph = NfaBuilder.apply_modifier('*', graph)
+      graph = NfaBuilder.add_incoming_action(graph, (10000, k, None))
     if code:
graph = NfaBuilder.add_incoming_action(graph, (precedence, code, None))
     rule_map[k] = graph
=======================================
--- /branches/experimental/parser/tools/lexer_generator/nfa.py Fri Nov 8 10:28:35 2013 UTC +++ /branches/experimental/parser/tools/lexer_generator/nfa.py Fri Nov 8 11:52:04 2013 UTC
@@ -214,8 +214,11 @@
       new_start.close(start)
       start = new_start
     else:
+      new_end = self.__new_state()
       for end in ends:
         end.set_transition_action(action)
+      self.__patch_ends(ends, new_end)
+      ends = [new_end]
     return (start, ends)

   def __continue(self, graph):

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to