Skip to content

Commit f28627c

Browse files
committed
Fix assignment operator precedence
1 parent 13656ef commit f28627c

File tree

2 files changed

+14
-8
lines changed

2 files changed

+14
-8
lines changed

src/interpreter/runner.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,17 +185,23 @@ async function runExpression(expression: Expression, context: RunnerContext): Pr
185185
} else if (isUnaryExpression(expression)) {
186186
const { operator, value } = expression;
187187
const actualValue = await runExpression(value, context);
188-
if (operator === '-') {
188+
if (operator === '+') {
189+
if (typeof actualValue === 'number') {
190+
return actualValue;
191+
} else {
192+
throw new AstNodeError(expression, `Cannot apply operator '${operator}' to value of type '${typeof actualValue}'`);
193+
}
194+
} else if (operator === '-') {
189195
if (typeof actualValue === 'number') {
190196
return -actualValue;
191197
} else {
192-
throw new AstNodeError(expression, `Cannot apply operator '${operator}' to values of type '${typeof actualValue}'`);
198+
throw new AstNodeError(expression, `Cannot apply operator '${operator}' to value of type '${typeof actualValue}'`);
193199
}
194200
} else if (operator === '!') {
195201
if (typeof actualValue === 'boolean') {
196202
return !actualValue;
197203
} else {
198-
throw new AstNodeError(expression, `Cannot apply operator '${operator}' to values of type '${typeof actualValue}'`);
204+
throw new AstNodeError(expression, `Cannot apply operator '${operator}' to value of type '${typeof actualValue}'`);
199205
}
200206
}
201207
} else if (isNumberExpression(expression)) {

src/language-server/lox.langium

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ VariableDeclaration returns NamedElement:
4242
;
4343

4444
Expression:
45-
Addition;
45+
Assignment;
46+
47+
Assignment infers Expression:
48+
Addition ({infer BinaryExpression.left=current} operator=('=') right=Addition)*;
4649

4750
Addition infers Expression:
4851
Multiplication ({infer BinaryExpression.left=current} operator=('+' | '-') right=Multiplication)*;
@@ -54,10 +57,7 @@ Logical infers Expression:
5457
Comparison ({infer BinaryExpression.left=current} operator=('and' | 'or') right=Comparison)*;
5558

5659
Comparison infers Expression:
57-
Assignment ({infer BinaryExpression.left=current} operator=('<' | '<=' | '>' | '>=' | '==' | '!=') right=Assignment)*;
58-
59-
Assignment infers Expression:
60-
MemberCall ({infer BinaryExpression.left=current} operator=('=') right=MemberCall)*;
60+
MemberCall ({infer BinaryExpression.left=current} operator=('<' | '<=' | '>' | '>=' | '==' | '!=') right=MemberCall)*;
6161

6262
MemberCall infers Expression:
6363
Primary

0 commit comments

Comments
 (0)