|
11 | 11 | from typing_extensions import override |
12 | 12 |
|
13 | 13 | from . import _token |
| 14 | +from ._exceptions import FormulaSyntaxError |
14 | 15 | from ._peekable import Peekable |
15 | 16 |
|
16 | 17 |
|
@@ -74,53 +75,58 @@ def __next__(self) -> _token.Token: # pylint: disable=too-many-branches |
74 | 75 | _ = next(self._iter) # consume '#' |
75 | 76 | comp_id = self._read_integer() |
76 | 77 | if not comp_id: |
77 | | - raise ValueError(f"Expected integer after '#' at position {pos}") |
78 | | - end_pos = pos + len(comp_id) |
| 78 | + raise FormulaSyntaxError( |
| 79 | + formula=self._formula, |
| 80 | + span=(pos + 1, pos + 2), |
| 81 | + message="Expected integer after '#'", |
| 82 | + ) |
| 83 | + end_pos = pos + len(comp_id) + 1 # account for '#' |
79 | 84 | return _token.Component( |
80 | | - span=( |
81 | | - pos + 1, |
82 | | - end_pos + 1, # account for '#' |
83 | | - ), |
| 85 | + span=(pos, end_pos), |
84 | 86 | id=comp_id, |
85 | 87 | value=self._formula[pos:end_pos], |
86 | 88 | ) |
87 | 89 |
|
88 | 90 | if char == "+": |
89 | 91 | _, char = next(self._iter) # consume operator |
90 | | - return _token.Plus(span=(pos + 1, pos + 1), value=char) |
| 92 | + return _token.Plus(span=(pos, pos + 1), value=char) |
91 | 93 |
|
92 | 94 | if char == "-": |
93 | 95 | _, char = next(self._iter) |
94 | | - return _token.Minus(span=(pos + 1, pos + 1), value=char) |
| 96 | + return _token.Minus(span=(pos, pos + 1), value=char) |
95 | 97 |
|
96 | 98 | if char == "*": |
97 | 99 | _, char = next(self._iter) |
98 | | - return _token.Mul(span=(pos + 1, pos + 1), value=char) |
| 100 | + return _token.Mul(span=(pos, pos + 1), value=char) |
99 | 101 |
|
100 | 102 | if char == "/": |
101 | 103 | _, char = next(self._iter) |
102 | | - return _token.Div(span=(pos + 1, pos + 1), value=char) |
| 104 | + return _token.Div(span=(pos, pos + 1), value=char) |
103 | 105 |
|
104 | 106 | if char == "(": |
105 | 107 | _, char = next(self._iter) |
106 | | - return _token.OpenParen(span=(pos + 1, pos + 1), value=char) |
| 108 | + return _token.OpenParen(span=(pos, pos + 1), value=char) |
107 | 109 |
|
108 | 110 | if char == ")": |
109 | 111 | _, char = next(self._iter) |
110 | | - return _token.CloseParen(span=(pos + 1, pos + 1), value=char) |
| 112 | + return _token.CloseParen(span=(pos, pos + 1), value=char) |
111 | 113 |
|
112 | 114 | if char == ",": |
113 | 115 | _, char = next(self._iter) |
114 | | - return _token.Comma(span=(pos + 1, pos + 1), value=char) |
| 116 | + return _token.Comma(span=(pos, pos + 1), value=char) |
115 | 117 |
|
116 | 118 | if char.isdigit(): |
117 | 119 | num = self._read_number() |
118 | 120 | end_pos = pos + len(num) |
119 | | - return _token.Number(span=(pos + 1, end_pos), value=num) |
| 121 | + return _token.Number(span=(pos, end_pos), value=num) |
120 | 122 |
|
121 | 123 | if char.isalpha(): |
122 | 124 | symbol = self._read_symbol() |
123 | 125 | end_pos = pos + len(symbol) |
124 | | - return _token.Symbol(span=(pos + 1, end_pos), value=symbol) |
| 126 | + return _token.Symbol(span=(pos, end_pos), value=symbol) |
125 | 127 |
|
126 | | - raise ValueError(f"Unexpected character '{char}' at position {pos}") |
| 128 | + raise FormulaSyntaxError( |
| 129 | + formula=self._formula, |
| 130 | + span=(pos, pos + 1), |
| 131 | + message="Unexpected character", |
| 132 | + ) |
0 commit comments