| 166 | |
| 167 | |
| 168 | class Parser: |
| 169 | def __init__(self, parser: Parser = None) -> None: |
| 170 | if parser is not None: |
| 171 | self.source = parser.source |
| 172 | self.lineno = parser.lineno |
| 173 | self.tokens = list(parser.tokens) |
| 174 | self.tokens_idx = parser.tokens_idx |
| 175 | self.lines = list(parser.lines) |
| 176 | self.lines_idx = parser.lines_idx |
| 177 | else: |
| 178 | self.source = '' |
| 179 | self.lineno = 1 |
| 180 | self.tokens = [] |
| 181 | self.tokens_idx = 0 |
| 182 | self.lines = [] |
| 183 | self.lines_idx = 0 |
| 184 | |
| 185 | def parse(self, source: str = '') -> Node: |
| 186 | if source != '': |
| 187 | self.source = source |
| 188 | self.lines = open(source, 'r').readlines() |
| 189 | self.skip_blank_lines() |
| 190 | |
| 191 | self.tokens = tokenize(self.curr_line()) |
| 192 | return self.program_statement() |
| 193 | |
| 194 | def no_more_lines(self, check_next_lines: bool = False) -> bool: |
| 195 | return self.lines_idx + ( |
| 196 | 1 if check_next_lines else 0) >= len(self.lines) |
| 197 | |
| 198 | def curr_line(self) -> str: |
| 199 | return self.lines[self.lines_idx] |
| 200 | |
| 201 | def skip_blank_lines(self) -> None: |
| 202 | while self.curr_line().lstrip('\t ') == '\n' or self.curr_line().lstrip('\t ').startswith('#'): |
| 203 | self.next_line() |
| 204 | |
| 205 | def next_line(self) -> str: |
| 206 | self.lineno += 1 |
| 207 | self.lines_idx += 1 |
| 208 | |
| 209 | if self.no_more_lines(): |
| 210 | print_error('next_line', 'No more lines in list', self) |
| 211 | self.skip_blank_lines() |
| 212 | |
| 213 | self.tokens_idx = 0 |
| 214 | self.tokens = tokenize(self.curr_line()) |
| 215 | return self.curr_line() |
| 216 | |
| 217 | def no_more_tokens(self) -> bool: |
| 218 | return self.tokens_idx >= len(self.tokens) |
| 219 | |
| 220 | def lookahead_token(self) -> Token: |
| 221 | return self.tokens[self.tokens_idx + 1] |
| 222 | |
| 223 | def curr_token(self) -> Optional[Token]: |
| 224 | if self.no_more_tokens(): |
| 225 | self.next_line() |
no outgoing calls
no test coverage detected