lexer now distinguishes between IN/OF and FORIN/FOROF to help grammar, fixing #737

This commit is contained in:
satyr
2010-10-06 04:46:17 +09:00
parent 380bee97dd
commit 2e6b50335f
8 changed files with 101 additions and 90 deletions

View File

@@ -460,38 +460,38 @@
})
],
ForSource: [
o("IN Expression", function() {
o("FORIN Expression", function() {
return {
source: $2
};
}), o("OF Expression", function() {
}), o("FOROF Expression", function() {
return {
source: $2,
object: true
};
}), o("IN Expression WHEN Expression", function() {
}), o("FORIN Expression WHEN Expression", function() {
return {
source: $2,
guard: $4
};
}), o("OF Expression WHEN Expression", function() {
}), o("FOROF Expression WHEN Expression", function() {
return {
source: $2,
guard: $4,
object: true
};
}), o("IN Expression BY Expression", function() {
}), o("FORIN Expression BY Expression", function() {
return {
source: $2,
step: $4
};
}), o("IN Expression WHEN Expression BY Expression", function() {
}), o("FORIN Expression WHEN Expression BY Expression", function() {
return {
source: $2,
guard: $4,
step: $6
};
}), o("IN Expression BY Expression WHEN Expression", function() {
}), o("FORIN Expression BY Expression WHEN Expression", function() {
return {
source: $2,
step: $4,
@@ -597,18 +597,12 @@
return new OpNode($2, $1, $3);
}), o("Value COMPOUND_ASSIGN INDENT Expression OUTDENT", function() {
return new OpNode($2, $1, $4);
}), o("Expression IN Expression", function() {
return new InNode($1, $3);
}), o("Expression OF Expression", function() {
return new OpNode($2, $1, $3);
}), o("Expression INSTANCEOF Expression", function() {
return new OpNode($2, $1, $3);
}), o("Expression NOT_RELATED Expression", function() {
return $2 === 'in' ? new OpNode('!', new InNode($1, $3)) : new OpNode('!', new ParentheticalNode(new OpNode($2, $1, $3)));
}), o("Expression RELATION Expression", function() {
return $2.charAt(0) === '!' ? ($2 === '!in' ? new OpNode('!', new InNode($1, $3)) : new OpNode('!', new ParentheticalNode(new OpNode($2.slice(1), $1, $3)))) : ($2 === 'in' ? new InNode($1, $3) : new OpNode($2, $1, $3));
})
]
};
operators = [["right", '?'], ["left", 'CALL_START', 'CALL_END'], ["nonassoc", '++', '--'], ["right", 'UNARY'], ["left", 'MATH'], ["left", '+', '-'], ["left", 'SHIFT'], ["left", 'COMPARE'], ["left", 'INSTANCEOF', 'NOT_RELATED'], ["left", '==', '!='], ["left", 'LOGIC'], ["right", 'COMPOUND_ASSIGN'], ["left", '.'], ["nonassoc", 'INDENT', 'OUTDENT'], ["right", 'WHEN', 'LEADING_WHEN', 'IN', 'OF', 'BY', 'THROW'], ["right", 'IF', 'UNLESS', 'ELSE', 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'SUPER', 'CLASS', 'EXTENDS'], ["right", '=', ':', 'RETURN'], ["right", '->', '=>', 'UNLESS', 'POST_IF', 'POST_UNLESS']];
operators = [["right", '?'], ["left", 'CALL_START', 'CALL_END'], ["nonassoc", '++', '--'], ["right", 'UNARY'], ["left", 'MATH'], ["left", '+', '-'], ["left", 'SHIFT'], ["left", 'COMPARE'], ["left", 'RELATION'], ["left", '==', '!='], ["left", 'LOGIC'], ["right", 'COMPOUND_ASSIGN'], ["left", '.'], ["nonassoc", 'INDENT', 'OUTDENT'], ["right", 'WHEN', 'LEADING_WHEN', 'FORIN', 'FOROF', 'BY', 'THROW'], ["right", 'IF', 'UNLESS', 'ELSE', 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'SUPER', 'CLASS', 'EXTENDS'], ["right", '=', ':', 'RETURN'], ["right", '->', '=>', 'UNLESS', 'POST_IF', 'POST_UNLESS']];
tokens = [];
for (name in grammar) {
if (!__hasProp.call(grammar, name)) continue;