postfix/prefix operators handled correctly
This commit is contained in:
64
parse.cm
64
parse.cm
@@ -499,6 +499,9 @@ var parse = function(tokens, src, filename, tokenizer) {
|
||||
var index = null
|
||||
var arg = null
|
||||
var args_list = null
|
||||
var one_node = null
|
||||
var binop_node = null
|
||||
var op = null
|
||||
if (node == null) return null
|
||||
while (true) {
|
||||
start = tok
|
||||
@@ -574,6 +577,10 @@ var parse = function(tokens, src, filename, tokenizer) {
|
||||
var node = null
|
||||
var expr = null
|
||||
var k = tok.kind
|
||||
var operand = null
|
||||
var one_node = null
|
||||
var binop_node = null
|
||||
var op = null
|
||||
if (k == "!") {
|
||||
advance()
|
||||
node = ast_node("!", start)
|
||||
@@ -602,19 +609,22 @@ var parse = function(tokens, src, filename, tokenizer) {
|
||||
ast_node_end(node)
|
||||
return node
|
||||
}
|
||||
if (k == "++") {
|
||||
if (k == "++" || k == "--") {
|
||||
advance()
|
||||
node = ast_node("++", start)
|
||||
node.expression = parse_unary()
|
||||
node.postfix = false
|
||||
ast_node_end(node)
|
||||
return node
|
||||
}
|
||||
if (k == "--") {
|
||||
advance()
|
||||
node = ast_node("--", start)
|
||||
node.expression = parse_unary()
|
||||
node.postfix = false
|
||||
operand = parse_unary()
|
||||
one_node = ast_node("number", start)
|
||||
one_node.number = 1
|
||||
one_node.value = "1"
|
||||
ast_node_end(one_node)
|
||||
op = "+"
|
||||
if (k == "--") op = "-"
|
||||
binop_node = ast_node(op, start)
|
||||
binop_node.left = operand
|
||||
binop_node.right = one_node
|
||||
ast_node_end(binop_node)
|
||||
node = ast_node("assign", start)
|
||||
node.left = operand
|
||||
node.right = binop_node
|
||||
ast_node_end(node)
|
||||
return node
|
||||
}
|
||||
@@ -699,6 +709,13 @@ var parse = function(tokens, src, filename, tokenizer) {
|
||||
"&&=": "&&=", "||=": "||="
|
||||
}
|
||||
|
||||
var compound_binop = {
|
||||
"+=": "+", "-=": "-", "*=": "*", "/=": "/", "%=": "%",
|
||||
"<<=": "<<", ">>=": ">>", ">>>=": ">>>",
|
||||
"&=": "&", "^=": "^", "|=": "|", "**=": "**",
|
||||
"&&=": "&&", "||=": "||"
|
||||
}
|
||||
|
||||
parse_assign = function(unused) {
|
||||
var left_node = parse_ternary()
|
||||
var start = null
|
||||
@@ -707,6 +724,8 @@ var parse = function(tokens, src, filename, tokenizer) {
|
||||
var node = null
|
||||
var left_kind = null
|
||||
var right_kind = null
|
||||
var binop = null
|
||||
var binop_node = null
|
||||
if (left_node == null) return null
|
||||
start = tok
|
||||
kind = assign_ops[tok.kind]
|
||||
@@ -719,12 +738,23 @@ var parse = function(tokens, src, filename, tokenizer) {
|
||||
|
||||
advance()
|
||||
right_node = parse_assign()
|
||||
node = ast_node(kind, start)
|
||||
node.left = left_node
|
||||
node.right = right_node
|
||||
|
||||
if (left_node.kind == "[" && left_node.right == null) node.push = true
|
||||
if (right_node != null && right_node.kind == "[" && right_node.right == null) node.pop = true
|
||||
binop = compound_binop[kind]
|
||||
if (binop != null) {
|
||||
binop_node = ast_node(binop, start)
|
||||
binop_node.left = left_node
|
||||
binop_node.right = right_node
|
||||
ast_node_end(binop_node)
|
||||
node = ast_node("assign", start)
|
||||
node.left = left_node
|
||||
node.right = binop_node
|
||||
} else {
|
||||
node = ast_node(kind, start)
|
||||
node.left = left_node
|
||||
node.right = right_node
|
||||
if (left_node.kind == "[" && left_node.right == null) node.push = true
|
||||
if (right_node != null && right_node.kind == "[" && right_node.right == null) node.pop = true
|
||||
}
|
||||
|
||||
ast_node_end(node)
|
||||
return node
|
||||
|
||||
Reference in New Issue
Block a user