blob: fa436704a97cbb27b20453c3d4ee2385659abb31 [file] [log] [blame] [edit]
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright 2019, Data61, CSIRO (ABN 41 687 119 230)
#
# SPDX-License-Identifier: BSD-2-Clause
#
#
from __future__ import absolute_import, division, print_function, \
unicode_literals
from camkes.internal.seven import cmp, filter, map, zip
from camkes.ast import LiftedAST
import abc, collections, six
class Parser(six.with_metaclass(abc.ABCMeta, object)):
@abc.abstractmethod
def parse_file(self, filename):
raise NotImplementedError
@abc.abstractmethod
def parse_string(self, content):
raise NotImplementedError
class Transformer(six.with_metaclass(abc.ABCMeta, Parser)):
def __init__(self, subordinate_parser):
assert isinstance(subordinate_parser, Parser)
super(Transformer, self).__init__()
self.subordinate = subordinate_parser
def parse_file(self, filename):
assert isinstance(filename, six.string_types)
ast_lifted, read = self.subordinate.parse_file(filename)
assert self.precondition(ast_lifted, read)
result, result_read = self.transform(ast_lifted, read)
assert self.postcondition(result, result_read)
return result, result_read
def parse_string(self, string):
assert isinstance(string, six.string_types)
ast_lifted, read = self.subordinate.parse_string(string)
assert self.precondition(ast_lifted, read)
result, result_read = self.transform(ast_lifted, read)
assert self.postcondition(result, result_read)
return result, result_read
@abc.abstractmethod
def precondition(self, ast_lifted, read):
assert isinstance(ast_lifted, LiftedAST)
assert isinstance(read, collections.Iterable)
raise NotImplementedError
@abc.abstractmethod
def postcondition(self, ast_lifted, read):
assert isinstance(ast_lifted, LiftedAST)
assert isinstance(read, collections.Iterable)
raise NotImplementedError
@abc.abstractmethod
def transform(self, ast_lifted, read):
assert isinstance(ast_lifted, LiftedAST)
assert isinstance(read, collections.Iterable)
raise NotImplementedError