In the parser, I think it would be better if you added a precedence to the parser generator, which would look something like this:
self.pg = ParserGenerator(
['NUMBER', 'PRINT', 'OPEN_PAREN', 'CLOSE_PAREN',
'SEMI_COLON', 'SUM', 'SUB'],
precedence=[
('left', ['PLUS', 'MINUS']) ]
)