Author: dda
Date: 2008-01-07 14:34:31 -0800 (Mon, 07 Jan 2008)
New Revision: 7761

Modified:
   
openlaszlo/branches/devildog/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/Parser.jjt
   openlaszlo/branches/devildog/test/optargs.lzx
Log:
Change 20080107-dda-C by [EMAIL PROTECTED] on 2008-01-07 16:44:28 EST
    in /Users/dda/laszlo/src/svn/openlaszlo/branches/devildog
    for http://svn.openlaszlo.org/openlaszlo/branches/devildog

Summary: SWF9: Fix grammar glitches in support for ...rest and optional 
parameters

New Features:

Bugs Fixed: LPP-5234

Technical Reviewer: ptw (pending)
QA Reviewer: hminsky (pending)
Doc Reviewer: (pending)

Documentation:

Release Notes:

Details:
    Previously, parsing of functions with optional or variable parameters had 
glitches.
    The known problems were that seeing a 'public' (and presumably any 
visibility keyword)
    before function caused a function with optional parameters to give an error.
    Also, if the function was the first item in the class (before any var) this 
would cause
    an error.  To fix this, I chose to simplify the grammar.  Before, the rules 
that
    any optional parameters must appear after regular parameters, and that the 
vararg parameter
    must appear last was built into the rules of the grammar.  This made the 
grammar complicated,
    and required extra LOOKAHEAD macros to resolve ambigulities.  Now the 
grammar is simple,
    and the rules for the ordering of kinds of parameters are enforced after
    the parsing for each element is complete.  All the strange error cases 
related to this part
    of the grammar now appear resolved.

Tests:
    Tried the two cases reported by Henry: 'public' appearing before function 
with opt args,
    and function with opt args appearing first in a class.

    Tried the test/optargs.lzs case for coverage of legal cases.

    Added some (commented) illegal cases in test/optargs.lzs to test coverage 
for illegal cases.



Modified: 
openlaszlo/branches/devildog/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/Parser.jjt
===================================================================
--- 
openlaszlo/branches/devildog/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/Parser.jjt
 2008-01-07 22:34:04 UTC (rev 7760)
+++ 
openlaszlo/branches/devildog/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/Parser.jjt
 2008-01-07 22:34:31 UTC (rev 7761)
@@ -67,6 +67,31 @@
         //    sn.setEndLocation(t.endLine, t.endColumn);
         //}
     }
+
+    public static class FormalParameterState {
+        private boolean hasRest = false;
+        private boolean hasInit = false;
+        private Token token;
+        public void setToken(Token t) {
+            token = t;
+        }
+        public void checkRestParameter() {
+            if (hasRest)
+                throw new ParseException(token, "multiple ...rest parameters 
not allowed");
+            hasRest = true;
+        }
+        public void checkInitParameter() {
+            if (hasRest)
+                throw new ParseException(token, "...rest parameter must be 
last");
+            hasInit = true;
+        }
+        public void checkRegularParameter() {
+            if (hasRest)
+                throw new ParseException(token, "...rest parameter must be 
last");
+            if (hasInit)
+                throw new ParseException(token, "regular parameters not 
allowed after optional parameters");
+        }
+    }
 }
 PARSER_END(Parser)
 
@@ -903,42 +928,43 @@
     Block()
 }
 
-ASTFormalParameterList FormalParameterList() #FormalParameterList : {}
+ASTFormalParameterList FormalParameterList() #FormalParameterList : 
{FormalParameterState fstate = new FormalParameterState(); Token t;}
 {
-     "(" [FormalParameters()] ")" 
+     t="(" {fstate.setToken(t);}
+       [ FormalParameter(fstate) ( "," FormalParameter(fstate) )* ] ")" 
      { return jjtThis; }
 }
 
-void FormalParameters() : {}
+void FormalParameter(FormalParameterState fstate) #void : {ASTIdentifier id; 
boolean hasRest = false; boolean hasInit = false;}
 {
-    FormalRestParameter()
-|   LOOKAHEAD(FormalParameter() ("," | ")")) FormalParameter()
-      (LOOKAHEAD("," FormalParameter() ("," | ")")) "," FormalParameter())*
-      (LOOKAHEAD("," FormalInitParameter()) "," FormalInitParameter())*
-      ["," FormalRestParameter()]
-|   FormalInitParameter()
-      (LOOKAHEAD("," FormalInitParameter()) "," FormalInitParameter())*
-      ["," FormalRestParameter()]
+  (
+    "..." id = FormalParameterIdentifier()
+    {
+        fstate.setToken(getToken(0));
+        id.setEllipsis(true);
+        hasRest = true;
+    }
+  | FormalParameterIdentifier()
+    [ "=" FormalInitializer()
+      {
+          fstate.setToken(getToken(0));
+          hasInit = true;
+      }
+    ]
+  )
+  {
+    if (hasRest)
+      fstate.checkRestParameter();
+    else if (hasInit)
+      fstate.checkInitParameter();
+    else
+      fstate.checkRegularParameter();
+  }
 }
 
-void FormalRestParameter() #void : {ASTIdentifier id;}
-{
-    "..." id = FormalParameterIdentifier()  { id.setEllipsis(true); }
-}
-
-void FormalParameter() #void : {ASTIdentifier id;}
-{
-    id = FormalParameterIdentifier()  { id.setEllipsis(false); }
-}
-
-void FormalInitParameter() #void : {}
-{
-    FormalParameter() FormalInitializer()
-}
-
 void FormalInitializer() #FormalInitializer : {}
 {
-     "=" AssignmentExpression()
+     AssignmentExpression()
 }
 
 ASTIdentifier FormalParameterIdentifier() #void : {ASTIdentifier id; 
ASTIdentifier.Type type;}

Modified: openlaszlo/branches/devildog/test/optargs.lzx
===================================================================
--- openlaszlo/branches/devildog/test/optargs.lzx       2008-01-07 22:34:04 UTC 
(rev 7760)
+++ openlaszlo/branches/devildog/test/optargs.lzx       2008-01-07 22:34:31 UTC 
(rev 7761)
@@ -43,6 +43,14 @@
   return 'f4(' + w + ',' + x + ',' + y + ',' + z + ',' + rest + ')';
 }
 
+// These can be uncommented to check error cases.
+//function xx1(...x, y) { }
+//function xx2(...x, ...y) { }
+//function xx3(...x, y = null) { }
+//function xx4(x = null, ...y, z) { }
+//function xx5(x = null, z) { }
+// function xx6(x = null, z, w = null) { }
+
 function show(x) {
    Debug.write(x);
 }
@@ -79,7 +87,7 @@
 
 </script>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2007 Laszlo Systems, Inc.  All Rights Reserved.                   *
+* Copyright 2007-2008 Laszlo Systems, Inc.  All Rights Reserved.              *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->
 </canvas>


_______________________________________________
Laszlo-checkins mailing list
[email protected]
http://www.openlaszlo.org/mailman/listinfo/laszlo-checkins

Reply via email to