diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2017-06-08 09:03:43 +0200 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2017-06-14 09:57:12 +0200 |
| commit | 8e8e6e472bec908eb9cc63cb3a8c042ba5b93279 (patch) | |
| tree | 648689e0c8a2658d8a57b698bd1d1f6ed5dd39ee /miasm2/expression/parser.py | |
| parent | 97e997810abbcaef5672893941e8f4d8a13f8946 (diff) | |
| download | miasm-8e8e6e472bec908eb9cc63cb3a8c042ba5b93279.tar.gz miasm-8e8e6e472bec908eb9cc63cb3a8c042ba5b93279.zip | |
Expression: add an Expression parser
Diffstat (limited to 'miasm2/expression/parser.py')
| -rw-r--r-- | miasm2/expression/parser.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/miasm2/expression/parser.py b/miasm2/expression/parser.py new file mode 100644 index 00000000..b3f3af1c --- /dev/null +++ b/miasm2/expression/parser.py @@ -0,0 +1,70 @@ +import pyparsing +from miasm2.expression.expression import ExprInt, ExprId, ExprSlice, ExprMem, \ + ExprCond, ExprCompose, ExprOp, ExprAff + +integer = pyparsing.Word(pyparsing.nums).setParseAction(lambda t: + int(t[0])) +hex_word = pyparsing.Literal('0x') + pyparsing.Word(pyparsing.hexnums) +hex_int = pyparsing.Combine(hex_word).setParseAction(lambda t: + int(t[0], 16)) + +str_int_pos = (hex_int | integer) +str_int_neg = (pyparsing.Suppress('-') + \ + (hex_int | integer)).setParseAction(lambda t: -t[0]) + +str_int = str_int_pos | str_int_neg + +STR_EXPRINT = pyparsing.Suppress("ExprInt") +STR_EXPRID = pyparsing.Suppress("ExprId") +STR_EXPRSLICE = pyparsing.Suppress("ExprSlice") +STR_EXPRMEM = pyparsing.Suppress("ExprMem") +STR_EXPRCOND = pyparsing.Suppress("ExprCond") +STR_EXPRCOMPOSE = pyparsing.Suppress("ExprCompose") +STR_EXPROP = pyparsing.Suppress("ExprOp") +STR_EXPRAFF = pyparsing.Suppress("ExprAff") + +STR_COMMA = pyparsing.Suppress(",") +LPARENTHESIS = pyparsing.Suppress("(") +RPARENTHESIS = pyparsing.Suppress(")") + + +string_quote = pyparsing.QuotedString(quoteChar="'", escChar='\\', escQuote='\\') +string_dquote = pyparsing.QuotedString(quoteChar='"', escChar='\\', escQuote='\\') + + +string = string_quote | string_dquote + +expr = pyparsing.Forward() + +expr_int = pyparsing.Group(STR_EXPRINT + LPARENTHESIS + str_int + STR_COMMA + str_int + RPARENTHESIS) +expr_id = pyparsing.Group(STR_EXPRID + LPARENTHESIS + string + STR_COMMA + str_int + RPARENTHESIS) +expr_slice = pyparsing.Group(STR_EXPRSLICE + LPARENTHESIS + expr + STR_COMMA + str_int + STR_COMMA + str_int + RPARENTHESIS) +expr_mem = pyparsing.Group(STR_EXPRMEM + LPARENTHESIS + expr + STR_COMMA + str_int + RPARENTHESIS) +expr_cond = pyparsing.Group(STR_EXPRCOND + LPARENTHESIS + expr + STR_COMMA + expr + STR_COMMA + expr + RPARENTHESIS) +expr_compose = pyparsing.Group(STR_EXPRCOMPOSE + LPARENTHESIS + pyparsing.delimitedList(expr, delim=',') + RPARENTHESIS) +expr_op = pyparsing.Group(STR_EXPROP + LPARENTHESIS + string + STR_COMMA + pyparsing.delimitedList(expr, delim=',') + RPARENTHESIS) +expr_aff = pyparsing.Group(STR_EXPRAFF + LPARENTHESIS + expr + STR_COMMA + expr + RPARENTHESIS) + +expr << (expr_int | expr_id | expr_slice | expr_mem | expr_cond | \ + expr_compose | expr_op | expr_aff) + +expr_int.setParseAction(lambda t: ExprInt(*t[0])) +expr_id.setParseAction(lambda t: ExprId(*t[0])) +expr_slice.setParseAction(lambda t: ExprSlice(*t[0])) +expr_mem.setParseAction(lambda t: ExprMem(*t[0])) +expr_cond.setParseAction(lambda t: ExprCond(*t[0])) +expr_compose.setParseAction(lambda t: ExprCompose(*t[0])) +expr_op.setParseAction(lambda t: ExprOp(*t[0])) +expr_aff.setParseAction(lambda t: ExprAff(*t[0])) + + +def str_to_expr(str_in): + """Parse the @str_in and return the corresponoding Expression + @str_in: repr string of an Expression""" + + try: + value = expr.parseString(str_in) + except: + raise RuntimeError("Cannot parse expression %s" % str_in) + assert len(value) == 1 + return value[0] |