From 6aa1c0567d298dc14fa4ac51fd430d329f95d920 Mon Sep 17 00:00:00 2001 From: Paulo Henrique Silva Date: Wed, 18 Dec 2013 02:57:11 -0200 Subject: Make gerber package --- gerber.py | 129 ----------------------------------------------------- gerber/__init__.py | 0 gerber/gerber.py | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 129 insertions(+), 129 deletions(-) delete mode 100644 gerber.py create mode 100644 gerber/__init__.py create mode 100644 gerber/gerber.py diff --git a/gerber.py b/gerber.py deleted file mode 100644 index 74da114..0000000 --- a/gerber.py +++ /dev/null @@ -1,129 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import re - -def red(s): - return '\033[1;31m{0}\033[0;m'.format(s) - -class Statement: - pass - -class ParamStmt(Statement): - pass - -class CoordStmt(Statement): - pass - -class ApertureStmt(Statement): - pass - -class CommentStmt(Statement): - def __init__(self, comment): - self.comment = comment - -class EofStmt(Statement): - pass - -class UnexpectedStmt(Statement): - def __init__(self, line): - self.line = line - -class GerberContext: - x = 0 - y = 0 - -class Gerber: - NUMBER = r"[\+-]?\d+" - FUNCTION = r"G\d{2}" - STRING = r"[a-zA-Z0-9_+-/!?<>”’(){}.\|&@# :]+" - - COORD_OP = r"D[0]?[123]" - - PARAM_STMT = re.compile(r"%.*%") - - COORD_STMT = re.compile(( - r"(?P{f})?" - r"(X(?P{number}))?(Y(?P{number}))?" - r"(I(?P{number}))?(J(?P{number}))?" - r"(?P{op})?\*".format(number=NUMBER, f=FUNCTION, op=COORD_OP))) - - APERTURE_STMT = re.compile(r"(G54)?D\d+\*") - - COMMENT_STMT = re.compile(r"G04(?P{string})\*".format(string=STRING)) - - EOF_STMT = re.compile(r"M02\*") - - def __init__(self): - self.apertures = {} - self.ctx = GerberContext() - - def parse(self, filename): - - fp = open(filename, "r") - data = fp.readlines() - - self.tokens = list(self.tokenize(data)) - for token in self.tokens: - if isinstance(token, UnexpectedStmt): - print filename - print red("[UNEXPECTED TOKEN]") - print self.COORD_STMT.pattern - print token.line - - def tokenize(self, data): - multiline = None - - for i, line in enumerate(data): - # remove EOL - if multiline: - line = multiline + line.strip() - else: - line = line.strip() - - # deal with multi-line parameters - if line.startswith("%") and not line.endswith("%"): - multiline = line - continue - else: - multiline = None - - # parameter - match = self.PARAM_STMT.match(line) - if match: - yield ParamStmt() - continue - - # coord - matches = self.COORD_STMT.finditer(line) - if matches: - for match in matches: - yield CoordStmt() - continue - - # aperture selection - match = self.APERTURE_STMT.match(line) - if match: - yield ApertureStmt() - continue - - # comment - match = self.COMMENT_STMT.match(line) - if match: - yield CommentStmt(match.groupdict("comment")) - continue - - # eof - match = self.EOF_STMT.match(line) - if match: - yield EofStmt() - continue - - yield UnexpectedStmt(line) - -if __name__ == "__main__": - import sys - - for f in sys.argv[1:]: - g = Gerber() - g.parse(f) diff --git a/gerber/__init__.py b/gerber/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gerber/gerber.py b/gerber/gerber.py new file mode 100644 index 0000000..74da114 --- /dev/null +++ b/gerber/gerber.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import re + +def red(s): + return '\033[1;31m{0}\033[0;m'.format(s) + +class Statement: + pass + +class ParamStmt(Statement): + pass + +class CoordStmt(Statement): + pass + +class ApertureStmt(Statement): + pass + +class CommentStmt(Statement): + def __init__(self, comment): + self.comment = comment + +class EofStmt(Statement): + pass + +class UnexpectedStmt(Statement): + def __init__(self, line): + self.line = line + +class GerberContext: + x = 0 + y = 0 + +class Gerber: + NUMBER = r"[\+-]?\d+" + FUNCTION = r"G\d{2}" + STRING = r"[a-zA-Z0-9_+-/!?<>”’(){}.\|&@# :]+" + + COORD_OP = r"D[0]?[123]" + + PARAM_STMT = re.compile(r"%.*%") + + COORD_STMT = re.compile(( + r"(?P{f})?" + r"(X(?P{number}))?(Y(?P{number}))?" + r"(I(?P{number}))?(J(?P{number}))?" + r"(?P{op})?\*".format(number=NUMBER, f=FUNCTION, op=COORD_OP))) + + APERTURE_STMT = re.compile(r"(G54)?D\d+\*") + + COMMENT_STMT = re.compile(r"G04(?P{string})\*".format(string=STRING)) + + EOF_STMT = re.compile(r"M02\*") + + def __init__(self): + self.apertures = {} + self.ctx = GerberContext() + + def parse(self, filename): + + fp = open(filename, "r") + data = fp.readlines() + + self.tokens = list(self.tokenize(data)) + for token in self.tokens: + if isinstance(token, UnexpectedStmt): + print filename + print red("[UNEXPECTED TOKEN]") + print self.COORD_STMT.pattern + print token.line + + def tokenize(self, data): + multiline = None + + for i, line in enumerate(data): + # remove EOL + if multiline: + line = multiline + line.strip() + else: + line = line.strip() + + # deal with multi-line parameters + if line.startswith("%") and not line.endswith("%"): + multiline = line + continue + else: + multiline = None + + # parameter + match = self.PARAM_STMT.match(line) + if match: + yield ParamStmt() + continue + + # coord + matches = self.COORD_STMT.finditer(line) + if matches: + for match in matches: + yield CoordStmt() + continue + + # aperture selection + match = self.APERTURE_STMT.match(line) + if match: + yield ApertureStmt() + continue + + # comment + match = self.COMMENT_STMT.match(line) + if match: + yield CommentStmt(match.groupdict("comment")) + continue + + # eof + match = self.EOF_STMT.match(line) + if match: + yield EofStmt() + continue + + yield UnexpectedStmt(line) + +if __name__ == "__main__": + import sys + + for f in sys.argv[1:]: + g = Gerber() + g.parse(f) -- cgit