diff --git a/gerber/parser.py b/gerber/parser.py
index 4900cb1..67893af 100644
--- a/gerber/parser.py
+++ b/gerber/parser.py
@@ -98,7 +98,10 @@ class ADParamStmt(ParamStmt):
ParamStmt.__init__(self, param)
self.d = d
self.shape = shape
- self.modifiers = [[x for x in m.split("X")] for m in modifiers.split(",")]
+ if modifiers is not None:
+ self.modifiers = [[x for x in m.split("X")] for m in modifiers.split(",")]
+ else:
+ self.modifiers = []
def to_gerber(self):
return '%ADD{0}{1},{2}*%'.format(self.d, self.shape,
@@ -191,7 +194,7 @@ class GerberParser(object):
NUMBER = r"[\+-]?\d+"
DECIMAL = r"[\+-]?\d+([.]?\d+)?"
STRING = r"[a-zA-Z0-9_+\-/!?<>”’(){}.\|&@# :]+"
- NAME = "[a-zA-Z_$][a-zA-Z_$0-9]+"
+ NAME = r"[a-zA-Z_$][a-zA-Z_$0-9]+"
FUNCTION = r"G\d{2}"
COORD_OP = r"D[0]?[123]"
@@ -201,10 +204,10 @@ class GerberParser(object):
IP = r"(?PIP)(?P(POS|NEG))"
LP = r"(?PLP)(?P(D|C))"
AD_CIRCLE = r"(?PAD)D(?P\d+)(?PC)[,](?P[^,]*)"
- AD_RECT = r"(?PAD)D(?P\d+)(?PR)[,](?P[^,]*)"
+ AD_RECT = r"(?PAD)D(?P\d+)(?PR)[,]?(?P[^,]+)?"
AD_OBROUND = r"(?PAD)D(?P\d+)(?PO)[,](?P[^,]*)"
AD_POLY = r"(?PAD)D(?P\d+)(?PP)[,](?P[^,]*)"
- AD_MACRO = r"(?PAD)D(?P\d+)+(?P{name})[,](?P[^,]*)".format(name=NAME)
+ AD_MACRO = r"(?PAD)D(?P\d+)(?P{name})[,]?(?P[^,]+)?".format(name=NAME)
AM = r"(?PAM)(?P{name})\*(?P.*)".format(name=NAME)
# begin deprecated
@@ -213,7 +216,7 @@ class GerberParser(object):
LN = r"(?PLN)(?P.*)"
# end deprecated
- PARAMS = (FS, MO, IP, LP, AD_CIRCLE, AD_RECT, AD_OBROUND, AD_MACRO, AD_POLY, AM, OF, IN, LN)
+ PARAMS = (FS, MO, IP, LP, AD_CIRCLE, AD_RECT, AD_OBROUND, AD_POLY, AD_MACRO, AM, OF, IN, LN)
PARAM_STMT = [re.compile(r"%{0}\*%".format(p)) for p in PARAMS]
COORD_STMT = re.compile((