Skip to content

Commit

Permalink
allow for loop to use postfix and compound infix operators for assign…
Browse files Browse the repository at this point in the history
…ments
  • Loading branch information
kaidesu committed Oct 28, 2023
1 parent 40b2e61 commit 64fa3ac
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 17 deletions.
21 changes: 5 additions & 16 deletions examples/scratch.ghost
Original file line number Diff line number Diff line change
@@ -1,17 +1,6 @@
data = {
name: 'Test',
handler: function(n) {
print('n * n')
x = 0
list = [0, 1, 2, 3]

return n * n
}
}

print(data.name)
print(data.handler(6))

function test1() {
print('test1')
}

test1()
for (i = 0; i < list.length(); i++) {
print(i)
}
38 changes: 37 additions & 1 deletion parser/for.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func (parser *Parser) forExpression() ast.ExpressionNode {
parser.readToken()
parser.readToken()

expression.Increment = parser.assign()
expression.Increment = parser.forIncrement()

if expression.Increment == nil {
return nil
Expand Down Expand Up @@ -107,3 +107,39 @@ func (parser *Parser) forInExpression(parent *ast.For) ast.ExpressionNode {

return expression
}

// forIncrement parses the increment expression of a for loop.
// It can be an assignment (x = x + 1), a postfix expression (x++), or an infix expression (x += 1).
func (parser *Parser) forIncrement() ast.ExpressionNode {
if parser.currentTokenIs(token.RIGHTPAREN) {
return nil
}

if parser.currentTokenIs(token.SEMICOLON) {
parser.readToken()
return nil
}

if parser.currentTokenIs(token.IDENTIFIER) && parser.nextTokenIs(token.EQUAL) {
return parser.assign()
}

if parser.currentTokenIs(token.IDENTIFIER) && (parser.nextTokenIs(token.PLUSEQUAL) ||
parser.nextTokenIs(token.MINUSEQUAL) ||
parser.nextTokenIs(token.SLASHEQUAL) ||
parser.nextTokenIs(token.STAREQUAL)) {
identifier := parser.identifierLiteral()

parser.readToken()

return parser.compoundExpression(identifier)
}

if parser.currentTokenIs(token.IDENTIFIER) && (parser.nextTokenIs(token.PLUSPLUS) || parser.nextTokenIs(token.MINUSMINUS)) {
parser.readToken()

return parser.postfixExpression()
}

return nil
}

0 comments on commit 64fa3ac

Please sign in to comment.