about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/ir/translators/translator.py111
-rwxr-xr-xsetup.py1
2 files changed, 112 insertions, 0 deletions
diff --git a/miasm2/ir/translators/translator.py b/miasm2/ir/translators/translator.py
new file mode 100644
index 00000000..2a971130
--- /dev/null
+++ b/miasm2/ir/translators/translator.py
@@ -0,0 +1,111 @@
+import miasm2.expression.expression as m2_expr
+
+
+class Translator(object):
+    "Abstract parent class for translators."
+
+    # Registered translators
+    available_translators = []
+    # Implemented language
+    __LANG__ = ""
+
+    @classmethod
+    def register(cls, translator):
+        """Register a translator
+        @translator: Translator sub-class
+        """
+        cls.available_translators.append(translator)
+
+    @classmethod
+    def to_language(cls, target_lang):
+        """Return the corresponding translator
+        @target_lang: str (case insensitive) wanted language
+        Raise a NotImplementedError in case of unmatched language
+        """
+        target_lang = target_lang.lower()
+        for translator in cls.available_translators:
+            if translator.__LANG__.lower() == target_lang:
+                return translator
+
+        raise NotImplementedError("Unknown target language: %s" % target_lang)
+
+    @classmethod
+    def available_languages(cls):
+        "Return the list of registered languages"
+        return [translator.__LANG__ for translator in cls.available_translators]
+
+    @classmethod
+    def from_ExprInt(cls, expr):
+        """Translate an ExprInt
+        @expr: ExprInt to translate
+        """
+        raise NotImplementedError("Abstract method")
+
+    @classmethod
+    def from_ExprId(cls, expr):
+        """Translate an ExprId
+        @expr: ExprId to translate
+        """
+        raise NotImplementedError("Abstract method")
+
+    @classmethod
+    def from_ExprCompose(cls, expr):
+        """Translate an ExprCompose
+        @expr: ExprCompose to translate
+        """
+        raise NotImplementedError("Abstract method")
+
+    @classmethod
+    def from_ExprSlice(cls, expr):
+        """Translate an ExprSlice
+        @expr: ExprSlice to translate
+        """
+        raise NotImplementedError("Abstract method")
+
+    @classmethod
+    def from_ExprOp(cls, expr):
+        """Translate an ExprOp
+        @expr: ExprOp to translate
+        """
+        raise NotImplementedError("Abstract method")
+
+    @classmethod
+    def from_ExprMem(cls, expr):
+        """Translate an ExprMem
+        @expr: ExprMem to translate
+        """
+        raise NotImplementedError("Abstract method")
+
+    @classmethod
+    def from_ExprAff(cls, expr):
+        """Translate an ExprAff
+        @expr: ExprAff to translate
+        """
+        raise NotImplementedError("Abstract method")
+
+    @classmethod
+    def from_ExprCond(cls, expr):
+        """Translate an ExprCond
+        @expr: ExprCond to translate
+        """
+        raise NotImplementedError("Abstract method")
+
+    @classmethod
+    def from_expr(cls, expr):
+        """Translate an expression according to its type
+        @expr: expression to translate
+        """
+        handlers = {m2_expr.ExprInt: cls.from_ExprInt,
+                    m2_expr.ExprId: cls.from_ExprId,
+                    m2_expr.ExprCompose: cls.from_ExprCompose,
+                    m2_expr.ExprSlice: cls.from_ExprSlice,
+                    m2_expr.ExprOp: cls.from_ExprOp,
+                    m2_expr.ExprMem: cls.from_ExprMem,
+                    m2_expr.ExprAff: cls.from_ExprAff,
+                    m2_expr.ExprCond: cls.from_ExprCond
+                    }
+        for target, handler in handlers.iteritems():
+            if isinstance(expr, target):
+                return handler(expr)
+        raise ValueError("Unhandled type for %s" % expr)
+
diff --git a/setup.py b/setup.py
index de1667e9..3d5fedac 100755
--- a/setup.py
+++ b/setup.py
@@ -16,6 +16,7 @@ def buil_all():
               'miasm2/core',
               'miasm2/expression',
               'miasm2/ir',
+              'miasm2/ir/translators',
               'miasm2/analysis',
               'miasm2/os_dep',
               'miasm2/jitter',