summaryrefslogtreecommitdiff
path: root/arch/armv7/thumb2_disasm/arm_pcode_parser/README.md
blob: 7dcc5d157d336be90adfd65ecf7844d7ccde97e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# goal
translate the pseudocode for arm instructions (given in the docs) to target languages

once the pcode is extracted, automatic generation of ultra-accurate disassemblers should become possible

# how
~~use Grako parser generator, describe the language (pcode.ebnf) and write code generator (codegen.py)~~
use Tatsu parser generator, describe the language (pcode.ebnf) and write code generator (codegen.py):

```
python3 -m tatsu --name pcode pcode.ebnf -o parse.py
```

# example
input statement:
```
if n == 15 || BitCount(registers) < 2 || (P == '1' && M == '1') then UNPREDICTABLE
```

output parse tree:
```
[
  "if",
  [
    "n",
    [],
    [
      "==",
      [
        "15",
        []
      ],
      "||",
      [
        "BitCount(",
        [
          "registers",
          []
        ],
        ")"
      ],
      "<",
      [
        "2",
        []
      ],
      "||",
      [
        "(",
        "P",
        [],
        [
          "==",
          [
            "'1'",
            []
          ],
          "&&",
          [
            "M",
            []
          ],
          "==",
          [
            "'1'",
            []
          ]
        ],
        [],
        ")"
      ]
    ]
  ],
  "then",
  "UNPREDICTABLE"
]
```