"""
Parser for GNU PCB files.
"""
import re
import pcb_types
class ParseError(Exception):
def __init__(self, msg: str, pos: str):
super().__init__(self, msg, pos)
self.msg = msg
self.pos = pos
def __repr__(self) -> str:
return f'ParseError({repr(self.msg):s}, {repr(self.pos):s})'
def __str__(self) -> str:
return f'ParseError: {self.msg:s} at {self.pos:s}'
class StringBuffer:
"""
Store a string, an index and provide some operations.
"""
def __init__(self, string: str):
self._string = string
self._index = 0
self._stack = []
def __enter__(self):
self.enter()
return self
def __exit__(self, exc_type, _exc_value, _traceback):
if exc_type is None:
self.complete()
else:
self.backtrack()
def advance(self, length: int):
"""
Advance the index by length.
"""
self._index = min(len(self._string), self._index + length)
def backtrack(self):
"""
Track back from parsing something.