Miasm2
 All Classes Namespaces Files Functions Variables Typedefs Properties Macros
translator.py
Go to the documentation of this file.
1 import miasm2.expression.expression as m2_expr
2 from miasm2.core.utils import BoundedDict
3 
4 
6  "Abstract parent class for translators."
7 
8  # Registered translators
9  available_translators = []
10  # Implemented language
11  __LANG__ = ""
12 
13  @classmethod
14  def register(cls, translator):
15  """Register a translator
16  @translator: Translator sub-class
17  """
18  cls.available_translators.append(translator)
19 
20  @classmethod
21  def to_language(cls, target_lang, *args, **kwargs):
22  """Return the corresponding translator instance
23  @target_lang: str (case insensitive) wanted language
24  Raise a NotImplementedError in case of unmatched language
25  """
26  target_lang = target_lang.lower()
27  for translator in cls.available_translators:
28  if translator.__LANG__.lower() == target_lang:
29  return translator(*args, **kwargs)
30 
31  raise NotImplementedError("Unknown target language: %s" % target_lang)
32 
33  @classmethod
35  "Return the list of registered languages"
36  return [translator.__LANG__ for translator in cls.available_translators]
37 
38  def __init__(self, cache_size=1000):
39  """Instance a translator
40  @cache_size: (optional) Expr cache size
41  """
42  self._cache = BoundedDict(cache_size)
43 
44  def from_ExprInt(self, expr):
45  """Translate an ExprInt
46  @expr: ExprInt to translate
47  """
48  raise NotImplementedError("Abstract method")
49 
50  def from_ExprId(self, expr):
51  """Translate an ExprId
52  @expr: ExprId to translate
53  """
54  raise NotImplementedError("Abstract method")
55 
56  def from_ExprCompose(self, expr):
57  """Translate an ExprCompose
58  @expr: ExprCompose to translate
59  """
60  raise NotImplementedError("Abstract method")
61 
62  def from_ExprSlice(self, expr):
63  """Translate an ExprSlice
64  @expr: ExprSlice to translate
65  """
66  raise NotImplementedError("Abstract method")
67 
68  def from_ExprOp(self, expr):
69  """Translate an ExprOp
70  @expr: ExprOp to translate
71  """
72  raise NotImplementedError("Abstract method")
73 
74  def from_ExprMem(self, expr):
75  """Translate an ExprMem
76  @expr: ExprMem to translate
77  """
78  raise NotImplementedError("Abstract method")
79 
80  def from_ExprAff(self, expr):
81  """Translate an ExprAff
82  @expr: ExprAff to translate
83  """
84  raise NotImplementedError("Abstract method")
85 
86  def from_ExprCond(self, expr):
87  """Translate an ExprCond
88  @expr: ExprCond to translate
89  """
90  raise NotImplementedError("Abstract method")
91 
92  def from_expr(self, expr):
93  """Translate an expression according to its type
94  @expr: expression to translate
95  """
96  # Use cache
97  if expr in self._cache:
98  return self._cache[expr]
99 
100  # Handle Expr type
101  handlers = {m2_expr.ExprInt: self.from_ExprInt,
102  m2_expr.ExprId: self.from_ExprId,
103  m2_expr.ExprCompose: self.from_ExprCompose,
104  m2_expr.ExprSlice: self.from_ExprSlice,
105  m2_expr.ExprOp: self.from_ExprOp,
106  m2_expr.ExprMem: self.from_ExprMem,
107  m2_expr.ExprAff: self.from_ExprAff,
108  m2_expr.ExprCond: self.from_ExprCond
109  }
110  for target, handler in handlers.iteritems():
111  if isinstance(expr, target):
112  ## Compute value and update the internal cache
113  ret = handler(expr)
114  self._cache[expr] = ret
115  return ret
116  raise ValueError("Unhandled type for %s" % expr)
117 
tuple translator
Definition: ir2C.py:15