postfix/prefix operators handled correctly

This commit is contained in:
2026-02-10 08:12:27 -06:00
parent 96f8157039
commit ad863fb89b
4 changed files with 238 additions and 17 deletions

View File

@@ -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