[webkit-changes] cvs commit: JavaScriptCore/kjs grammar.y lexer.cpp
nodes.h grammar_types.h
Maciej
mjs at opensource.apple.com
Tue Sep 20 22:53:06 PDT 2005
mjs 05/09/20 22:53:05
Modified: . ChangeLog
kjs grammar.y lexer.cpp nodes.h
Removed: kjs grammar_types.h
Log:
Reviewed by Geoff and partly by Darin.
- fixed http://bugzilla.opendarwin.org/post_bug.cgi
(Reduce conflicts in JavaScriptCore grammar)
This change gets us down from over 200 shift/reduce and 45 reduce/reduce to
9 shift/reduce and 45 reduce/reduce.
* kjs/grammar.y:
* kjs/grammar_types.h: Removed.
* kjs/lexer.cpp:
* kjs/nodes.h:
(KJS::Node::isGroupNode):
(KJS::Node::isLocation):
(KJS::Node::isResolveNode):
(KJS::Node::isBracketAccessorNode):
(KJS::Node::isDotAccessorNode):
(KJS::ResolveNode::isLocation):
(KJS::ResolveNode::isResolveNode):
(KJS::ResolveNode::identifier):
(KJS::GroupNode::isGroupNode):
(KJS::GroupNode::leafNode):
(KJS::BracketAccessorNode::isLocation):
(KJS::BracketAccessorNode::isBracketAccessorNode):
(KJS::BracketAccessorNode::base):
(KJS::BracketAccessorNode::subscript):
(KJS::DotAccessorNode::isLocation):
(KJS::DotAccessorNode::isDotAccessorNode):
(KJS::DotAccessorNode::base):
(KJS::DotAccessorNode::identifier):
(KJS::FuncExprNode::FuncExprNode):
(KJS::FuncExprNode::identifier):
(KJS::FuncDeclNode::FuncDeclNode):
(KJS::FuncDeclNode::execute):
Revision Changes Path
1.834 +37 -0 JavaScriptCore/ChangeLog
Index: ChangeLog
===================================================================
RCS file: /cvs/root/JavaScriptCore/ChangeLog,v
retrieving revision 1.833
retrieving revision 1.834
diff -u -r1.833 -r1.834
--- ChangeLog 21 Sep 2005 01:10:54 -0000 1.833
+++ ChangeLog 21 Sep 2005 05:53:04 -0000 1.834
@@ -1,3 +1,40 @@
+2005-09-20 Maciej Stachowiak <mjs at apple.com>
+
+ Reviewed by Geoff and partly by Darin.
+
+ - fixed http://bugzilla.opendarwin.org/post_bug.cgi
+ (Reduce conflicts in JavaScriptCore grammar)
+
+ This change gets us down from over 200 shift/reduce and 45 reduce/reduce to
+ 9 shift/reduce and 45 reduce/reduce.
+
+ * kjs/grammar.y:
+ * kjs/grammar_types.h: Removed.
+ * kjs/lexer.cpp:
+ * kjs/nodes.h:
+ (KJS::Node::isGroupNode):
+ (KJS::Node::isLocation):
+ (KJS::Node::isResolveNode):
+ (KJS::Node::isBracketAccessorNode):
+ (KJS::Node::isDotAccessorNode):
+ (KJS::ResolveNode::isLocation):
+ (KJS::ResolveNode::isResolveNode):
+ (KJS::ResolveNode::identifier):
+ (KJS::GroupNode::isGroupNode):
+ (KJS::GroupNode::leafNode):
+ (KJS::BracketAccessorNode::isLocation):
+ (KJS::BracketAccessorNode::isBracketAccessorNode):
+ (KJS::BracketAccessorNode::base):
+ (KJS::BracketAccessorNode::subscript):
+ (KJS::DotAccessorNode::isLocation):
+ (KJS::DotAccessorNode::isDotAccessorNode):
+ (KJS::DotAccessorNode::base):
+ (KJS::DotAccessorNode::identifier):
+ (KJS::FuncExprNode::FuncExprNode):
+ (KJS::FuncExprNode::identifier):
+ (KJS::FuncDeclNode::FuncDeclNode):
+ (KJS::FuncDeclNode::execute):
+
2005-09-20 Geoffrey Garen <ggaren at apple.com>
- Oops. The 4263434 change was only appropriate on the branch. Rolling out.
1.29 +61 -65 JavaScriptCore/kjs/grammar.y
Index: grammar.y
===================================================================
RCS file: /cvs/root/JavaScriptCore/kjs/grammar.y,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- grammar.y 4 Sep 2005 06:21:54 -0000 1.28
+++ grammar.y 21 Sep 2005 05:53:05 -0000 1.29
@@ -32,7 +32,6 @@
#include "nodes.h"
#include "lexer.h"
#include "internal.h"
-#include "grammar_types.h"
// Not sure why, but yacc doesn't add this define along with the others.
#define yylloc kjsyylloc
@@ -50,6 +49,8 @@
using namespace KJS;
+static Node *makeFunctionCallNode(Node *func, ArgumentsNode *args);
+
%}
%union {
@@ -62,6 +63,7 @@
ParameterNode *param;
FunctionBodyNode *body;
FuncDeclNode *func;
+ FuncExprNode *funcExpr;
ProgramNode *prog;
AssignExprNode *init;
SourceElementsNode *srcs;
@@ -79,8 +81,6 @@
PropertyNode *pnode;
CatchNode *cnode;
FinallyNode *fnode;
- NodePair np;
- NodeWithIdent ni;
}
%start Program
@@ -124,7 +124,7 @@
%token AUTOPLUSPLUS AUTOMINUSMINUS
/* non-terminal types */
-%type <node> Literal PrimaryExpr Expr MemberExpr FunctionExpr NewExpr CallExpr
+%type <node> Literal PrimaryExpr Expr MemberExpr NewExpr CallExpr
%type <node> ArrayLiteral
%type <node> LeftHandSideExpr PostfixExpr UnaryExpr
%type <node> MultiplicativeExpr AdditiveExpr
@@ -148,6 +148,7 @@
%type <slist> StatementList
%type <init> Initializer
%type <func> FunctionDeclaration
+%type <funcExpr> FunctionExpr
%type <body> FunctionBody
%type <srcs> SourceElements
%type <param> FormalParameterList
@@ -164,10 +165,7 @@
%type <elm> ElementList
%type <plist> PropertyNameAndValueList
%type <pnode> PropertyName
-
%type <ident> ParenthesizedIdent
-%type <np> MemberBracketExpr CallBracketExpr ParenthesizedBracketExpr
-%type <ni> MemberDotExpr CallDotExpr ParenthesizedDotExpr
%%
@@ -196,8 +194,6 @@
| Literal
| ArrayLiteral
| ParenthesizedIdent { $$ = new ResolveNode(*$1); }
- | ParenthesizedBracketExpr { $$ = new GroupNode(new BracketAccessorNode($1.first, $1.second)); }
- | ParenthesizedDotExpr { $$ = new GroupNode(new DotAccessorNode($1.node, *$1.ident)); }
| '(' Expr ')' { $$ = new GroupNode($2); }
| '{' '}' { $$ = new ObjectLiteralNode(); }
| '{' PropertyNameAndValueList '}' { $$ = new ObjectLiteralNode($2); }
@@ -237,39 +233,11 @@
| NUMBER { $$ = new PropertyNode($1); }
;
-CallBracketExpr:
- CallExpr '[' Expr ']' { $$ = makeNodePair($1, $3); }
-;
-
-MemberBracketExpr:
- MemberExpr '[' Expr ']' { $$ = makeNodePair($1, $3); }
-;
-
-ParenthesizedBracketExpr:
- '(' MemberBracketExpr ')' { $$ = $2; }
- | '(' CallBracketExpr ')' { $$ = $2; }
- | '(' ParenthesizedBracketExpr ')' { $$ = $2; }
-;
-
-CallDotExpr:
- CallExpr '.' IDENT { $$ = makeNodeWithIdent($1, $3); }
-;
-
-MemberDotExpr:
- MemberExpr '.' IDENT { $$ = makeNodeWithIdent($1, $3); }
-;
-
-ParenthesizedDotExpr:
- '(' MemberDotExpr ')' { $$ = $2; }
- | '(' CallDotExpr ')' { $$ = $2; }
- | '(' ParenthesizedDotExpr ')' { $$ = $2; }
-;
-
MemberExpr:
PrimaryExpr
- | FunctionExpr
- | MemberBracketExpr { $$ = new BracketAccessorNode($1.first, $1.second); }
- | MemberDotExpr { $$ = new DotAccessorNode($1.node, *$1.ident); }
+ | FunctionExpr { $$ = $1; }
+ | MemberExpr '[' Expr ']' { $$ = new BracketAccessorNode($1, $3); }
+ | MemberExpr '.' IDENT { $$ = new DotAccessorNode($1, *$3); }
| NEW MemberExpr Arguments { $$ = new NewExprNode($2, $3); }
;
@@ -279,17 +247,10 @@
;
CallExpr:
- ParenthesizedIdent Arguments { $$ = new FunctionCallResolveNode(*$1, $2); }
- | MemberBracketExpr Arguments { $$ = new FunctionCallBracketNode($1.first, $1.second, $2); }
- | CallBracketExpr Arguments { $$ = new FunctionCallBracketNode($1.first, $1.second, $2); }
- | ParenthesizedBracketExpr Arguments { $$ = new FunctionCallParenBracketNode($1.first, $1.second, $2); }
- | MemberDotExpr Arguments { $$ = new FunctionCallDotNode($1.node, *$1.ident, $2); }
- | CallDotExpr Arguments { $$ = new FunctionCallDotNode($1.node, *$1.ident, $2); }
- | ParenthesizedDotExpr Arguments { $$ = new FunctionCallParenDotNode($1.node, *$1.ident, $2); }
- | MemberExpr Arguments { $$ = new FunctionCallValueNode($1, $2); }
- | CallExpr Arguments { $$ = new FunctionCallValueNode($1, $2); }
- | CallBracketExpr { $$ = new BracketAccessorNode($1.first, $1.second); }
- | CallDotExpr { $$ = new DotAccessorNode($1.node, *$1.ident); }
+ MemberExpr Arguments { $$ = makeFunctionCallNode($1, $2); }
+ | CallExpr Arguments { $$ = makeFunctionCallNode($1, $2); }
+ | CallExpr '[' Expr ']' { $$ = new BracketAccessorNode($1, $3); }
+ | CallExpr '.' IDENT { $$ = new DotAccessorNode($1, *$3); }
;
Arguments:
@@ -407,20 +368,27 @@
AssignmentExpr:
ConditionalExpr
- | ParenthesizedIdent AssignmentOperator AssignmentExpr
- { $$ = new AssignResolveNode(*$1, $2, $3); }
- | MemberBracketExpr AssignmentOperator AssignmentExpr
- { $$ = new AssignBracketNode($1.first, $1.second, $2, $3); }
- | CallBracketExpr AssignmentOperator AssignmentExpr
- { $$ = new AssignBracketNode($1.first, $1.second, $2, $3); }
- | ParenthesizedBracketExpr AssignmentOperator AssignmentExpr
- { $$ = new AssignBracketNode($1.first, $1.second, $2, $3); }
- | MemberDotExpr AssignmentOperator AssignmentExpr
- { $$ = new AssignDotNode($1.node, *$1.ident, $2, $3); }
- | CallDotExpr AssignmentOperator AssignmentExpr
- { $$ = new AssignDotNode($1.node, *$1.ident, $2, $3); }
- | ParenthesizedDotExpr AssignmentOperator AssignmentExpr
- { $$ = new AssignDotNode($1.node, *$1.ident, $2, $3); }
+ | LeftHandSideExpr AssignmentOperator AssignmentExpr
+ {
+ Node *n = $1;
+ bool paren = n->isGroupNode();
+ if (paren)
+ n = static_cast<GroupNode *>(n)->nodeInsideAllParens();
+
+ if (!n->isLocation())
+ YYABORT;
+ else if (n->isResolveNode()) {
+ ResolveNode *resolve = static_cast<ResolveNode *>(n);
+ $$ = new AssignResolveNode(resolve->identifier(), $2, $3);
+ } else if (n->isBracketAccessorNode()) {
+ BracketAccessorNode *bracket = static_cast<BracketAccessorNode *>(n);
+ $$ = new AssignBracketNode(bracket->base(), bracket->subscript(), $2, $3);
+ } else {
+ assert(n->isDotAccessorNode());
+ DotAccessorNode *dot = static_cast<DotAccessorNode *>(n);
+ $$ = new AssignDotNode(dot->base(), dot->identifier(), $2, $3);
+ }
+ }
;
AssignmentOperator:
@@ -717,6 +685,34 @@
%%
+static Node *makeFunctionCallNode(Node *func, ArgumentsNode *args)
+{
+ Node *n = func;
+ bool paren = n->isGroupNode();
+ if (paren)
+ n = static_cast<GroupNode *>(n)->nodeInsideAllParens();
+
+ if (!n->isLocation())
+ return new FunctionCallValueNode(func, args);
+ else if (n->isResolveNode()) {
+ ResolveNode *resolve = static_cast<ResolveNode *>(n);
+ return new FunctionCallResolveNode(resolve->identifier(), args);
+ } else if (n->isBracketAccessorNode()) {
+ BracketAccessorNode *bracket = static_cast<BracketAccessorNode *>(n);
+ if (paren)
+ return new FunctionCallParenBracketNode(bracket->base(), bracket->subscript(), args);
+ else
+ return new FunctionCallBracketNode(bracket->base(), bracket->subscript(), args);
+ } else {
+ assert(n->isDotAccessorNode());
+ DotAccessorNode *dot = static_cast<DotAccessorNode *>(n);
+ if (paren)
+ return new FunctionCallParenDotNode(dot->base(), dot->identifier(), args);
+ else
+ return new FunctionCallDotNode(dot->base(), dot->identifier(), args);
+ }
+}
+
int yyerror (const char * /* s */) /* Called by yyparse on error */
{
// fprintf(stderr, "ERROR: %s at line %d\n",
1.20 +0 -1 JavaScriptCore/kjs/lexer.cpp
Index: lexer.cpp
===================================================================
RCS file: /cvs/root/JavaScriptCore/kjs/lexer.cpp,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- lexer.cpp 11 Aug 2005 10:26:53 -0000 1.19
+++ lexer.cpp 21 Sep 2005 05:53:05 -0000 1.20
@@ -39,7 +39,6 @@
#include "identifier.h"
#include "lookup.h"
#include "internal.h"
-#include "grammar_types.h"
// we can't specify the namespace in yacc's C output, so do it here
using namespace KJS;
1.34 +48 -10 JavaScriptCore/kjs/nodes.h
Index: nodes.h
===================================================================
RCS file: /cvs/root/JavaScriptCore/kjs/nodes.h,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- nodes.h 19 Sep 2005 06:57:27 -0000 1.33
+++ nodes.h 21 Sep 2005 05:53:05 -0000 1.34
@@ -97,6 +97,13 @@
void deref() { --m_refcount; if (!m_refcount) delete this; }
unsigned int refcount() { return m_refcount; }
+ virtual bool isGroupNode() const { return false; }
+
+ virtual bool isLocation() const { return false; }
+ virtual bool isResolveNode() const { return false; }
+ virtual bool isBracketAccessorNode() const { return false; }
+ virtual bool isDotAccessorNode() const { return false; }
+
protected:
ValueImp *throwError(ExecState *exec, ErrorType e, const char *msg);
ValueImp *throwError(ExecState *exec, ErrorType e, const char *msg, ValueImp *, Node *);
@@ -194,6 +201,11 @@
ValueImp *evaluate(ExecState *exec);
virtual Reference evaluateReference(ExecState *exec);
virtual void streamTo(SourceStream &s) const;
+
+ virtual bool isLocation() const { return true; }
+ virtual bool isResolveNode() const { return true; }
+ const Identifier& identifier() const { return ident; }
+
private:
Identifier ident;
};
@@ -204,6 +216,17 @@
virtual ValueImp *evaluate(ExecState *exec);
virtual Reference evaluateReference(ExecState *exec);
virtual void streamTo(SourceStream &s) const;
+
+ virtual bool isGroupNode() const { return true; }
+ Node *nodeInsideAllParens()
+ {
+ Node *n = group.get();
+ while (n->isGroupNode()) {
+ n = static_cast<GroupNode *>(n)->group.get();
+ }
+ return n;
+ }
+
private:
KXMLCore::SharedPtr<Node> group;
};
@@ -281,6 +304,12 @@
ValueImp *evaluate(ExecState *exec);
virtual Reference evaluateReference(ExecState *exec);
virtual void streamTo(SourceStream &s) const;
+
+ virtual bool isLocation() const { return true; }
+ virtual bool isBracketAccessorNode() const { return true; }
+ Node *base() { return expr1.get(); }
+ Node *subscript() { return expr2.get(); }
+
private:
KXMLCore::SharedPtr<Node> expr1;
KXMLCore::SharedPtr<Node> expr2;
@@ -292,6 +321,12 @@
ValueImp *evaluate(ExecState *exec);
virtual Reference evaluateReference(ExecState *exec);
virtual void streamTo(SourceStream &s) const;
+
+ virtual bool isLocation() const { return true; }
+ virtual bool isDotAccessorNode() const { return true; }
+ Node *base() const { return expr.get(); }
+ const Identifier& identifier() const { return ident; }
+
private:
KXMLCore::SharedPtr<Node> expr;
Identifier ident;
@@ -953,29 +988,32 @@
void processFuncDecl(ExecState *exec);
};
- class FuncDeclNode : public StatementNode {
+ class FuncExprNode : public Node {
public:
- FuncDeclNode(const Identifier &i, FunctionBodyNode *b)
+ FuncExprNode(const Identifier &i, FunctionBodyNode *b)
: ident(i), param(0), body(b) { }
- FuncDeclNode(const Identifier &i, ParameterNode *p, FunctionBodyNode *b)
+ FuncExprNode(const Identifier &i, ParameterNode *p, FunctionBodyNode *b)
: ident(i), param(p->next), body(b) { p->next = 0; }
- Completion execute(ExecState */*exec*/)
- { /* empty */ return Completion(); }
- void processFuncDecl(ExecState *exec);
+ ValueImp *evaluate(ExecState *exec);
virtual void streamTo(SourceStream &s) const;
+
private:
+ friend class FuncDeclNode;
+
Identifier ident;
KXMLCore::SharedPtr<ParameterNode> param;
KXMLCore::SharedPtr<FunctionBodyNode> body;
};
- class FuncExprNode : public Node {
+ class FuncDeclNode : public StatementNode {
public:
- FuncExprNode(const Identifier &i, FunctionBodyNode *b)
+ FuncDeclNode(const Identifier &i, FunctionBodyNode *b)
: ident(i), param(0), body(b) { }
- FuncExprNode(const Identifier &i, ParameterNode *p, FunctionBodyNode *b)
+ FuncDeclNode(const Identifier &i, ParameterNode *p, FunctionBodyNode *b)
: ident(i), param(p->next), body(b) { p->next = 0; }
- ValueImp *evaluate(ExecState *exec);
+ Completion execute(ExecState */*exec*/)
+ { /* empty */ return Completion(); }
+ void processFuncDecl(ExecState *exec);
virtual void streamTo(SourceStream &s) const;
private:
Identifier ident;
More information about the webkit-changes
mailing list