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