-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathgrammar.js
More file actions
100 lines (86 loc) · 3.22 KB
/
Copy pathgrammar.js
File metadata and controls
100 lines (86 loc) · 3.22 KB
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// Copyright (C) 2023 Colin Kennedy
// This file is part of tree-sitter-disassembly <https://github.com/ColinKennedy/tree-sitter-disassembly>.
//
// tree-sitter-disassembly is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// tree-sitter-disassembly is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with tree-sitter-disassembly, see <http://www.gnu.org/licenses/>.
module.exports = grammar(
{
name: "disassembly",
externals: $ => [
$.code_identifier,
$.instruction,
$.memory_dump,
$._error_sentinel,
],
extras: $ => [
$.comment,
/[\s\f\uFEFF\u2060\u200B]|\\\r?\n/
],
rules: {
source: $ => repeat($.source_location),
source_location: $ => seq(
alias($.hexadecimal, $.address),
optional(":"),
choice(
$._line_with_full_data,
$._line_with_missing_data,
),
$._new_line,
),
code_location: $ => seq(
"<",
alias($.code_identifier, $.identifier),
optional(seq("+", choice($.hexadecimal, $.integer))),
">",
),
machine_code_bytes: $ => repeat1($.byte),
integer: _ => /[0-9]+/,
hexadecimal: _ => /(0[xh])?[0-9a-fA-F]+/,
byte: _ => /[0-9a-fA-F]{8}|[0-9a-fA-F]{4}|[0-9a-fA-F]{2}/,
_line_with_full_data: $ => seq(
choice($.code_location, $.machine_code_bytes),
choice($.memory_dump, $.bad_instruction, $.instruction),
optional(alias($._annotated_comment, $.comment))
),
_line_with_missing_data: $ => choice($.bad_instruction, $.instruction),
bad_instruction: _ => "(bad)",
_new_line: _ => "\n",
_annotated_comment: $ => choice(
seq(
choice("#", ";"),
repeat(
choice(
$.hexadecimal,
$.integer,
$.code_location,
$._word,
$._arm_address_comment,
)
),
),
),
_arm_address_comment: $ => seq(
"(",
optional(seq(alias(/[^\d,][^,]+/, $.instruction), ",")),
$.hexadecimal,
$.code_location,
")"
),
comment: _ => seq(choice("#", ";"), /.*/), // Tree-sitter unittest comment
_word: _ => /[a-zA-Z0-9\.]+/,
}
}
)
function space_separated1(rule) {
return seq(rule, repeat(seq(" ", rule)));
}