Skip to content

Commit 530e270

Browse files
committed
Parse negative numbers as values, not as unary expressions containg a literal (fixes #421)
1 parent cda38ec commit 530e270

File tree

6 files changed

+497
-490
lines changed

6 files changed

+497
-490
lines changed

Tests/TestCases/SmartVariables.yarn

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ title: Start
1414
PieMaker: You can't afford one!
1515
<<endif>>
1616

17+
// Negative numbers are not interpreted as smart variables (issue #421)
18+
<<declare $x = -1>>
19+
<<set $x += 1>>
20+
1721
// Variables are allowed to appear multiple times in a smart variable
1822
<<declare $a = false as bool>>
1923
<<declare $b = false as bool>>

YarnSpinner.Compiler/Grammars/YarnSpinnerLexer.cs

Lines changed: 336 additions & 333 deletions
Large diffs are not rendered by default.

YarnSpinner.Compiler/Grammars/YarnSpinnerLexer.g4

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,12 @@ KEYWORD_TRUE : 'true' ;
230230
KEYWORD_FALSE : 'false' ;
231231
KEYWORD_NULL : 'null' ;
232232

233+
// Integer or decimal numbers.
234+
NUMBER
235+
: ('-')? INT
236+
| ('-')? INT '.' INT
237+
;
238+
233239
OPERATOR_ASSIGNMENT : '=' | 'to' ;
234240

235241
OPERATOR_LOGICAL_LESS_THAN_EQUALS : '<=' | 'lte' ;
@@ -280,12 +286,6 @@ VAR_ID : '$' ID ;
280286
// Dots ('.')
281287
DOT : '.' ;
282288

283-
// Integer or decimal numbers.
284-
NUMBER
285-
: INT
286-
| INT '.' INT
287-
;
288-
289289
// Newlines (only syntactically relevant when inside a 'when' clause).
290290
// We use a newline to indicate that the expression is over, but only
291291
// when we're in a 'when' clause - in all other expressions, newlines are

YarnSpinner.Compiler/Grammars/YarnSpinnerLexer.tokens

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -33,37 +33,37 @@ EXPRESSION_WHEN_ALWAYS=32
3333
KEYWORD_TRUE=33
3434
KEYWORD_FALSE=34
3535
KEYWORD_NULL=35
36-
OPERATOR_ASSIGNMENT=36
37-
OPERATOR_LOGICAL_LESS_THAN_EQUALS=37
38-
OPERATOR_LOGICAL_GREATER_THAN_EQUALS=38
39-
OPERATOR_LOGICAL_EQUALS=39
40-
OPERATOR_LOGICAL_LESS=40
41-
OPERATOR_LOGICAL_GREATER=41
42-
OPERATOR_LOGICAL_NOT_EQUALS=42
43-
OPERATOR_LOGICAL_AND=43
44-
OPERATOR_LOGICAL_OR=44
45-
OPERATOR_LOGICAL_XOR=45
46-
OPERATOR_LOGICAL_NOT=46
47-
OPERATOR_MATHS_ADDITION_EQUALS=47
48-
OPERATOR_MATHS_SUBTRACTION_EQUALS=48
49-
OPERATOR_MATHS_MULTIPLICATION_EQUALS=49
50-
OPERATOR_MATHS_MODULUS_EQUALS=50
51-
OPERATOR_MATHS_DIVISION_EQUALS=51
52-
OPERATOR_MATHS_ADDITION=52
53-
OPERATOR_MATHS_SUBTRACTION=53
54-
OPERATOR_MATHS_MULTIPLICATION=54
55-
OPERATOR_MATHS_DIVISION=55
56-
OPERATOR_MATHS_MODULUS=56
57-
LPAREN=57
58-
RPAREN=58
59-
COMMA=59
60-
EXPRESSION_AS=60
61-
STRING=61
62-
FUNC_ID=62
63-
EXPRESSION_END=63
64-
VAR_ID=64
65-
DOT=65
66-
NUMBER=66
36+
NUMBER=36
37+
OPERATOR_ASSIGNMENT=37
38+
OPERATOR_LOGICAL_LESS_THAN_EQUALS=38
39+
OPERATOR_LOGICAL_GREATER_THAN_EQUALS=39
40+
OPERATOR_LOGICAL_EQUALS=40
41+
OPERATOR_LOGICAL_LESS=41
42+
OPERATOR_LOGICAL_GREATER=42
43+
OPERATOR_LOGICAL_NOT_EQUALS=43
44+
OPERATOR_LOGICAL_AND=44
45+
OPERATOR_LOGICAL_OR=45
46+
OPERATOR_LOGICAL_XOR=46
47+
OPERATOR_LOGICAL_NOT=47
48+
OPERATOR_MATHS_ADDITION_EQUALS=48
49+
OPERATOR_MATHS_SUBTRACTION_EQUALS=49
50+
OPERATOR_MATHS_MULTIPLICATION_EQUALS=50
51+
OPERATOR_MATHS_MODULUS_EQUALS=51
52+
OPERATOR_MATHS_DIVISION_EQUALS=52
53+
OPERATOR_MATHS_ADDITION=53
54+
OPERATOR_MATHS_SUBTRACTION=54
55+
OPERATOR_MATHS_MULTIPLICATION=55
56+
OPERATOR_MATHS_DIVISION=56
57+
OPERATOR_MATHS_MODULUS=57
58+
LPAREN=58
59+
RPAREN=59
60+
COMMA=60
61+
EXPRESSION_AS=61
62+
STRING=62
63+
FUNC_ID=63
64+
EXPRESSION_END=64
65+
VAR_ID=65
66+
DOT=66
6767
COMMAND_NEWLINE=67
6868
COMMAND_WS=68
6969
COMMAND_IF=69
@@ -103,25 +103,25 @@ TYPE_BOOL=93
103103
'true'=33
104104
'false'=34
105105
'null'=35
106-
'+='=47
107-
'-='=48
108-
'*='=49
109-
'%='=50
110-
'/='=51
111-
'+'=52
112-
'-'=53
113-
'*'=54
114-
'/'=55
115-
'%'=56
116-
'('=57
117-
')'=58
118-
','=59
119-
'as'=60
106+
'+='=48
107+
'-='=49
108+
'*='=50
109+
'%='=51
110+
'/='=52
111+
'+'=53
112+
'-'=54
113+
'*'=55
114+
'/'=56
115+
'%'=57
116+
'('=58
117+
')'=59
118+
','=60
119+
'as'=61
120120
'string'=91
121121
'number'=92
122122
'bool'=93
123-
'}'=63
124-
'.'=65
123+
'}'=64
124+
'.'=66
125125
'else'=71
126126
'endif'=73
127127
'return'=78

0 commit comments

Comments
 (0)