Issue #602. Adding JS's Bitwise Assignment operators.

This commit is contained in:
Jeremy Ashkenas
2010-08-11 19:24:59 -04:00
parent 6c997978bc
commit 398ec3be5a
6 changed files with 80 additions and 31 deletions

View File

@@ -585,6 +585,18 @@
return new OpNode('|', $1, $3); return new OpNode('|', $1, $3);
}), o("Expression ^ Expression", function() { }), o("Expression ^ Expression", function() {
return new OpNode('^', $1, $3); return new OpNode('^', $1, $3);
}), o("Expression <<= Expression", function() {
return new OpNode('<<=', $1, $3);
}), o("Expression >>= Expression", function() {
return new OpNode('>>=', $1, $3);
}), o("Expression >>>= Expression", function() {
return new OpNode('>>>=', $1, $3);
}), o("Expression &= Expression", function() {
return new OpNode('&=', $1, $3);
}), o("Expression |= Expression", function() {
return new OpNode('|=', $1, $3);
}), o("Expression ^= Expression", function() {
return new OpNode('^=', $1, $3);
}), o("Expression <= Expression", function() { }), o("Expression <= Expression", function() {
return new OpNode('<=', $1, $3); return new OpNode('<=', $1, $3);
}), o("Expression < Expression", function() { }), o("Expression < Expression", function() {
@@ -632,7 +644,7 @@
}) })
] ]
}; };
operators = [["left", '?'], ["nonassoc", 'UMINUS', 'UPLUS', '!', '!!', '~', '++', '--'], ["left", '*', '/', '%'], ["left", '+', '-'], ["left", '<<', '>>', '>>>'], ["left", '&', '|', '^'], ["left", '<=', '<', '>', '>='], ["right", 'DELETE', 'INSTANCEOF', 'TYPEOF'], ["left", '==', '!='], ["left", '&&', '||', 'OP?'], ["right", '-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?='], ["left", '.'], ["right", 'INDENT'], ["left", 'OUTDENT'], ["right", 'WHEN', 'LEADING_WHEN', 'IN', 'OF', 'BY', 'THROW'], ["right", 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'NEW', 'SUPER', 'CLASS'], ["left", 'EXTENDS'], ["right", '=', ':', 'RETURN'], ["right", '->', '=>', 'UNLESS', 'IF', 'ELSE']]; operators = [["left", '?'], ["nonassoc", 'UMINUS', 'UPLUS', '!', '!!', '~', '++', '--'], ["left", '*', '/', '%'], ["left", '+', '-'], ["left", '<<', '>>', '>>>'], ["left", '<=', '<', '>', '>='], ["right", 'DELETE', 'INSTANCEOF', 'TYPEOF'], ["left", '==', '!='], ["left", '&', '|', '^'], ["left", '&&', '||', 'OP?'], ["right", '-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|='], ["left", '.'], ["right", 'INDENT'], ["left", 'OUTDENT'], ["right", 'WHEN', 'LEADING_WHEN', 'IN', 'OF', 'BY', 'THROW'], ["right", 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'NEW', 'SUPER', 'CLASS'], ["left", 'EXTENDS'], ["right", '=', ':', 'RETURN'], ["right", '->', '=>', 'UNLESS', 'IF', 'ELSE']];
tokens = []; tokens = [];
_a = grammar; _a = grammar;
for (name in _a) { for (name in _a) {

View File

@@ -579,7 +579,7 @@
IDENTIFIER = /^([a-zA-Z\$_](\w|\$)*)/; IDENTIFIER = /^([a-zA-Z\$_](\w|\$)*)/;
NUMBER = /^(((\b0(x|X)[0-9a-fA-F]+)|((\b[0-9]+(\.[0-9]+)?|\.[0-9]+)(e[+\-]?[0-9]+)?)))\b/i; NUMBER = /^(((\b0(x|X)[0-9a-fA-F]+)|((\b[0-9]+(\.[0-9]+)?|\.[0-9]+)(e[+\-]?[0-9]+)?)))\b/i;
HEREDOC = /^("{6}|'{6}|"{3}\n?([\s\S]*?)\n?([ \t]*)"{3}|'{3}\n?([\s\S]*?)\n?([ \t]*)'{3})/; HEREDOC = /^("{6}|'{6}|"{3}\n?([\s\S]*?)\n?([ \t]*)"{3}|'{3}\n?([\s\S]*?)\n?([ \t]*)'{3})/;
OPERATOR = /^(-[\-=>]?|\+[+=]?|[*&|\/%=<>:!?]+)([ \t]*)/; OPERATOR = /^(-[\-=>]?|\+[+=]?|[*&|\/%=<>^:!?]+)([ \t]*)/;
WHITESPACE = /^([ \t]+)/; WHITESPACE = /^([ \t]+)/;
COMMENT = /^(\s*\#{3}(?!#)[ \t]*\n+([\s\S]*?)[ \t]*\n+[ \t]*\#{3}|(\s*#(?!##[^#])[^\n]*)+)/; COMMENT = /^(\s*\#{3}(?!#)[ \t]*\n+([\s\S]*?)[ \t]*\n+[ \t]*\#{3}|(\s*#(?!##[^#])[^\n]*)+)/;
CODE = /^((-|=)>)/; CODE = /^((-|=)>)/;

File diff suppressed because one or more lines are too long

View File

@@ -546,6 +546,13 @@ grammar =
o "Expression | Expression", -> new OpNode '|', $1, $3 o "Expression | Expression", -> new OpNode '|', $1, $3
o "Expression ^ Expression", -> new OpNode '^', $1, $3 o "Expression ^ Expression", -> new OpNode '^', $1, $3
o "Expression <<= Expression", -> new OpNode '<<=', $1, $3
o "Expression >>= Expression", -> new OpNode '>>=', $1, $3
o "Expression >>>= Expression", -> new OpNode '>>>=', $1, $3
o "Expression &= Expression", -> new OpNode '&=', $1, $3
o "Expression |= Expression", -> new OpNode '|=', $1, $3
o "Expression ^= Expression", -> new OpNode '^=', $1, $3
o "Expression <= Expression", -> new OpNode '<=', $1, $3 o "Expression <= Expression", -> new OpNode '<=', $1, $3
o "Expression < Expression", -> new OpNode '<', $1, $3 o "Expression < Expression", -> new OpNode '<', $1, $3
o "Expression > Expression", -> new OpNode '>', $1, $3 o "Expression > Expression", -> new OpNode '>', $1, $3
@@ -592,12 +599,12 @@ operators = [
["left", '*', '/', '%'] ["left", '*', '/', '%']
["left", '+', '-'] ["left", '+', '-']
["left", '<<', '>>', '>>>'] ["left", '<<', '>>', '>>>']
["left", '&', '|', '^']
["left", '<=', '<', '>', '>='] ["left", '<=', '<', '>', '>=']
["right", 'DELETE', 'INSTANCEOF', 'TYPEOF'] ["right", 'DELETE', 'INSTANCEOF', 'TYPEOF']
["left", '==', '!='] ["left", '==', '!=']
["left", '&', '|', '^']
["left", '&&', '||', 'OP?'] ["left", '&&', '||', 'OP?']
["right", '-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?='] ["right", '-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|=']
["left", '.'] ["left", '.']
["right", 'INDENT'] ["right", 'INDENT']
["left", 'OUTDENT'] ["left", 'OUTDENT']

View File

@@ -511,7 +511,7 @@ JS_FORBIDDEN = JS_KEYWORDS.concat RESERVED
IDENTIFIER = /^([a-zA-Z\$_](\w|\$)*)/ IDENTIFIER = /^([a-zA-Z\$_](\w|\$)*)/
NUMBER = /^(((\b0(x|X)[0-9a-fA-F]+)|((\b[0-9]+(\.[0-9]+)?|\.[0-9]+)(e[+\-]?[0-9]+)?)))\b/i NUMBER = /^(((\b0(x|X)[0-9a-fA-F]+)|((\b[0-9]+(\.[0-9]+)?|\.[0-9]+)(e[+\-]?[0-9]+)?)))\b/i
HEREDOC = /^("{6}|'{6}|"{3}\n?([\s\S]*?)\n?([ \t]*)"{3}|'{3}\n?([\s\S]*?)\n?([ \t]*)'{3})/ HEREDOC = /^("{6}|'{6}|"{3}\n?([\s\S]*?)\n?([ \t]*)"{3}|'{3}\n?([\s\S]*?)\n?([ \t]*)'{3})/
OPERATOR = /^(-[\-=>]?|\+[+=]?|[*&|\/%=<>:!?]+)([ \t]*)/ OPERATOR = /^(-[\-=>]?|\+[+=]?|[*&|\/%=<>^:!?]+)([ \t]*)/
WHITESPACE = /^([ \t]+)/ WHITESPACE = /^([ \t]+)/
COMMENT = /^(\s*\#{3}(?!#)[ \t]*\n+([\s\S]*?)[ \t]*\n+[ \t]*\#{3}|(\s*#(?!##[^#])[^\n]*)+)/ COMMENT = /^(\s*\#{3}(?!#)[ \t]*\n+([\s\S]*?)[ \t]*\n+[ \t]*\#{3}|(\s*#(?!##[^#])[^\n]*)+)/
CODE = /^((-|=)>)/ CODE = /^((-|=)>)/

View File

@@ -100,3 +100,21 @@ ok list.join(' ') is '0 100 5 10'
a = b = false a = b = false
a and= b or true a and= b or true
ok a is false ok a is false
# Bitwise operators:
ok (10 & 3) is 2
ok (10 | 3) is 11
ok (10 ^ 3) is 9
ok (10 << 3) is 80
ok (10 >> 3) is 1
ok (10 >>> 3) is 1
num = 10; ok (num <<= 3) is 80
num = 10; ok (num >>= 3) is 1
num = 10; ok (num >>>= 3) is 1
num = 10; ok (num &= 3) is 2
num = 10; ok (num ^= 3) is 9
num = 10; ok (num |= 3) is 11