about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--example/expression/expr_translate.py25
-rw-r--r--miasm2/ir/translators/__init__.py1
-rw-r--r--miasm2/ir/translators/miasm.py51
3 files changed, 65 insertions, 12 deletions
diff --git a/example/expression/expr_translate.py b/example/expression/expr_translate.py
index 17663cd2..aacb30c0 100644
--- a/example/expression/expr_translate.py
+++ b/example/expression/expr_translate.py
@@ -1,6 +1,6 @@
 import random
 
-from miasm2.expression.expression import ExprId
+from miasm2.expression.expression import *
 from miasm2.expression.expression_helper import ExprRandom
 from miasm2.ir.translators import Translator
 
@@ -15,17 +15,14 @@ class ExprRandom_OpSubRange(ExprRandom):
 print "[+] Compute a random expression:"
 expr = ExprRandom_OpSubRange.get(depth=8)
 print "-> %s" % expr
-print ""
+print
 
-print "[+] Translate in Python:"
-exprPython = Translator.to_language("Python").from_expr(expr)
-print exprPython
-print ""
-
-print "[+] Translate in C:"
-exprC = Translator.to_language("C").from_expr(expr)
-print exprC
-print ""
+target_exprs = {lang:Translator.to_language(lang).from_expr(expr)
+                for lang in Translator.available_languages()}
+for target_lang, target_expr in target_exprs.iteritems():
+    print "[+] Translate in %s:" % target_lang
+    print target_expr
+    print
 
 print "[+] Eval in Python:"
 def memory(addr, size):
@@ -39,4 +36,8 @@ for expr_id in expr.get_r(mem_read=True):
         print "Declare var: %s = 0x%x" % (expr_id.name, value)
         globals()[expr_id.name] = value
 
-print "-> 0x%x" % eval(exprPython)
+print "-> 0x%x" % eval(target_exprs["Python"])
+
+print "[+] Validate the Miasm syntax rebuilding"
+exprRebuild = eval(target_exprs["Miasm"])
+assert(expr == exprRebuild)
diff --git a/miasm2/ir/translators/__init__.py b/miasm2/ir/translators/__init__.py
index 0d768b57..443ba463 100644
--- a/miasm2/ir/translators/__init__.py
+++ b/miasm2/ir/translators/__init__.py
@@ -1,5 +1,6 @@
 """IR Translators"""
 from miasm2.ir.translators.C import *
 from miasm2.ir.translators.python import *
+from miasm2.ir.translators.miasm import *
 
 __all__ = ["Translator"]
diff --git a/miasm2/ir/translators/miasm.py b/miasm2/ir/translators/miasm.py
new file mode 100644
index 00000000..8f61fa96
--- /dev/null
+++ b/miasm2/ir/translators/miasm.py
@@ -0,0 +1,51 @@
+from miasm2.ir.translators.translator import Translator
+
+
+class TranslatorMiasm(Translator):
+    "Translate a Miasm expression to its Python building form"
+
+    __LANG__ = "Miasm"
+
+    @classmethod
+    def from_ExprId(cls, expr):
+        return "ExprId(%s, size=%d)" % (repr(expr.name), expr.size)
+
+    @classmethod
+    def from_ExprInt(cls, expr):
+        return "ExprInt_fromsize(%d, 0x%x)" % (expr.size, int(expr.arg))
+
+    @classmethod
+    def from_ExprCond(cls, expr):
+        return "ExprCond(%s, %s, %s)" % (cls.from_expr(expr.cond),
+                                         cls.from_expr(expr.src1),
+                                         cls.from_expr(expr.src2))
+
+    @classmethod
+    def from_ExprSlice(cls, expr):
+        return "ExprSlice(%s, %d, %d)" % (cls.from_expr(expr.arg),
+                                          expr.start,
+                                          expr.stop)
+
+    @classmethod
+    def from_ExprOp(cls, expr):
+        return "ExprOp(%s, %s)" % (repr(expr.op),
+                                   ", ".join(map(cls.from_expr, expr.args)))
+
+    @classmethod
+    def from_ExprCompose(cls, expr):
+        args = ["(%s, %d, %d)" % (cls.from_expr(arg), start, stop)
+                for arg, start, stop in expr.args]
+        return "ExprCompose([%s])" % ", ".join(args)
+
+    @classmethod
+    def from_ExprAff(cls, expr):
+        return "ExprAff(%s, %s)" % (cls.from_expr(expr.dst),
+                                    cls.from_expr(expr.src))
+
+    @classmethod
+    def from_ExprMem(cls, expr):
+        return "ExprMem(%s, size=%d)" % (cls.from_expr(expr.arg), expr.size)
+
+
+# Register the class
+Translator.register(TranslatorMiasm)