1pub use grammar::parse;
2
3#[rust_sitter::grammar("sleigh")]
4#[allow(
5 clippy::declare_interior_mutable_const,
6 clippy::borrow_interior_mutable_const,
7 clippy::large_enum_variant
8)]
9pub mod grammar {
10 use malachite::{num::conversion::traits::FromStringBase, Integer};
11 use regex::Regex;
12 use std::cell::OnceCell;
13 use typed_builder::TypedBuilder;
14
15 trait XmlUnescape {
16 fn xml_unescape(&self) -> String;
23 }
24
25 impl<S> XmlUnescape for S
26 where
27 S: AsRef<str>,
28 {
29 fn xml_unescape(&self) -> String {
30 self.as_ref()
31 .replace("&", "&")
32 .replace("<", "<")
33 .replace(">", ">")
34 .replace(""", "\"")
35 .replace("'", "'")
36 }
37 }
38
39 impl Sleigh {
40 const VERSION_REGEX: OnceCell<Regex> = OnceCell::new();
41 const BIGENDIAN_REGEX: OnceCell<Regex> = OnceCell::new();
42 const ALIGN_REGEX: OnceCell<Regex> = OnceCell::new();
43 const UNIQBASE_REGEX: OnceCell<Regex> = OnceCell::new();
44 const MAXDELAY_REGEX: OnceCell<Regex> = OnceCell::new();
45 const UNIQMASK_REGEX: OnceCell<Regex> = OnceCell::new();
46 const NUMSECTIONS_REGEX: OnceCell<Regex> = OnceCell::new();
47 }
48
49 #[rust_sitter::language]
50 #[derive(TypedBuilder, Debug, PartialEq)]
51 pub struct Sleigh {
54 #[rust_sitter::leaf(pattern = r#"<sleigh"#)]
55 #[builder(default, setter(skip))]
56 _open: (),
57 #[rust_sitter::leaf(
58 pattern = r#"version\s*=\s*"(-?[0-9]+)""#,
59 transform = |v| {
60 Sleigh::VERSION_REGEX
61 .get_or_init(|| {
62 Regex::new(r#"version\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
63 })
64 .captures(v)
65 .expect("No captures or no capture group")
66 .get(1)
67 .expect("No capture group")
68 .as_str()
69 .parse()
70 .expect("Invalid integer")
71 }
72 )]
73 #[builder(setter(transform = |v: impl Into<Integer>| {
74 Some(v.into())
75 }))]
76 version: Option<Integer>,
78 #[rust_sitter::leaf(
79 pattern = r#"bigendian\s*=\s*"([a-z]+)""#,
80 transform = |v| {
81 Sleigh::BIGENDIAN_REGEX
82 .get_or_init(|| {
83 Regex::new(r#"bigendian\s*=\s*"([a-z]+)""#)
84 .expect("Invalid regular expression")
85 })
86 .captures(v)
87 .expect("No captures or no capture group")
88 .get(1)
89 .expect("No capture group")
90 .as_str()
91 .parse()
92 .expect("Invalid boolean")
93 }
94 )]
95 bigendian: bool,
96 #[rust_sitter::leaf(
97 pattern = r#"align\s*=\s*"(-?[0-9]+)""#,
98 transform = |v| {
99 Sleigh::ALIGN_REGEX
100 .get_or_init(|| {
101 Regex::new(r#"align\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
102 })
103 .captures(v)
104 .expect("No captures or no capture group")
105 .get(1)
106 .expect("No capture group")
107 .as_str()
108 .parse()
109 .expect("Invalid integer")
110 }
111 )]
112 #[builder(setter(transform = |v: impl Into<Integer>| {
113 v.into()
114 }))]
115 align: Integer,
116 #[rust_sitter::leaf(
117 pattern = r#"uniqbase\s*=\s*"0x([0-9a-fA-F]+)""#,
118 transform = |v| {
119 Integer::from_string_base(16, Sleigh::UNIQBASE_REGEX
120 .get_or_init(|| {
121 Regex::new(r#"uniqbase\s*=\s*"0x([0-9a-fA-F]+)""#)
122 .expect("Invalid regular expression")
123 })
124 .captures(v)
125 .expect("No captures or no capture group")
126 .get(1)
127 .expect("No capture group")
128 .as_str()).expect("Invalid integer")
129 }
130 )]
131 #[builder(setter(transform = |v: impl Into<Integer>| {
132 v.into()
133 }))]
134 uniqbase: Integer,
135 #[rust_sitter::leaf(
136 pattern = r#"maxdelay\s*=\s*"0x([0-9a-fA-F]+)""#,
137 transform = |v| {
138 Integer::from_string_base(16, Sleigh::MAXDELAY_REGEX
139 .get_or_init(|| {
140 Regex::new(r#"maxdelay\s*=\s*"0x([0-9a-fA-F]+)""#)
141 .expect("Invalid regular expression")
142 })
143 .captures(v)
144 .expect("No captures or no capture group")
145 .get(1)
146 .expect("No capture group")
147 .as_str()).expect("Invalid integer")
148 }
149 )]
150 #[builder(default, setter(transform = |v: impl Into<Integer>| {
151 Some(v.into())
152 }))]
153 maxdelay: Option<Integer>,
155 #[rust_sitter::leaf(
156 pattern = r#"uniqmask\s*=\s*"0x([0-9a-fA-F]+)""#,
157 transform = |v| {
158 Integer::from_string_base(16, Sleigh::UNIQMASK_REGEX
159 .get_or_init(|| {
160 Regex::new(r#"uniqmask\s*=\s*"0x([0-9a-fA-F]+)""#)
161 .expect("Invalid regular expression")
162 })
163 .captures(v)
164 .expect("No captures or no capture group")
165 .get(1)
166 .expect("No capture group")
167 .as_str()).expect("Invalid integer")
168 }
169 )]
170 #[builder(default, setter(transform = |v: impl Into<Integer>| {
171 Some(v.into())
172 }))]
173 uniqmask: Option<Integer>,
175 #[rust_sitter::leaf(
176 pattern = r#"numsections\s*=\s*"0x([0-9a-fA-F]+)""#,
177 transform = |v| {
178 Sleigh::NUMSECTIONS_REGEX
179 .get_or_init(|| {
180 Regex::new(r#"numsections\s*=\s*"([0-9]+)""#).expect("Invalid regular expression")
181 })
182 .captures(v)
183 .expect("No captures or no capture group")
184 .get(1)
185 .expect("No capture group")
186 .as_str()
187 .parse()
188 .expect("Invalid integer")
189 }
190 )]
191 #[builder(default, setter(transform = |v: impl Into<Integer>| {
192 Some(v.into())
193 }))]
194 numsections: Option<Integer>,
195 #[rust_sitter::leaf(pattern = r#">"#)]
196 #[builder(default, setter(skip))]
197 _close: (),
198 sourcefiles: SourceFiles,
199 spaces: Spaces,
200 symbol_table: SymbolTable,
201 #[rust_sitter::leaf(pattern = r#"<\s*/\s*sleigh\s*>"#)]
202 #[builder(default, setter(skip))]
203 _end: (),
204 }
205
206 #[derive(TypedBuilder, Debug, PartialEq)]
207 pub struct SourceFiles {
208 #[rust_sitter::leaf(pattern = r#"<\s*sourcefiles\s*>"#)]
209 #[builder(default, setter(skip))]
210 _start: (),
211 #[builder(default)]
212 source_files: Vec<SourceFile>,
213 #[rust_sitter::leaf(pattern = r#"<\s*/\s*sourcefiles\s*>"#)]
214 #[builder(default, setter(skip))]
215 _end: (),
216 }
217
218 impl SourceFile {
219 const NAME_REGEX: OnceCell<Regex> = OnceCell::new();
220 const INDEX_REGEX: OnceCell<Regex> = OnceCell::new();
221 }
222
223 #[derive(TypedBuilder, Debug, PartialEq)]
224 pub struct SourceFile {
225 #[rust_sitter::leaf(pattern = r#"<\s*sourcefile"#)]
226 #[builder(default, setter(skip))]
227 _start: (),
228 #[rust_sitter::leaf(
229 pattern = r#"name\s*=\s*"([^"]+)""#,
230 transform = |v| {
231 SourceFile::NAME_REGEX
232 .get_or_init(|| {
233 Regex::new(r#"name\s*=\s*"([^"]+)""#).expect("Invalid regular expression")
234 })
235 .captures(v)
236 .expect("No captures or no capture group")
237 .get(1)
238 .expect("No capture group")
239 .as_str()
240 .to_string()
241 .xml_unescape()
242 }
243 )]
244 name: String,
245 #[rust_sitter::leaf(
246 pattern = r#"index\s*=\s*"(-?[0-9]+)""#,
247 transform = |v| {
248 SourceFile::INDEX_REGEX
249 .get_or_init(|| {
250 Regex::new(r#"index\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
251 })
252 .captures(v)
253 .expect("No captures or no capture group")
254 .get(1)
255 .expect("No capture group")
256 .as_str()
257 .parse()
258 .expect("Invalid integer")
259 }
260 )]
261 #[builder(default, setter(transform = |v: impl Into<Integer>| {
262 v.into()
263 }))]
264 index: Integer,
265 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
266 #[builder(default, setter(skip))]
267 _end: (),
268 }
269
270 impl Spaces {
271 const DEFAULTSPACE_REGEX: OnceCell<Regex> = OnceCell::new();
272 }
273
274 #[derive(TypedBuilder, Debug, PartialEq)]
275 pub struct Spaces {
276 #[rust_sitter::leaf(pattern = r#"<\s*spaces"#)]
277 #[builder(default, setter(skip))]
278 _start: (),
279 #[rust_sitter::leaf(pattern = r#"defaultspace\s*=\s*"([^"]+)""#, transform = |v| {
280 Spaces::DEFAULTSPACE_REGEX
281 .get_or_init(|| {
282 Regex::new(r#"defaultspace\s*=\s*"([^"]+)""#).expect("Invalid regular expression")
283 })
284 .captures(v)
285 .expect("No captures or no capture group")
286 .get(1)
287 .expect("No capture group")
288 .as_str()
289 .to_string()
290 .xml_unescape()
291 })]
292 defaultspace: String,
293 #[rust_sitter::leaf(pattern = r#">"#)]
294 #[builder(default, setter(skip))]
295 _close: (),
296 #[builder(default)]
297 spaces: Vec<AddrSpaceType>,
298 #[rust_sitter::leaf(pattern = r#"<\s*/\s*spaces\s*>"#)]
299 #[builder(default, setter(skip))]
300 _end: (),
301 }
302
303 impl AddrSpace {
304 pub const NAME_REGEX: OnceCell<Regex> = OnceCell::new();
305 pub const INDEX_REGEX: OnceCell<Regex> = OnceCell::new();
306 pub const BIGENDIAN_REGEX: OnceCell<Regex> = OnceCell::new();
307 pub const DELAY_REGEX: OnceCell<Regex> = OnceCell::new();
308 pub const DEADCODEDELAY_REGEX: OnceCell<Regex> = OnceCell::new();
309 pub const SIZE_REGEX: OnceCell<Regex> = OnceCell::new();
310 pub const WORDSIZE_REGEX: OnceCell<Regex> = OnceCell::new();
311 pub const PHYSICAL_REGEX: OnceCell<Regex> = OnceCell::new();
312 }
313
314 #[derive(TypedBuilder, Debug, PartialEq)]
315 pub struct AddrSpace {
316 #[rust_sitter::leaf(
317 pattern = r#"name\s*=\s*"([^"]+)""#,
318 transform = |v| {
319 AddrSpace::NAME_REGEX
320 .get_or_init(|| {
321 Regex::new(r#"name\s*=\s*"([^"]+)""#).expect("Invalid regular expression")
322 })
323 .captures(v)
324 .expect("No captures or no capture group")
325 .get(1)
326 .expect("No capture group")
327 .as_str()
328 .to_string()
329 .xml_unescape()
330 }
331 )]
332 name: String,
333 #[rust_sitter::leaf(
334 pattern = r#"index\s*=\s*"(-?[0-9]+)""#,
335 transform = |v| {
336 AddrSpace::INDEX_REGEX
337 .get_or_init(|| {
338 Regex::new(r#"index\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
339 })
340 .captures(v)
341 .expect("No captures or no capture group")
342 .get(1)
343 .expect("No capture group")
344 .as_str()
345 .parse()
346 .expect("Invalid integer")
347 }
348 )]
349 #[builder(setter(transform = |v: impl Into<Integer>| {
350 v.into()
351 }))]
352 index: Integer,
353 #[rust_sitter::leaf(
354 pattern = r#"bigendian\s*=\s*"([a-z]+)""#,
355 transform = |v| {
356 AddrSpace::BIGENDIAN_REGEX
357 .get_or_init(|| {
358 Regex::new(r#"bigendian\s*=\s*"([a-z]+)""#)
359 .expect("Invalid regular expression")
360 })
361 .captures(v)
362 .expect("No captures or no capture group")
363 .get(1)
364 .expect("No capture group")
365 .as_str()
366 .parse()
367 .expect("Invalid boolean")
368 }
369 )]
370 bigendian: bool,
371 #[rust_sitter::leaf(
372 pattern = r#"delay\s*=\s*"(-?[0-9]+)""#,
373 transform = |v| {
374 AddrSpace::DELAY_REGEX
375 .get_or_init(|| {
376 Regex::new(r#"delay\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
377 })
378 .captures(v)
379 .expect("No captures or no capture group")
380 .get(1)
381 .expect("No capture group")
382 .as_str()
383 .parse()
384 .expect("Invalid integer")
385 }
386 )]
387 #[builder(setter(transform = |v: impl Into<Integer>| {
388 v.into()
389 }))]
390 delay: Integer,
391 #[rust_sitter::leaf(
392 pattern = r#"deadcodedelay\s*=\s*"(-?[0-9]+)""#,
393 transform = |v| {
394 AddrSpace::DEADCODEDELAY_REGEX
395 .get_or_init(|| {
396 Regex::new(r#"deadcodedelay\s*=\s*"(-?[0-9]+)""#)
397 .expect("Invalid regular expression")
398 })
399 .captures(v)
400 .expect("No captures or no capture group")
401 .get(1)
402 .expect("No capture group")
403 .as_str()
404 .parse()
405 .expect("Invalid integer")
406 }
407 )]
408 #[builder(default, setter(transform = |v: impl Into<Integer>| {
409 Some(v.into())
410 }))]
411 deadcodedelay: Option<Integer>,
412 #[rust_sitter::leaf(
413 pattern = r#"size\s*=\s*"(-?[0-9]+)""#,
414 transform = |v| {
415 AddrSpace::SIZE_REGEX
416 .get_or_init(|| {
417 Regex::new(r#"size\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
418 })
419 .captures(v)
420 .expect("No captures or no capture group")
421 .get(1)
422 .expect("No capture group")
423 .as_str()
424 .parse()
425 .expect("Invalid integer")
426 }
427 )]
428 #[builder(setter(transform = |v: impl Into<Integer>| {
429 v.into()
430 }))]
431 size: Integer,
432 #[rust_sitter::leaf(
433 pattern = r#"wordsize\s*=\s*"(-?[0-9]+)""#,
434 transform = |v| {
435 AddrSpace::WORDSIZE_REGEX
436 .get_or_init(|| {
437 Regex::new(r#"wordsize\s*=\s*"(-?[0-9]+)""#)
438 .expect("Invalid regular expression")
439 })
440 .captures(v)
441 .expect("No captures or no capture group")
442 .get(1)
443 .expect("No capture group")
444 .as_str()
445 .parse()
446 .expect("Invalid integer")
447 }
448 )]
449 #[builder(default, setter(transform = |v: impl Into<Integer>| {
450 Some(v.into())
451 }))]
452 wordsize: Option<Integer>,
453 #[rust_sitter::leaf(
454 pattern = r#"physical\s*=\s*"([a-z]+)""#,
455 transform = |v| {
456 AddrSpace::PHYSICAL_REGEX
457 .get_or_init(|| {
458 Regex::new(r#"physical\s*=\s*"([a-z]+)""#)
459 .expect("Invalid regular expression")
460 })
461 .captures(v)
462 .expect("No captures or no capture group")
463 .get(1)
464 .expect("No capture group")
465 .as_str()
466 .parse()
467 .expect("Invalid boolean")
468 }
469 )]
470 physical: bool,
471 }
472
473 #[derive(Debug, PartialEq)]
474 pub enum AddrSpaceType {
475 Base {
476 #[rust_sitter::leaf(pattern = r#"<\s*space_base"#)]
477 _start: (),
478 space: AddrSpace,
479 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
480 _end: (),
481 },
482 Unique {
483 #[rust_sitter::leaf(pattern = r#"<\s*space_unique"#)]
484 _start: (),
485 space: AddrSpace,
486 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
487 _end: (),
488 },
489 Other {
490 #[rust_sitter::leaf(pattern = r#"<\s*space_other"#)]
491 _start: (),
492 space: AddrSpace,
493 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
494 _end: (),
495 },
496 Overlay {
497 #[rust_sitter::leaf(pattern = r#"<\s*space_overlay"#)]
498 _start: (),
499 space: AddrSpace,
500 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
501 _end: (),
502 },
503 Space {
504 #[rust_sitter::leaf(pattern = r#"<\s*space"#)]
505 _start: (),
506 space: AddrSpace,
507 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
508 _end: (),
509 },
510 }
511
512 impl SymbolTable {
513 const SCOPESIZE_REGEX: OnceCell<Regex> = OnceCell::new();
514 const SYMBOLSIZE_REGEX: OnceCell<Regex> = OnceCell::new();
515 }
516
517 #[derive(TypedBuilder, Debug, PartialEq)]
518 pub struct SymbolTable {
519 #[rust_sitter::leaf(pattern = r#"<\s*symbol_table"#)]
520 #[builder(default, setter(skip))]
521 _start: (),
522 #[rust_sitter::leaf(
523 pattern = r#"scopesize\s*=\s*"(-?[0-9]+)""#,
524 transform = |v| {
525 SymbolTable::SCOPESIZE_REGEX
526 .get_or_init(|| {
527 Regex::new(r#"scopesize\s*=\s*"(-?[0-9]+)""#)
528 .expect("Invalid regular expression")
529 })
530 .captures(v)
531 .expect("No captures or no capture group")
532 .get(1)
533 .expect("No capture group")
534 .as_str()
535 .parse()
536 .expect("Invalid integer")
537 }
538 )]
539 #[builder(setter(transform = |v: impl Into<Integer>| {
540 v.into()
541 }))]
542 scopesize: Integer,
543 #[rust_sitter::leaf(
544 pattern = r#"symbolsize\s*=\s*"(-?[0-9]+)""#,
545 transform = |v| {
546 SymbolTable::SYMBOLSIZE_REGEX
547 .get_or_init(|| {
548 Regex::new(r#"symbolsize\s*=\s*"(-?[0-9]+)""#)
549 .expect("Invalid regular expression")
550 })
551 .captures(v)
552 .expect("No captures or no capture group")
553 .get(1)
554 .expect("No capture group")
555 .as_str()
556 .parse()
557 .expect("Invalid integer")
558 }
559 )]
560 #[builder(setter(transform = |v: impl Into<Integer>| {
561 v.into()
562 }))]
563 symbolsize: Integer,
564 #[rust_sitter::leaf(pattern = r#">"#)]
565 #[builder(default, setter(skip))]
566 _close: (),
567 #[builder(default)]
568 scopes: Vec<Scope>,
569 #[builder(default)]
570 symbol_headers: Vec<SymbolHeaderType>,
571 #[builder(default)]
572 symbols: Vec<SleighSymbolType>,
573 #[rust_sitter::leaf(pattern = r#"<\s*/\s*symbol_table\s*>"#)]
574 #[builder(default, setter(skip))]
575 _end: (),
576 }
577
578 impl Scope {
579 const ID_REGEX: OnceCell<Regex> = OnceCell::new();
580 const PARENT_REGEX: OnceCell<Regex> = OnceCell::new();
581 }
582
583 #[derive(TypedBuilder, Debug, PartialEq)]
584 pub struct Scope {
585 #[rust_sitter::leaf(pattern = r#"<\s*scope"#)]
586 #[builder(default, setter(skip))]
587 _start: (),
588 #[rust_sitter::leaf(
589 pattern = r#"id\s*=\s*"0x([0-9a-fA-F]+)""#,
590 transform = |v| {
591 Integer::from_string_base(16, Scope::ID_REGEX
592 .get_or_init(|| {
593 Regex::new(r#"id\s*=\s*"0x([0-9a-fA-F]+)""#)
594 .expect("Invalid regular expression")
595 })
596 .captures(v)
597 .expect("No captures or no capture group")
598 .get(1)
599 .expect("No capture group")
600 .as_str()).expect("Invalid integer")
601 }
602 )]
603 #[builder(setter(transform = |v: impl Into<Integer>| {
604 v.into()
605 }))]
606 id: Integer,
607 #[rust_sitter::leaf(
608 pattern = r#"parent\s*=\s*"0x([0-9a-fA-F]+)""#,
609 transform = |v| {
610 Integer::from_string_base(16, Scope::PARENT_REGEX
611 .get_or_init(|| {
612 Regex::new(r#"parent\s*=\s*"0x([0-9a-fA-F]+)""#)
613 .expect("Invalid regular expression")
614 })
615 .captures(v)
616 .expect("No captures or no capture group")
617 .get(1)
618 .expect("No capture group")
619 .as_str()).expect("Invalid integer")
620 }
621 )]
622 #[builder(setter(transform = |v: impl Into<Integer>| {
623 v.into()
624 }))]
625 parent: Integer,
626 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
627 #[builder(default, setter(skip))]
628 _end: (),
629 }
630
631 impl SymbolHeader {
632 const NAME_REGEX: OnceCell<Regex> = OnceCell::new();
633 const ID_REGEX: OnceCell<Regex> = OnceCell::new();
634 const SCOPE_REGEX: OnceCell<Regex> = OnceCell::new();
635 }
636
637 #[derive(TypedBuilder, Debug, PartialEq)]
638 pub struct SymbolHeader {
639 #[rust_sitter::leaf(
640 pattern = r#"name\s*=\s*"([^"]+)""#,
641 transform = |v| {
642 SymbolHeader::NAME_REGEX
643 .get_or_init(|| {
644 Regex::new(r#"name\s*=\s*"([^"]+)""#).expect("Invalid regular expression")
645 })
646 .captures(v)
647 .expect("No captures or no capture group")
648 .get(1)
649 .expect("No capture group")
650 .as_str()
651 .to_string()
652 .xml_unescape()
653 }
654 )]
655 name: String,
656 #[rust_sitter::leaf(
657 pattern = r#"id\s*=\s*"0x([0-9a-fA-F]+)""#,
658 transform = |v| {
659 Integer::from_string_base(16, SymbolHeader::ID_REGEX
660 .get_or_init(|| {
661 Regex::new(r#"id\s*=\s*"0x([0-9a-fA-F]+)""#)
662 .expect("Invalid regular expression")
663 })
664 .captures(v)
665 .expect("No captures or no capture group").get(1).expect("No capture group").as_str()).expect("Invalid integer")
666 }
667 )]
668 #[builder(setter(transform = |v: impl Into<Integer>| {
669 v.into()
670 }))]
671 id: Integer,
672 #[rust_sitter::leaf(
673 pattern = r#"scope\s*=\s*"0x([0-9a-fA-F]+)""#,
674 transform = |v| {
675 Integer::from_string_base(16, SymbolHeader::SCOPE_REGEX
676 .get_or_init(|| {
677 Regex::new(r#"scope\s*=\s*"0x([0-9a-fA-F]+)""#)
678 .expect("Invalid regular expression")
679 })
680 .captures(v)
681 .expect("No captures or no capture group").get(1).expect("No capture group").as_str()).expect("Invalid integer")
682 }
683 )]
684 #[builder(setter(transform = |v: impl Into<Integer>| {
685 v.into()
686 }))]
687 scope: Integer,
688 }
689
690 #[derive(Debug, PartialEq)]
691 pub enum SymbolHeaderType {
692 UserOp {
693 #[rust_sitter::leaf(pattern = r#"<\s*userop_head"#)]
694 _start: (),
695 header: SymbolHeader,
696 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
697 _end: (),
698 },
699 Epsilon {
700 #[rust_sitter::leaf(pattern = r#"<\s*epsilon_sym_head"#)]
701 _start: (),
702 header: SymbolHeader,
703 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
704 _end: (),
705 },
706 Value {
707 #[rust_sitter::leaf(pattern = r#"<\s*value_sym_head"#)]
708 _start: (),
709 header: SymbolHeader,
710 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
711 _end: (),
712 },
713 ValueMap {
714 #[rust_sitter::leaf(pattern = r#"<\s*valuemap_sym_head"#)]
715 _start: (),
716 header: SymbolHeader,
717 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
718 _end: (),
719 },
720 Name {
721 #[rust_sitter::leaf(pattern = r#"<\s*name_sym_head"#)]
722 _start: (),
723 header: SymbolHeader,
724 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
725 _end: (),
726 },
727 VarNode {
728 #[rust_sitter::leaf(pattern = r#"<\s*varnode_sym_head"#)]
729 _start: (),
730 header: SymbolHeader,
731 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
732 _end: (),
733 },
734 Context {
735 #[rust_sitter::leaf(pattern = r#"<\s*context_sym_head"#)]
736 _start: (),
737 header: SymbolHeader,
738 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
739 _end: (),
740 },
741 VarNodeList {
742 #[rust_sitter::leaf(pattern = r#"<\s*varlist_sym_head"#)]
743 _start: (),
744 header: SymbolHeader,
745 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
746 _end: (),
747 },
748 Operand {
749 #[rust_sitter::leaf(pattern = r#"<\s*operand_sym_head"#)]
750 _start: (),
751 header: SymbolHeader,
752 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
753 _end: (),
754 },
755 Start {
756 #[rust_sitter::leaf(pattern = r#"<\s*start_sym_head"#)]
757 _start: (),
758 header: SymbolHeader,
759 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
760 _end: (),
761 },
762 End {
763 #[rust_sitter::leaf(pattern = r#"<\s*end_sym_head"#)]
764 _start: (),
765 header: SymbolHeader,
766 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
767 _end: (),
768 },
769 Next2 {
770 #[rust_sitter::leaf(pattern = r#"<\s*next2_sym_head"#)]
771 _start: (),
772 header: SymbolHeader,
773 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
774 _end: (),
775 },
776 FlowDest {
777 #[rust_sitter::leaf(pattern = r#"<\s*flowdest_sym_head"#)]
778 _start: (),
779 header: SymbolHeader,
780 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
781 _end: (),
782 },
783 FlowRef {
784 #[rust_sitter::leaf(pattern = r#"<\s*flowref_sym_head"#)]
785 _start: (),
786 header: SymbolHeader,
787 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
788 _end: (),
789 },
790 SubTable {
791 #[rust_sitter::leaf(pattern = r#"<\s*subtable_sym_head"#)]
792 _start: (),
793 header: SymbolHeader,
794 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
795 _close: (),
796 },
797 }
798
799 #[derive(Debug, PartialEq)]
800 pub enum PatternExpressionType {
801 PatternValue(PatternValueType),
802 BinaryExpression(Box<BinaryExpressionType>),
803 UnaryExpression(Box<UnaryExpressionType>),
804 }
805
806 impl TokenField {
807 const BIGENDIAN_REGEX: OnceCell<Regex> = OnceCell::new();
808 const SIGNBIT_REGEX: OnceCell<Regex> = OnceCell::new();
809 const BITSTART_REGEX: OnceCell<Regex> = OnceCell::new();
810 const BITEND_REGEX: OnceCell<Regex> = OnceCell::new();
811 const BYTESTART_REGEX: OnceCell<Regex> = OnceCell::new();
812 const BYTEEND_REGEX: OnceCell<Regex> = OnceCell::new();
813 const SHIFT_REGEX: OnceCell<Regex> = OnceCell::new();
814 }
815
816 #[derive(TypedBuilder, Debug, PartialEq)]
817 pub struct TokenField {
818 #[rust_sitter::leaf(pattern = r#"<\s*tokenfield"#)]
819 #[builder(default, setter(skip))]
820 _start: (),
821 #[rust_sitter::leaf(
822 pattern = r#"bigendian\s*=\s*"([a-z]+)""#,
823 transform = |v| {
824 TokenField::BIGENDIAN_REGEX
825 .get_or_init(|| {
826 Regex::new(r#"bigendian\s*=\s*"([a-z]+)""#)
827 .expect("Invalid regular expression")
828 })
829 .captures(v)
830 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid boolean")
831 }
832 )]
833 bigendian: bool,
834 #[rust_sitter::leaf(
835 pattern = r#"signbit\s*=\s*"([a-z]+)""#,
836 transform = |v| {
837 TokenField::SIGNBIT_REGEX
838 .get_or_init(|| {
839 Regex::new(r#"signbit\s*=\s*"([a-z]+)""#)
840 .expect("Invalid regular expression")
841 })
842 .captures(v)
843 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid boolean")
844 }
845 )]
846 signbit: bool,
847 #[rust_sitter::leaf(
848 pattern = r#"bitstart\s*=\s*"(-?[0-9]+)""#,
849 transform = |v| {
850 TokenField::BITSTART_REGEX
851 .get_or_init(|| {
852 Regex::new(r#"bitstart\s*=\s*"(-?[0-9]+)""#)
853 .expect("Invalid regular expression")
854 })
855 .captures(v)
856 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
857 }
858 )]
859 #[builder(setter(transform = |v: impl Into<Integer>| {
860 v.into()
861 }))]
862 bitstart: Integer,
863 #[rust_sitter::leaf(
864 pattern = r#"bitend\s*=\s*"(-?[0-9]+)""#,
865 transform = |v| {
866 TokenField::BITEND_REGEX
867 .get_or_init(|| {
868 Regex::new(r#"bitend\s*=\s*"(-?[0-9]+)""#)
869 .expect("Invalid regular expression")
870 })
871 .captures(v)
872 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
873 }
874 )]
875 #[builder(setter(transform = |v: impl Into<Integer>| {
876 v.into()
877 }))]
878 bitend: Integer,
879 #[rust_sitter::leaf(
880 pattern = r#"bytestart\s*=\s*"(-?[0-9]+)""#,
881 transform = |v| {
882 TokenField::BYTESTART_REGEX
883 .get_or_init(|| {
884 Regex::new(r#"bytestart\s*=\s*"(-?[0-9]+)""#)
885 .expect("Invalid regular expression")
886 })
887 .captures(v)
888 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
889 }
890 )]
891 #[builder(setter(transform = |v: impl Into<Integer>| {
892 v.into()
893 }))]
894 bytestart: Integer,
895 #[rust_sitter::leaf(
896 pattern = r#"byteend\s*=\s*"(-?[0-9]+)""#,
897 transform = |v| {
898 TokenField::BYTEEND_REGEX
899 .get_or_init(|| {
900 Regex::new(r#"byteend\s*=\s*"(-?[0-9]+)""#)
901 .expect("Invalid regular expression")
902 })
903 .captures(v)
904 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
905 }
906 )]
907 #[builder(setter(transform = |v: impl Into<Integer>| {
908 v.into()
909 }))]
910 byteend: Integer,
911 #[rust_sitter::leaf(
912 pattern = r#"shift\s*=\s*"(-?[0-9]+)""#,
913 transform = |v| {
914 TokenField::SHIFT_REGEX
915 .get_or_init(|| {
916 Regex::new(r#"shift\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
917 })
918 .captures(v)
919 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
920 }
921 )]
922 #[builder(setter(transform = |v: impl Into<Integer>| {
923 v.into()
924 }))]
925 shift: Integer,
926 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
927 #[builder(default, setter(skip))]
928 _end: (),
929 }
930
931 impl ContextField {
932 const SIGNBIT_REGEX: OnceCell<Regex> = OnceCell::new();
933 const STARTBIT_REGEX: OnceCell<Regex> = OnceCell::new();
934 const ENDBIT_REGEX: OnceCell<Regex> = OnceCell::new();
935 const STARTBYTE_REGEX: OnceCell<Regex> = OnceCell::new();
936 const ENDBYTE_REGEX: OnceCell<Regex> = OnceCell::new();
937 const SHIFT_REGEX: OnceCell<Regex> = OnceCell::new();
938 }
939
940 #[derive(TypedBuilder, Debug, PartialEq)]
941 pub struct ContextField {
942 #[rust_sitter::leaf(pattern = r#"<\s*contextfield"#)]
943 #[builder(default, setter(skip))]
944 _start: (),
945 #[rust_sitter::leaf(
946 pattern = r#"signbit\s*=\s*"([a-z]+)""#,
947 transform = |v| {
948 ContextField::SIGNBIT_REGEX
949 .get_or_init(|| {
950 Regex::new(r#"signbit\s*=\s*"([a-z]+)""#)
951 .expect("Invalid regular expression")
952 })
953 .captures(v)
954 .expect("No captures or no capture group")
955 .get(1)
956 .expect("No capture group").as_str().parse().expect("Invalid boolean")
957 }
958 )]
959 signbit: bool,
960 #[rust_sitter::leaf(
961 pattern = r#"startbit\s*=\s*"(-?[0-9]+)""#,
962 transform = |v| {
963 ContextField::STARTBIT_REGEX
964 .get_or_init(|| {
965 Regex::new(r#"startbit\s*=\s*"(-?[0-9]+)""#)
966 .expect("Invalid regular expression")
967 })
968 .captures(v)
969 .expect("No captures or no capture group")
970 .get(1)
971 .expect("No capture group").as_str().parse().expect("Invalid integer")
972 }
973 )]
974 #[builder(setter(transform = |v: impl Into<Integer>| {
975 v.into()
976 }))]
977 startbit: Integer,
978 #[rust_sitter::leaf(
979 pattern = r#"endbit\s*=\s*"(-?[0-9]+)""#,
980 transform = |v| {
981 ContextField::ENDBIT_REGEX
982 .get_or_init(|| {
983 Regex::new(r#"endbit\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
984 })
985 .captures(v)
986 .expect("No captures or no capture group")
987 .get(1)
988 .expect("No capture group").as_str().parse().expect("Invalid integer")
989 }
990 )]
991 #[builder(setter(transform = |v: impl Into<Integer>| {
992 v.into()
993 }))]
994 endbit: Integer,
995 #[rust_sitter::leaf(
996 pattern = r#"startbyte\s*=\s*"(-?[0-9]+)""#,
997 transform = |v| {
998 ContextField::STARTBYTE_REGEX
999 .get_or_init(|| {
1000 Regex::new(r#"startbyte\s*=\s*"(-?[0-9]+)""#)
1001 .expect("Invalid regular expression")
1002 })
1003 .captures(v)
1004 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
1005 }
1006 )]
1007 #[builder(setter(transform = |v: impl Into<Integer>| {
1008 v.into()
1009 }))]
1010 startbyte: Integer,
1011 #[rust_sitter::leaf(
1012 pattern = r#"endbyte\s*=\s*"(-?[0-9]+)""#,
1013 transform = |v| {
1014 ContextField::ENDBYTE_REGEX
1015 .get_or_init(|| {
1016 Regex::new(r#"endbyte\s*=\s*"(-?[0-9]+)""#)
1017 .expect("Invalid regular expression")
1018 })
1019 .captures(v)
1020 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
1021 }
1022 )]
1023 #[builder(setter(transform = |v: impl Into<Integer>| {
1024 v.into()
1025 }))]
1026 endbyte: Integer,
1027 #[rust_sitter::leaf(
1028 pattern = r#"shift\s*=\s*"(-?[0-9]+)""#,
1029 transform = |v| {
1030 ContextField::SHIFT_REGEX
1031 .get_or_init(|| {
1032 Regex::new(r#"shift\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
1033 })
1034 .captures(v)
1035 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
1036 }
1037 )]
1038 #[builder(setter(transform = |v: impl Into<Integer>| {
1039 v.into()
1040 }))]
1041 shift: Integer,
1042 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
1043 #[builder(default, setter(skip))]
1044 _end: (),
1045 }
1046
1047 impl ConstantValue {
1048 const VAL_REGEX: OnceCell<Regex> = OnceCell::new();
1049 }
1050
1051 #[derive(TypedBuilder, Debug, PartialEq)]
1052 pub struct ConstantValue {
1053 #[rust_sitter::leaf(pattern = r#"<\s*intb"#)]
1054 #[builder(default, setter(skip))]
1055 _start: (),
1056 #[rust_sitter::leaf(
1057 pattern = r#"val\s*=\s*"(-?[0-9]+)""#,
1058 transform = |v| {
1059 ConstantValue::VAL_REGEX
1060 .get_or_init(|| {
1061 Regex::new(r#"val\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
1062 })
1063 .captures(v)
1064 .expect("No captures or no capture group")
1065 .get(1)
1066 .expect("No capture group").as_str().parse().expect("Invalid integer")
1067 }
1068 )]
1069 #[builder(setter(transform = |v: impl Into<Integer>| {
1070 v.into()
1071 }))]
1072 val: Integer,
1073 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
1074 #[builder(default, setter(skip))]
1075 _end: (),
1076 }
1077
1078 impl OperandValue {
1079 const INDEX_REGEX: OnceCell<Regex> = OnceCell::new();
1081 const TABLE_REGEX: OnceCell<Regex> = OnceCell::new();
1083 const CONSTRUCTOR_ID_REGEX: OnceCell<Regex> = OnceCell::new();
1085 }
1086
1087 #[derive(TypedBuilder, Debug, PartialEq)]
1088 pub struct OperandValue {
1089 #[rust_sitter::leaf(pattern = r#"<\s*operand_exp"#)]
1090 #[builder(default, setter(skip))]
1091 _start: (),
1092 #[rust_sitter::leaf(
1093 pattern = r#"index\s*=\s*"(-?[0-9]+)""#,
1094 transform = |v| {
1095 OperandValue::INDEX_REGEX
1096 .get_or_init(|| {
1097 Regex::new(r#"index\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
1098 })
1099 .captures(v)
1100 .expect("No captures or no capture group")
1101 .get(1)
1102 .expect("No capture group").as_str().parse().expect("Invalid integer")
1103 }
1104 )]
1105 #[builder(setter(transform = |v: impl Into<Integer>| {
1106 v.into()
1107 }))]
1108 index: Integer,
1109 #[rust_sitter::leaf(
1110 pattern = r#"table\s*=\s*"0x([0-9a-fA-F]+)""#,
1111 transform = |v| {
1112 Integer::from_string_base(16, OperandValue::TABLE_REGEX
1113 .get_or_init(|| {
1114 Regex::new(r#"table\s*=\s*"0x([0-9a-fA-F]+)""#)
1115 .expect("Invalid regular expression")
1116 })
1117 .captures(v)
1118 .expect("No captures or no capture group")
1119 .get(1)
1120 .expect("No capture group").as_str()).expect("Invalid integer")
1121 }
1122 )]
1123 #[builder(setter(transform = |v: impl Into<Integer>| {
1124 v.into()
1125 }))]
1126 table: Integer,
1127 #[rust_sitter::leaf(
1128 pattern = r#"ct\s*=\s*"0x([0-9a-fA-F]+)""#,
1129 transform = |v| {
1130 Integer::from_string_base(16, OperandValue::CONSTRUCTOR_ID_REGEX
1131 .get_or_init(|| {
1132 Regex::new(r#"ct\s*=\s*"0x([0-9a-fA-F]+)""#)
1133 .expect("Invalid regular expression")
1134 })
1135 .captures(v)
1136 .expect("No captures or no capture group")
1137 .get(1)
1138 .expect("No capture group").as_str()).expect("Invalid integer")
1139 }
1140 )]
1141 #[builder(setter(transform = |v: impl Into<Integer>| {
1142 v.into()
1143 }))]
1144 constructor_id: Integer,
1145 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
1146 #[builder(default, setter(skip))]
1147 _end: (),
1148 }
1149
1150 #[derive(Debug, PartialEq)]
1151 pub enum PatternValueType {
1164 TokenField(TokenField),
1165 ContextField(ContextField),
1166 ConstantValue(ConstantValue),
1167 OperandValue(OperandValue),
1168 StartInstructionValue {
1169 #[rust_sitter::leaf(pattern = r#"<\s*start_exp\s*/\s*>"#)]
1170 _tag: (),
1171 },
1172 EndInstructionValue {
1173 #[rust_sitter::leaf(pattern = r#"<\s*end_exp\s*/\s*>"#)]
1174 _tag: (),
1175 },
1176 Next2InstructionValue {
1177 #[rust_sitter::leaf(pattern = r#"<\s*next2_exp\s*/\s*>"#)]
1178 _tag: (),
1179 },
1180 }
1181
1182 #[derive(Debug, PartialEq)]
1183 pub enum BinaryExpressionType {
1198 Plus {
1199 #[rust_sitter::leaf(pattern = r#"<\s*plus_exp\s*>"#)]
1200 _start: (),
1201 left: PatternExpressionType,
1202 right: PatternExpressionType,
1203 #[rust_sitter::leaf(pattern = r#"<\s*/\s*plus_exp\s*>"#)]
1204 _end: (),
1205 },
1206 Sub {
1207 #[rust_sitter::leaf(pattern = r#"<\s*sub_exp\s*>"#)]
1208 _start: (),
1209 left: PatternExpressionType,
1210 right: PatternExpressionType,
1211 #[rust_sitter::leaf(pattern = r#"<\s*/\s*sub_exp\s*>"#)]
1212 _end: (),
1213 },
1214 Mult {
1215 #[rust_sitter::leaf(pattern = r#"<\s*mult_exp\s*>"#)]
1216 _start: (),
1217 left: PatternExpressionType,
1218 right: PatternExpressionType,
1219 #[rust_sitter::leaf(pattern = r#"<\s*/\s*mult_exp\s*>"#)]
1220 _end: (),
1221 },
1222 LeftShift {
1223 #[rust_sitter::leaf(pattern = r#"<\s*lshift_exp\s*>"#)]
1224 _start: (),
1225 left: PatternExpressionType,
1226 right: PatternExpressionType,
1227 #[rust_sitter::leaf(pattern = r#"<\s*/\s*lshift_exp\s*>"#)]
1228 _end: (),
1229 },
1230 RightShift {
1231 #[rust_sitter::leaf(pattern = r#"<\s*rshift_exp\s*>"#)]
1232 _start: (),
1233 left: PatternExpressionType,
1234 right: PatternExpressionType,
1235 #[rust_sitter::leaf(pattern = r#"<\s*/\s*rshift_exp\s*>"#)]
1236 _end: (),
1237 },
1238 And {
1239 #[rust_sitter::leaf(pattern = r#"<\s*and_exp\s*>"#)]
1240 _start: (),
1241 left: PatternExpressionType,
1242 right: PatternExpressionType,
1243 #[rust_sitter::leaf(pattern = r#"<\s*/\s*and_exp\s*>"#)]
1244 _end: (),
1245 },
1246 Or {
1247 #[rust_sitter::leaf(pattern = r#"<\s*or_exp\s*>"#)]
1248 _start: (),
1249 left: PatternExpressionType,
1250 right: PatternExpressionType,
1251 #[rust_sitter::leaf(pattern = r#"<\s*/\s*or_exp\s*>"#)]
1252 _end: (),
1253 },
1254 Xor {
1255 #[rust_sitter::leaf(pattern = r#"<\s*xor_exp\s*>"#)]
1256 _start: (),
1257 left: PatternExpressionType,
1258 right: PatternExpressionType,
1259 #[rust_sitter::leaf(pattern = r#"<\s*/\s*xor_exp\s*>"#)]
1260 _end: (),
1261 },
1262 Div {
1263 #[rust_sitter::leaf(pattern = r#"<\s*div_exp\s*>"#)]
1264 _start: (),
1265 left: PatternExpressionType,
1266 right: PatternExpressionType,
1267 #[rust_sitter::leaf(pattern = r#"<\s*/\s*div_exp\s*>"#)]
1268 _end: (),
1269 },
1270 }
1271
1272 #[derive(Debug, PartialEq)]
1273 pub enum UnaryExpressionType {
1281 Minus {
1282 #[rust_sitter::leaf(pattern = r#"<\s*minus_exp\s*>"#)]
1283 _start: (),
1284 inner: PatternExpressionType,
1285 #[rust_sitter::leaf(pattern = r#"<\s*/\s*minus_exp\s*>"#)]
1286 _end: (),
1287 },
1288 Not {
1289 #[rust_sitter::leaf(pattern = r#"<\s*not_exp\s*>"#)]
1290 _start: (),
1291 inner: PatternExpressionType,
1292 #[rust_sitter::leaf(pattern = r#"<\s*/\s*not_exp\s*>"#)]
1293 _end: (),
1294 },
1295 }
1296
1297 #[derive(TypedBuilder, Debug, PartialEq)]
1298 pub struct Value {
1299 header: SymbolHeader,
1300 #[rust_sitter::leaf(pattern = r#">"#)]
1301 #[builder(default, setter(skip))]
1302 _close: (),
1303 patval: PatternValueType,
1304 }
1305
1306 impl UserOpSymbol {
1307 const INDEX_REGEX: OnceCell<Regex> = OnceCell::new();
1308 }
1309
1310 #[derive(TypedBuilder, Debug, PartialEq)]
1311 pub struct UserOpSymbol {
1312 header: SymbolHeader,
1313 #[rust_sitter::leaf(
1314 pattern = r#"index\s*=\s*"(-?[0-9]+)""#,
1315 transform = |v| {
1316 UserOpSymbol::INDEX_REGEX
1317 .get_or_init(|| {
1318 Regex::new(r#"index\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
1319 })
1320 .captures(v)
1321 .expect("No captures or no capture group")
1322 .get(1)
1323 .expect("No capture group").as_str().parse().expect("Invalid integer")
1324 }
1325 )]
1326 #[builder(setter(transform = |v: impl Into<Integer>| {
1327 v.into()
1328 }))]
1329 index: Integer,
1330 }
1331
1332 #[derive(Debug, PartialEq)]
1333 pub enum SleighSymbolType {
1361 UserOpSymbol {
1366 #[rust_sitter::leaf(pattern = r#"<\s*userop"#)]
1367 _start: (),
1368 user_op: UserOpSymbol,
1369 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
1370 _end: (),
1371 },
1372 TripleSymbol(TripleSymbol),
1373 }
1376
1377 impl ConstructorOperand {
1378 const ID_REGEX: OnceCell<Regex> = OnceCell::new();
1380 }
1381 #[derive(TypedBuilder, Debug, PartialEq)]
1382 pub struct ConstructorOperand {
1383 #[rust_sitter::leaf(pattern = r#"<\s*oper"#)]
1384 #[builder(default, setter(skip))]
1385 _start: (),
1386 #[rust_sitter::leaf(
1387 pattern = r#"id\s*=\s*"0x([0-9a-fA-F]+)""#,
1388 transform = |v| {
1389 Integer::from_string_base(16, ConstructorOperand::ID_REGEX
1390 .get_or_init(|| {
1391 Regex::new(r#"id\s*=\s*"0x([0-9a-fA-F]+)""#)
1392 .expect("Invalid regular expression")
1393 })
1394 .captures(v)
1395 .expect("No captures or no capture group")
1396 .get(1)
1397 .expect("No capture group").as_str()).expect("Invalid integer")
1398 }
1399 )]
1400 #[builder(setter(transform = |v: impl Into<Integer>| {
1401 v.into()
1402 }))]
1403 id: Integer,
1404 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
1405 #[builder(default, setter(skip))]
1406 _end: (),
1407 }
1408
1409 impl OperandPrint {
1410 const ID_REGEX: OnceCell<Regex> = OnceCell::new();
1412 }
1413
1414 #[derive(TypedBuilder, Debug, PartialEq)]
1415 pub struct OperandPrint {
1416 #[rust_sitter::leaf(pattern = r#"<\s*opprint"#)]
1417 #[builder(default, setter(skip))]
1418 _start: (),
1419 #[rust_sitter::leaf(
1420 pattern = r#"id\s*=\s*"(-?[0-9]+)""#,
1421 transform = |v| {
1422 OperandPrint::ID_REGEX
1423 .get_or_init(|| {
1424 Regex::new(r#"id\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
1425 })
1426 .captures(v)
1427 .expect("No captures or no capture group")
1428 .get(1)
1429 .expect("No capture group").as_str().parse().expect("Invalid integer")
1430 }
1431 )]
1432 #[builder(setter(transform = |v: impl Into<Integer>| {
1433 v.into()
1434 }))]
1435 id: Integer,
1436 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
1437 #[builder(default, setter(skip))]
1438 _end: (),
1439 }
1440
1441 impl Print {
1442 const PIECE_REGEX: OnceCell<Regex> = OnceCell::new();
1444 }
1445
1446 #[derive(TypedBuilder, Debug, PartialEq)]
1447 pub struct Print {
1448 #[rust_sitter::leaf(pattern = r#"<\s*print"#)]
1449 #[builder(default, setter(skip))]
1450 _start: (),
1451 #[rust_sitter::leaf(
1452 pattern = r#"piece\s*=\s*"([^"]*)""#,
1453 transform = |v| {
1454 Print::PIECE_REGEX
1455 .get_or_init(|| {
1456 Regex::new(r#"piece\s*=\s*"([^"]*)""#).expect("Invalid regular expression")
1457 })
1458 .captures(v)
1459 .expect("No captures or no capture group")
1460 .get(1)
1461 .expect("No capture group")
1462 .as_str()
1463 .to_string()
1464 .xml_unescape()
1465 }
1466 )]
1467 piece: String,
1468 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
1469 #[builder(default, setter(skip))]
1470 _end: (),
1471 }
1472
1473 #[derive(Debug, PartialEq)]
1474 pub enum PrintPieceType {
1475 Operand(OperandPrint),
1476 Print(Print),
1477 }
1478
1479 impl Operation {
1480 const I_REGEX: OnceCell<Regex> = OnceCell::new();
1482 const SHIFT_REGEX: OnceCell<Regex> = OnceCell::new();
1484 const MASK_REGEX: OnceCell<Regex> = OnceCell::new();
1486 }
1487
1488 #[derive(TypedBuilder, Debug, PartialEq)]
1489 pub struct Operation {
1490 #[rust_sitter::leaf(pattern = r#"<\s*context_op"#)]
1491 #[builder(default, setter(skip))]
1492 _start: (),
1493 #[rust_sitter::leaf(
1494 pattern = r#"i\s*=\s*"(-?[0-9]+)""#,
1495 transform = |v| {
1496 Operation::I_REGEX
1497 .get_or_init(|| {
1498 Regex::new(r#"i\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
1499 })
1500 .captures(v)
1501 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
1502 }
1503 )]
1504 #[builder(setter(transform = |v: impl Into<Integer>| {
1505 v.into()
1506 }))]
1507 i: Integer,
1508 #[rust_sitter::leaf(
1509 pattern = r#"shift\s*=\s*"(-?[0-9]+)""#,
1510 transform = |v| {
1511 Operation::SHIFT_REGEX
1512 .get_or_init(|| {
1513 Regex::new(r#"shift\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
1514 })
1515 .captures(v)
1516 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
1517 }
1518 )]
1519 #[builder(setter(transform = |v: impl Into<Integer>| {
1520 v.into()
1521 }))]
1522 shift: Integer,
1523 #[rust_sitter::leaf(
1524 pattern = r#"mask\s*=\s*"0x([0-9a-fA-F]+)""#,
1525 transform = |v| {
1526 Integer::from_string_base(16, Operation::MASK_REGEX
1527 .get_or_init(|| {
1528 Regex::new(r#"mask\s*=\s*"0x([0-9a-fA-F]+)""#)
1529 .expect("Invalid regular expression")
1530 })
1531 .captures(v)
1532 .expect("No captures or no capture group")
1533 .get(1)
1534 .expect("No capture group").as_str()).expect("Invalid integer")
1535 }
1536 )]
1537 #[builder(setter(transform = |v: impl Into<Integer>| {
1538 v.into()
1539 }))]
1540 mask: Integer,
1541 #[rust_sitter::leaf(pattern = r#">"#)]
1542 #[builder(default, setter(skip))]
1543 _close: (),
1544 patexp: PatternExpressionType,
1545 #[rust_sitter::leaf(pattern = r#"<\s*/\s*context_op\s*>"#)]
1546 #[builder(default, setter(skip))]
1547 _end: (),
1548 }
1549
1550 impl Commit {
1551 const ID_REGEX: OnceCell<Regex> = OnceCell::new();
1553 const NUM_REGEX: OnceCell<Regex> = OnceCell::new();
1555 const MASK_REGEX: OnceCell<Regex> = OnceCell::new();
1557 const FLOW_REGEX: OnceCell<Regex> = OnceCell::new();
1559 }
1560
1561 #[derive(TypedBuilder, Debug, PartialEq)]
1562 pub struct Commit {
1563 #[rust_sitter::leaf(pattern = r#"<\s*commit"#)]
1564 #[builder(default, setter(skip))]
1565 _start: (),
1566 #[rust_sitter::leaf(
1567 pattern = r#"id\s*=\s*"0x([0-9a-fA-F]+)""#,
1568 transform = |v| {
1569 Integer::from_string_base(16, Commit::ID_REGEX
1570 .get_or_init(|| {
1571 Regex::new(r#"id\s*=\s*"0x([0-9a-fA-F]+)""#)
1572 .expect("Invalid regular expression")
1573 })
1574 .captures(v)
1575 .expect("No captures or no capture group")
1576 .get(1)
1577 .expect("No capture group").as_str()).expect("Invalid integer")
1578 }
1579 )]
1580 #[builder(setter(transform = |v: impl Into<Integer>| {
1581 v.into()
1582 }))]
1583 id: Integer,
1584 #[rust_sitter::leaf(
1585 pattern = r#"num\s*=\s*"(-?[0-9]+)""#,
1586 transform = |v| {
1587 Commit::NUM_REGEX
1588 .get_or_init(|| {
1589 Regex::new(r#"num\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
1590 })
1591 .captures(v)
1592 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
1593 }
1594 )]
1595 #[builder(setter(transform = |v: impl Into<Integer>| {
1596 v.into()
1597 }))]
1598 num: Integer,
1599 #[rust_sitter::leaf(
1600 pattern = r#"mask\s*=\s*"0x([0-9a-fA-F]+)""#,
1601 transform = |v| {
1602 Integer::from_string_base(16, Commit::MASK_REGEX
1603 .get_or_init(|| {
1604 Regex::new(r#"mask\s*=\s*"0x([0-9a-fA-F]+)""#)
1605 .expect("Invalid regular expression")
1606 })
1607 .captures(v)
1608 .expect("No captures or no capture group")
1609 .get(1)
1610 .expect("No capture group").as_str()).expect("Invalid integer")
1611 }
1612 )]
1613 #[builder(setter(transform = |v: impl Into<Integer>| {
1614 v.into()
1615 }))]
1616 mask: Integer,
1617 #[rust_sitter::leaf(
1618 pattern = r#"flow\s*=\s*"([a-z]+)""#,
1619 transform = |v| {
1620 Commit::FLOW_REGEX
1621 .get_or_init(|| {
1622 Regex::new(r#"flow\s*=\s*"([a-z]+)""#).expect("Invalid regular expression")
1623 })
1624 .captures(v)
1625 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid boolean")
1626 }
1627 )]
1628 flow: bool,
1629 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
1630 #[builder(default, setter(skip))]
1631 _end: (),
1632 }
1633
1634 #[derive(Debug, PartialEq)]
1635 pub enum ContextChangeType {
1636 Operation(Operation),
1637 Commit(Commit),
1638 }
1639
1640 #[derive(Debug, PartialEq)]
1641 pub enum ConstantTemplateSelector {
1642 Space {
1643 #[rust_sitter::leaf(pattern = r#"s\s*=\s*"space""#)]
1644 _space: (),
1645 },
1646 Offset {
1647 #[rust_sitter::leaf(pattern = r#"s\s*=\s*"offset""#)]
1648 _offset: (),
1649 },
1650 Size {
1651 #[rust_sitter::leaf(pattern = r#"s\s*=\s*"size""#)]
1652 _size: (),
1653 },
1654 OffsetPlus {
1655 #[rust_sitter::leaf(pattern = r#"s\s*=\s*"offset_plus""#)]
1656 _offset_plus: (),
1657 },
1658 }
1659
1660 impl ConstantTemplateType {
1661 const DEC_VAL_REGEX: OnceCell<Regex> = OnceCell::new();
1663 const HEX_VAL_REGEX: OnceCell<Regex> = OnceCell::new();
1664 const PLUS_REGEX: OnceCell<Regex> = OnceCell::new();
1666 const NAME_REGEX: OnceCell<Regex> = OnceCell::new();
1668 }
1669
1670 #[derive(Debug, PartialEq)]
1671 pub enum ConstantTemplateType {
1672 Real {
1673 #[rust_sitter::leaf(pattern = r#"<\s*const_tpl\s*type\s*=\s*"real""#)]
1674 _start: (),
1675 #[rust_sitter::leaf(
1677 pattern = r#"val\s*=\s*"0x([0-9a-fA-F]+)""#,
1678 transform = |v| {
1679 Integer::from_string_base(16, ConstantTemplateType::HEX_VAL_REGEX
1680 .get_or_init(|| {
1681 Regex::new(r#"val\s*=\s*"0x([0-9a-fA-F]+)""#)
1682 .expect("Invalid regular expression")
1683 })
1684 .captures(v)
1685 .expect("No captures or no capture group")
1686 .get(1)
1687 .expect("No capture group").as_str()).expect("Invalid integer")
1688 }
1689 )]
1690 val: Integer,
1691 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
1692 _end: (),
1693 },
1694 Handle {
1695 #[rust_sitter::leaf(pattern = r#"<\s*const_tpl\s*type\s*=\s*"handle""#)]
1696 _start: (),
1697 #[rust_sitter::leaf(
1698 pattern = r#"val\s*=\s*"(-?[0-9]+)""#,
1699 transform = |v| {
1700 ConstantTemplateType::DEC_VAL_REGEX
1701 .get_or_init(|| {
1702 Regex::new(r#"val\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
1703 })
1704 .captures(v)
1705 .expect("No captures or no capture group")
1706 .get(1)
1707 .expect("No capture group").as_str().parse().expect("Invalid integer")
1708 }
1709 )]
1710 val: Integer,
1711 selector: ConstantTemplateSelector,
1712 #[rust_sitter::leaf(
1713 pattern = r#"plus\s*=\s*"0x([0-9a-fA-F]+)""#,
1714 transform = |v| {
1715 Integer::from_string_base(16, ConstantTemplateType::PLUS_REGEX
1716 .get_or_init(|| {
1717 Regex::new(r#"plus\s*=\s*"0x([0-9a-fA-F]+)""#)
1718 .expect("Invalid regular expression")
1719 })
1720 .captures(v)
1721 .expect("No captures or no capture group")
1722 .get(1)
1723 .expect("No capture group").as_str()).expect("Invalid integer")
1724 }
1725 )]
1726 plus: Option<Integer>,
1727 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
1728 _end: (),
1729 },
1730 Start {
1731 #[rust_sitter::leaf(pattern = r#"<\s*const_tpl\s*type\s*=\s*"start"\s*/\s*>"#)]
1732 _start: (),
1733 },
1734 End {
1735 #[rust_sitter::leaf(pattern = r#"<\s*const_tpl\s*type\s*=\s*"end"\s*/\s*>"#)]
1736 _end: (),
1737 },
1738 Next {
1739 #[rust_sitter::leaf(pattern = r#"<\s*const_tpl\s*type\s*=\s*"next"\s*/\s*>"#)]
1740 _next: (),
1741 },
1742 Next2 {
1743 #[rust_sitter::leaf(pattern = r#"<\s*const_tpl\s*type\s*=\s*"next2"\s*/\s*>"#)]
1744 _next2: (),
1745 },
1746 CurSpace {
1747 #[rust_sitter::leaf(pattern = r#"<\s*const_tpl\s*type\s*=\s*"curspace"\s*/\s*>"#)]
1748 _cur_space: (),
1749 },
1750 CurSpaceSize {
1751 #[rust_sitter::leaf(pattern = r#"<\s*const_tpl\s*type\s*=\s*"curspace_size"\s*/\s*>"#)]
1752 _cur_space_size: (),
1753 },
1754 SpaceId {
1755 #[rust_sitter::leaf(pattern = r#"<\s*const_tpl\s*type\s*=\s*"spaceid""#)]
1756 _start: (),
1757 #[rust_sitter::leaf(
1758 pattern = r#"name\s*=\s*"([^"]*)""#,
1759 transform = |v| {
1760 ConstantTemplateType::NAME_REGEX
1761 .get_or_init(|| {
1762 Regex::new(r#"name\s*=\s*"([^"]*)""#).expect("Invalid regular expression")
1763 })
1764 .captures(v)
1765 .expect("No captures or no capture group")
1766 .get(1)
1767 .expect("No capture group")
1768 .as_str()
1769 .to_string()
1770 .xml_unescape()
1771 }
1772 )]
1773 name: String,
1774 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
1775 _end: (),
1776 },
1777 JumpRelative {
1778 #[rust_sitter::leaf(pattern = r#"<\s*const_tpl\s*type\s*=\s*"relative""#)]
1779 _start: (),
1780 #[rust_sitter::leaf(
1781 pattern = r#"val\s*=\s*"0x([0-9a-fA-F]+)""#,
1782 transform = |v| {
1783 Integer::from_string_base(16, ConstantTemplateType::HEX_VAL_REGEX
1784 .get_or_init(|| {
1785 Regex::new(r#"val\s*=\s*"0x([0-9a-fA-F]+)""#)
1786 .expect("Invalid regular expression")
1787 })
1788 .captures(v)
1789 .expect("No captures or no capture group")
1790 .get(1)
1791 .expect("No capture group").as_str()).expect("Invalid integer")
1792 }
1793 )]
1794 val: Integer,
1795 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
1796 _end: (),
1797 },
1798 FlowRef {
1799 #[rust_sitter::leaf(pattern = r#"<\s*const_tpl\s*type\s*=\s*"flowref"\s*/\s*>"#)]
1800 _flow_ref: (),
1801 },
1802 FlowDest {
1803 #[rust_sitter::leaf(pattern = r#"<\s*const_tpl\s*type\s*=\s*"flowdest"\s*/\s*>"#)]
1804 _flow_dest: (),
1805 },
1806 FlowDestSize {
1807 #[rust_sitter::leaf(pattern = r#"<\s*const_tpl\s*type\s*=\s*"flowdest_size"\s*/\s*>"#)]
1808 _flow_dest_size: (),
1809 },
1810 }
1811
1812 #[derive(TypedBuilder, Debug, PartialEq)]
1813 pub struct HandleTemplate {
1814 #[rust_sitter::leaf(pattern = r#"<\s*handle_tpl\s*>"#)]
1815 #[builder(default, setter(skip))]
1816 _start: (),
1817 space: ConstantTemplateType,
1818 size: ConstantTemplateType,
1819 ptrspace: ConstantTemplateType,
1820 ptroffset: ConstantTemplateType,
1821 ptrsize: ConstantTemplateType,
1822 temp_space: ConstantTemplateType,
1823 temp_offset: ConstantTemplateType,
1824 #[rust_sitter::leaf(pattern = r#"<\s*/\s*handle_tpl\s*>"#)]
1825 #[builder(default, setter(skip))]
1826 _end: (),
1827 }
1828
1829 #[derive(TypedBuilder, Debug, PartialEq)]
1830 pub struct VarNodeTemplate {
1831 #[rust_sitter::leaf(pattern = r#"<\s*varnode_tpl\s*>"#)]
1832 #[builder(default, setter(skip))]
1833 _start: (),
1834 space: ConstantTemplateType,
1835 offset: ConstantTemplateType,
1836 size: ConstantTemplateType,
1837 #[rust_sitter::leaf(pattern = r#"<\s*/\s*varnode_tpl\s*>"#)]
1838 #[builder(default, setter(skip))]
1839 _end: (),
1840 }
1841
1842 #[derive(Debug, PartialEq)]
1843 pub enum OperationCode {
1844 Blank {
1845 #[rust_sitter::leaf(pattern = r#"BLANK"#)]
1846 _blank: (),
1847 },
1848 Copy {
1849 #[rust_sitter::leaf(pattern = r#"COPY"#)]
1850 _copy: (),
1851 },
1852 Load {
1853 #[rust_sitter::leaf(pattern = r#"LOAD"#)]
1854 _load: (),
1855 },
1856 Store {
1857 #[rust_sitter::leaf(pattern = r#"STORE"#)]
1858 _store: (),
1859 },
1860 Branch {
1861 #[rust_sitter::leaf(pattern = r#"BRANCH"#)]
1862 _branch: (),
1863 },
1864 ConditionalBranch {
1865 #[rust_sitter::leaf(pattern = r#"CBRANCH"#)]
1866 _cbranch: (),
1867 },
1868 BranchIndirect {
1869 #[rust_sitter::leaf(pattern = r#"BRANCHIND"#)]
1870 _branchind: (),
1871 },
1872 Call {
1873 #[rust_sitter::leaf(pattern = r#"CALL"#)]
1874 _call: (),
1875 },
1876 CallIndirect {
1877 #[rust_sitter::leaf(pattern = r#"CALLIND"#)]
1878 _callind: (),
1879 },
1880 CallOther {
1881 #[rust_sitter::leaf(pattern = r#"CALLOTHER"#)]
1882 _callother: (),
1883 },
1884 Return {
1885 #[rust_sitter::leaf(pattern = r#"RETURN"#)]
1886 _return: (),
1887 },
1888 IntegerEqual {
1889 #[rust_sitter::leaf(pattern = r#"INT_EQUAL"#)]
1890 _int_equal: (),
1891 },
1892 IntegerNotEqual {
1893 #[rust_sitter::leaf(pattern = r#"INT_NOTEQUAL"#)]
1894 _int_notequal: (),
1895 },
1896 IntegerSignedLessThan {
1897 #[rust_sitter::leaf(pattern = r#"INT_SLESS"#)]
1898 _int_sless: (),
1899 },
1900 IntegerSignedLessThanOrEqual {
1901 #[rust_sitter::leaf(pattern = r#"INT_SLESSEQUAL"#)]
1902 _int_slessequal: (),
1903 },
1904 IntegerUnsignedLessThan {
1905 #[rust_sitter::leaf(pattern = r#"INT_LESS"#)]
1906 _int_less: (),
1907 },
1908 IntegerUnsignedLessThanOrEqual {
1909 #[rust_sitter::leaf(pattern = r#"INT_LESSEQUAL"#)]
1910 _int_lessequal: (),
1911 },
1912 IntegerZeroExtend {
1913 #[rust_sitter::leaf(pattern = r#"INT_ZEXT"#)]
1914 _int_zext: (),
1915 },
1916 IntegerSignExtend {
1917 #[rust_sitter::leaf(pattern = r#"INT_SEXT"#)]
1918 _int_sext: (),
1919 },
1920 IntegerAdd {
1921 #[rust_sitter::leaf(pattern = r#"INT_ADD"#)]
1922 _int_add: (),
1923 },
1924 IntegerSubtract {
1925 #[rust_sitter::leaf(pattern = r#"INT_SUB"#)]
1926 _int_sub: (),
1927 },
1928 IntegerCarry {
1929 #[rust_sitter::leaf(pattern = r#"INT_CARRY"#)]
1930 _int_carry: (),
1931 },
1932 IntegerSignedCarry {
1933 #[rust_sitter::leaf(pattern = r#"INT_SCARRY"#)]
1934 _int_scarry: (),
1935 },
1936 IntegerSignedBorrow {
1937 #[rust_sitter::leaf(pattern = r#"INT_SBORROW"#)]
1938 _int_sborrow: (),
1939 },
1940 IntegerTwosCompliment {
1941 #[rust_sitter::leaf(pattern = r#"INT_2COMP"#)]
1942 _int_2comp: (),
1943 },
1944 IntegerNegate {
1945 #[rust_sitter::leaf(pattern = r#"INT_NEGATE"#)]
1946 _int_negate: (),
1947 },
1948 IntegerXor {
1949 #[rust_sitter::leaf(pattern = r#"INT_XOR"#)]
1950 _int_xor: (),
1951 },
1952 IntegerAnd {
1953 #[rust_sitter::leaf(pattern = r#"INT_AND"#)]
1954 _int_and: (),
1955 },
1956 IntegerOr {
1957 #[rust_sitter::leaf(pattern = r#"INT_OR"#)]
1958 _int_or: (),
1959 },
1960 IntegerLeftShift {
1961 #[rust_sitter::leaf(pattern = r#"INT_LEFT"#)]
1962 _int_left: (),
1963 },
1964 IntegerRightShift {
1965 #[rust_sitter::leaf(pattern = r#"INT_RIGHT"#)]
1966 _int_right: (),
1967 },
1968 IntegerSignedRightShift {
1969 #[rust_sitter::leaf(pattern = r#"INT_SRIGHT"#)]
1970 _int_sright: (),
1971 },
1972 IntegerMultiply {
1973 #[rust_sitter::leaf(pattern = r#"INT_MULT"#)]
1974 _int_mult: (),
1975 },
1976 IntegerDivide {
1977 #[rust_sitter::leaf(pattern = r#"INT_DIV"#)]
1978 _int_div: (),
1979 },
1980 IntegerSignedDivide {
1981 #[rust_sitter::leaf(pattern = r#"INT_SDIV"#)]
1982 _int_sdiv: (),
1983 },
1984 IntegerRemainder {
1985 #[rust_sitter::leaf(pattern = r#"INT_REM"#)]
1986 _int_rem: (),
1987 },
1988 IntegerSignedRemainder {
1989 #[rust_sitter::leaf(pattern = r#"INT_SREM"#)]
1990 _int_srem: (),
1991 },
1992 BooleanNegate {
1993 #[rust_sitter::leaf(pattern = r#"BOOL_NEGATE"#)]
1994 _bool_negate: (),
1995 },
1996 BooleanXor {
1997 #[rust_sitter::leaf(pattern = r#"BOOL_XOR"#)]
1998 _bool_xor: (),
1999 },
2000 BooleanAnd {
2001 #[rust_sitter::leaf(pattern = r#"BOOL_AND"#)]
2002 _bool_and: (),
2003 },
2004 BooleanOr {
2005 #[rust_sitter::leaf(pattern = r#"BOOL_OR"#)]
2006 _bool_or: (),
2007 },
2008 FloatEqual {
2009 #[rust_sitter::leaf(pattern = r#"FLOAT_EQUAL"#)]
2010 _float_equal: (),
2011 },
2012 FloatNotEqual {
2013 #[rust_sitter::leaf(pattern = r#"FLOAT_NOTEQUAL"#)]
2014 _float_notequal: (),
2015 },
2016 FloatLessThan {
2017 #[rust_sitter::leaf(pattern = r#"FLOAT_LESS"#)]
2018 _float_less: (),
2019 },
2020 FloatLessThanOrEqual {
2021 #[rust_sitter::leaf(pattern = r#"FLOAT_LESSEQUAL"#)]
2022 _float_lessequal: (),
2023 },
2024 Unused1 {
2025 #[rust_sitter::leaf(pattern = r#"UNUSED1"#)]
2026 _unused1: (),
2027 },
2028 FloatNotANumber {
2029 #[rust_sitter::leaf(pattern = r#"FLOAT_NAN"#)]
2030 _float_nan: (),
2031 },
2032 FloatAdd {
2033 #[rust_sitter::leaf(pattern = r#"FLOAT_ADD"#)]
2034 _float_add: (),
2035 },
2036 FloatDivide {
2037 #[rust_sitter::leaf(pattern = r#"FLOAT_DIV"#)]
2038 _float_div: (),
2039 },
2040 FloatMultiply {
2041 #[rust_sitter::leaf(pattern = r#"FLOAT_MULT"#)]
2042 _float_mult: (),
2043 },
2044 FloatSubtract {
2045 #[rust_sitter::leaf(pattern = r#"FLOAT_SUB"#)]
2046 _float_sub: (),
2047 },
2048 FloatNegate {
2049 #[rust_sitter::leaf(pattern = r#"FLOAT_NEG"#)]
2050 _float_neg: (),
2051 },
2052 FloatAbsoluteValue {
2053 #[rust_sitter::leaf(pattern = r#"FLOAT_ABS"#)]
2054 _float_abs: (),
2055 },
2056 FloatSquareRoot {
2057 #[rust_sitter::leaf(pattern = r#"FLOAT_SQRT"#)]
2058 _float_sqrt: (),
2059 },
2060 IntegerToFloat {
2061 #[rust_sitter::leaf(pattern = r#"INT2FLOAT"#)]
2062 _int2float: (),
2063 },
2064 FloatToFloat {
2065 #[rust_sitter::leaf(pattern = r#"FLOAT2FLOAT"#)]
2066 _float2float: (),
2067 },
2068 Truncate {
2069 #[rust_sitter::leaf(pattern = r#"TRUNC"#)]
2070 _trunc: (),
2071 },
2072 Ceiling {
2073 #[rust_sitter::leaf(pattern = r#"CEIL"#)]
2074 _ceil: (),
2075 },
2076 Floor {
2077 #[rust_sitter::leaf(pattern = r#"FLOOR"#)]
2078 _floor: (),
2079 },
2080 Round {
2081 #[rust_sitter::leaf(pattern = r#"ROUND"#)]
2082 _round: (),
2083 },
2084 Build {
2085 #[rust_sitter::leaf(pattern = r#"BUILD"#)]
2086 _build: (),
2087 },
2088 DelaySlot {
2089 #[rust_sitter::leaf(pattern = r#"DELAY_SLOT"#)]
2090 _delay_slot: (),
2091 },
2092 Piece {
2093 #[rust_sitter::leaf(pattern = r#"PIECE"#)]
2094 _piece: (),
2095 },
2096 Subpiece {
2097 #[rust_sitter::leaf(pattern = r#"SUBPIECE"#)]
2098 _subpiece: (),
2099 },
2100 Cast {
2101 #[rust_sitter::leaf(pattern = r#"CAST"#)]
2102 _cast: (),
2103 },
2104 Label {
2105 #[rust_sitter::leaf(pattern = r#"LABEL"#)]
2106 _label: (),
2107 },
2108 CrossBuild {
2109 #[rust_sitter::leaf(pattern = r#"CROSSBUILD"#)]
2110 _crossbuild: (),
2111 },
2112 SegmentOp {
2113 #[rust_sitter::leaf(pattern = r#"SEGMENTOP"#)]
2114 _segmentop: (),
2115 },
2116 CpoolRef {
2117 #[rust_sitter::leaf(pattern = r#"CPOOLREF"#)]
2118 _cpoolref: (),
2119 },
2120 New {
2121 #[rust_sitter::leaf(pattern = r#"NEW"#)]
2122 _new: (),
2123 },
2124 Insert {
2125 #[rust_sitter::leaf(pattern = r#"INSERT"#)]
2126 _insert: (),
2127 },
2128 Extract {
2129 #[rust_sitter::leaf(pattern = r#"EXTRACT"#)]
2130 _extract: (),
2131 },
2132 PopCount {
2133 #[rust_sitter::leaf(pattern = r#"POPCOUNT"#)]
2134 _popcount: (),
2135 },
2136 LzCount {
2137 #[rust_sitter::leaf(pattern = r#"LZCOUNT"#)]
2138 _lzcnt: (),
2139 },
2140 }
2141
2142 #[derive(Debug, PartialEq)]
2143 pub enum OperationTemplateOutput {
2144 Null {
2145 #[rust_sitter::leaf(pattern = r#"<\s*null\s*/\s*>"#)]
2146 _null: (),
2147 },
2148 Output(VarNodeTemplate),
2149 }
2150
2151 #[derive(TypedBuilder, Debug, PartialEq)]
2152 pub struct OperationTemplate {
2153 #[rust_sitter::leaf(pattern = r#"<\s*op_tpl"#)]
2154 #[builder(default, setter(skip))]
2155 _start: (),
2156 #[rust_sitter::leaf(pattern = r#"code\s*=\s*""#)]
2157 #[builder(default, setter(skip))]
2158 _code_pre: (),
2159 code: OperationCode,
2160 #[rust_sitter::leaf(pattern = r#""\s*>"#)]
2161 #[builder(default, setter(skip))]
2162 _close: (),
2163 output: OperationTemplateOutput,
2164 input: Vec<VarNodeTemplate>,
2165 #[rust_sitter::leaf(pattern = r#"<\s*/\s*op_tpl\s*>"#)]
2166 #[builder(default, setter(skip))]
2167 _end: (),
2168 }
2169
2170 impl ConstructorTemplate {
2171 const SECTION_REGEX: OnceCell<Regex> = OnceCell::new();
2173 const DELAY_REGEX: OnceCell<Regex> = OnceCell::new();
2175 const NUMLABELS_REGEX: OnceCell<Regex> = OnceCell::new();
2177 }
2178
2179 #[derive(Debug, PartialEq)]
2180 pub enum ConstructorTemplateResult {
2181 Null {
2182 #[rust_sitter::leaf(pattern = r#"<\s*null\s*/\s*>"#)]
2183 _null: (),
2184 },
2185 Result(HandleTemplate),
2186 }
2187
2188 #[derive(TypedBuilder, Debug, PartialEq)]
2189 pub struct ConstructorTemplate {
2190 #[rust_sitter::leaf(pattern = r#"<\s*construct_tpl"#)]
2191 #[builder(default, setter(skip))]
2192 _start: (),
2193 #[rust_sitter::leaf(
2194 pattern = r#"section\s*=\s*"(-?[0-9]+)""#,
2195 transform = |v| {
2196 ConstructorTemplate::SECTION_REGEX
2197 .get_or_init(|| {
2198 Regex::new(r#"section\s*=\s*"(-?[0-9]+)""#)
2199 .expect("Invalid regular expression")
2200 })
2201 .captures(v)
2202 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
2203 }
2204 )]
2205 #[builder(setter(transform = |v: impl Into<Integer>| {
2206 Some(v.into())
2207 }))]
2208 section: Option<Integer>,
2209 #[rust_sitter::leaf(
2210 pattern = r#"delay\s*=\s*"(-?[0-9]+)""#,
2211 transform = |v| {
2212 ConstructorTemplate::DELAY_REGEX
2213 .get_or_init(|| {
2214 Regex::new(r#"delay\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
2215 })
2216 .captures(v)
2217 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
2218 }
2219 )]
2220 #[builder(setter(transform = |v: impl Into<Integer>| {
2221 Some(v.into())
2222 }))]
2223 delay: Option<Integer>,
2224 #[rust_sitter::leaf(
2225 pattern = r#"labels\s*=\s*"(-?[0-9]+)""#,
2226 transform = |v| {
2227 ConstructorTemplate::NUMLABELS_REGEX
2228 .get_or_init(|| {
2229 Regex::new(r#"labels\s*=\s*"(-?[0-9]+)""#)
2230 .expect("Invalid regular expression")
2231 })
2232 .captures(v)
2233 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
2234 }
2235 )]
2236 #[builder(setter(transform = |v: impl Into<Integer>| {
2237 Some(v.into())
2238 }))]
2239 numlabels: Option<Integer>,
2240 #[rust_sitter::leaf(pattern = r#">"#)]
2241 #[builder(default, setter(skip))]
2242 _close: (),
2243 result: ConstructorTemplateResult,
2244 vec: Vec<OperationTemplate>,
2245 #[rust_sitter::leaf(pattern = r#"<\s*/\s*construct_tpl\s*>"#)]
2246 #[builder(default, setter(skip))]
2247 _end: (),
2248 }
2249
2250 impl Constructor {
2251 const PARENT_REGEX: OnceCell<Regex> = OnceCell::new();
2253 const FIRST_REGEX: OnceCell<Regex> = OnceCell::new();
2255 const LENGTH_REGEX: OnceCell<Regex> = OnceCell::new();
2257 const LINE_REGEX: OnceCell<Regex> = OnceCell::new();
2259 }
2260
2261 #[derive(TypedBuilder, Debug, PartialEq)]
2262 #[rust_sitter::prec_left(1)]
2263 pub struct Constructor {
2264 #[rust_sitter::leaf(pattern = r#"<\s*constructor"#)]
2265 #[builder(default, setter(skip))]
2266 _start: (),
2267 #[rust_sitter::leaf(
2268 pattern = r#"parent\s*=\s*"0x([0-9a-fA-F]+)""#,
2269 transform = |v| {
2270 Integer::from_string_base(16, Constructor::PARENT_REGEX
2271 .get_or_init(|| {
2272 Regex::new(r#"parent\s*=\s*"0x([0-9a-fA-F]+)""#)
2273 .expect("Invalid regular expression")
2274 })
2275 .captures(v)
2276 .expect("No captures or no capture group")
2277 .get(1)
2278 .expect("No capture group").as_str()).expect("Invalid integer")
2279 }
2280 )]
2281 #[builder(setter(transform = |v: impl Into<Integer>| {
2282 v.into()
2283 }))]
2284 parent: Integer,
2285 #[rust_sitter::leaf(
2286 pattern = r#"first\s*=\s*"(-?[0-9]+)""#,
2287 transform = |v| {
2288 Constructor::FIRST_REGEX
2289 .get_or_init(|| {
2290 Regex::new(r#"first\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
2291 })
2292 .captures(v)
2293 .expect("No captures or no capture group")
2294 .get(1)
2295 .expect("No capture group").as_str().parse().expect("Invalid integer")
2296 }
2297 )]
2298 #[builder(setter(transform = |v: impl Into<Integer>| {
2299 v.into()
2300 }))]
2301 first: Integer,
2302 #[rust_sitter::leaf(
2303 pattern = r#"length\s*=\s*"(-?[0-9]+)""#,
2304 transform = |v| {
2305 Constructor::LENGTH_REGEX
2306 .get_or_init(|| {
2307 Regex::new(r#"length\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
2308 })
2309 .captures(v)
2310 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
2311 }
2312 )]
2313 #[builder(setter(transform = |v: impl Into<Integer>| {
2314 v.into()
2315 }))]
2316 length: Integer,
2317 #[rust_sitter::leaf(
2318 pattern = r#"line\s*=\s*"(-?[0-9]+):(-?[0-9]+)""#,
2319 transform = |v| {
2320 let captures = Constructor::LINE_REGEX
2321 .get_or_init(|| {
2322 Regex::new(r#"line\s*=\s*"(-?[0-9]+):(-?[0-9]+)""#)
2323 .expect("Invalid regular expression")
2324 })
2325 .captures(v)
2326 .expect("No captures or no capture group");
2327 let line = captures.get(1).expect("No capture group").as_str().parse().expect("Invalid integer");
2328 let col = captures.get(2).expect("No capture group").as_str().parse().expect("Invalid integer");
2329 (line, col)
2330 }
2331 )]
2332 #[builder(setter(transform = |v: impl Into<(Integer, Integer)>| {
2333 let (line, col) = v.into();
2334 (line, col)
2335 }))]
2336 line: (Integer, Integer),
2337 #[rust_sitter::leaf(pattern = r#">"#)]
2338 #[builder(default, setter(skip))]
2339 _close: (),
2340 operands: Vec<ConstructorOperand>,
2341 printpiece: Vec<PrintPieceType>,
2342 contexts: Vec<ContextChangeType>,
2343 templ: Option<ConstructorTemplate>,
2344 namedtempl: Vec<ConstructorTemplate>,
2345 #[rust_sitter::leaf(pattern = r#"<\s*/\s*constructor\s*>"#)]
2346 #[builder(default, setter(skip))]
2347 _end: (),
2348 }
2349
2350 impl PatternBlockWord {
2351 const MASK_REGEX: OnceCell<Regex> = OnceCell::new();
2353 const VAL_REGEX: OnceCell<Regex> = OnceCell::new();
2354 }
2355
2356 #[derive(TypedBuilder, Debug, PartialEq)]
2357 pub struct PatternBlockWord {
2358 #[rust_sitter::leaf(pattern = r#"<\s*mask_word"#)]
2359 #[builder(default, setter(skip))]
2360 _start: (),
2361 #[rust_sitter::leaf(
2362 pattern = r#"mask\s*=\s*"0x([0-9a-fA-F]+)""#,
2363 transform = |v| {
2364 Integer::from_string_base(16, PatternBlockWord::MASK_REGEX
2365 .get_or_init(|| {
2366 Regex::new(r#"mask\s*=\s*"0x([0-9a-fA-F]+)""#)
2367 .expect("Invalid regular expression")
2368 })
2369 .captures(v)
2370 .expect("No captures or no capture group")
2371 .get(1)
2372 .expect("No capture group").as_str()).expect("Invalid integer")
2373 }
2374 )]
2375 #[builder(setter(transform = |v: impl Into<Integer>| {
2376 v.into()
2377 }))]
2378 mask: Integer,
2379 #[rust_sitter::leaf(
2380 pattern = r#"val\s*=\s*"0x([0-9a-fA-F]+)""#,
2381 transform = |v| {
2382 Integer::from_string_base(16, PatternBlockWord::VAL_REGEX
2383 .get_or_init(|| {
2384 Regex::new(r#"val\s*=\s*"0x([0-9a-fA-F]+)""#)
2385 .expect("Invalid regular expression")
2386 })
2387 .captures(v)
2388 .expect("No captures or no capture group")
2389 .get(1)
2390 .expect("No capture group").as_str()).expect("Invalid integer")
2391 }
2392 )]
2393 #[builder(setter(transform = |v: impl Into<Integer>| {
2394 v.into()
2395 }))]
2396 val: Integer,
2397 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
2398 #[builder(default, setter(skip))]
2399 _end: (),
2400 }
2401
2402 impl PatternBlock {
2403 const OFFSET_REGEX: OnceCell<Regex> = OnceCell::new();
2405 const NONZERO_REGEX: OnceCell<Regex> = OnceCell::new();
2407 }
2408
2409 #[derive(TypedBuilder, Debug, PartialEq)]
2410 pub struct PatternBlock {
2411 #[rust_sitter::leaf(pattern = r#"<\s*pat_block"#)]
2412 #[builder(default, setter(skip))]
2413 _start: (),
2414 #[rust_sitter::leaf(
2415 pattern = r#"offset\s*=\s*"(-?[0-9]+)""#,
2416 transform = |v| {
2417 PatternBlock::OFFSET_REGEX
2418 .get_or_init(|| {
2419 Regex::new(r#"offset\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
2420 })
2421 .captures(v)
2422 .expect("No captures or no capture group")
2423 .get(1)
2424 .expect("No capture group").as_str().parse().expect("Invalid integer")
2425 }
2426 )]
2427 #[builder(setter(transform = |v: impl Into<Integer>| {
2428 v.into()
2429 }))]
2430 offset: Integer,
2431 #[rust_sitter::leaf(
2432 pattern = r#"nonzero\s*=\s*"(-?[0-9]+)""#,
2433 transform = |v| {
2434 PatternBlock::NONZERO_REGEX
2435 .get_or_init(|| {
2436 Regex::new(r#"nonzero\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
2437 })
2438 .captures(v)
2439 .expect("No captures or no capture group")
2440 .get(1)
2441 .expect("No capture group").as_str().parse().expect("Invalid integer")
2442 }
2443 )]
2444 #[builder(setter(transform = |v: impl Into<Integer>| {
2445 v.into()
2446 }))]
2447 nonzero: Integer,
2448 #[rust_sitter::leaf(pattern = r#">"#)]
2449 #[builder(default, setter(skip))]
2450 _close: (),
2451 mask_vals: Vec<PatternBlockWord>,
2452 #[rust_sitter::leaf(pattern = r#"<\s*/\s*pat_block\s*>"#)]
2453 #[builder(default, setter(skip))]
2454 _end: (),
2455 }
2456
2457 #[derive(TypedBuilder, Debug, PartialEq)]
2458 pub struct InstructionPattern {
2459 #[rust_sitter::leaf(pattern = r#"<\s*instruct_pat\s*>"#)]
2460 #[builder(default, setter(skip))]
2461 _start: (),
2462 mask_value: PatternBlock,
2463 #[rust_sitter::leaf(pattern = r#"<\s*/\s*instruct_pat\s*>"#)]
2464 #[builder(default, setter(skip))]
2465 _end: (),
2466 }
2467
2468 #[derive(TypedBuilder, Debug, PartialEq)]
2469 pub struct ContextPattern {
2470 #[rust_sitter::leaf(pattern = r#"<\s*context_pat\s*>"#)]
2471 #[builder(default, setter(skip))]
2472 _start: (),
2473 mask_value: PatternBlock,
2474 #[rust_sitter::leaf(pattern = r#"<\s*/\s*context_pat\s*>"#)]
2475 #[builder(default, setter(skip))]
2476 _end: (),
2477 }
2478
2479 #[derive(TypedBuilder, Debug, PartialEq)]
2480 pub struct CombinePattern {
2481 #[rust_sitter::leaf(pattern = r#"<\s*combine_pat\s*>"#)]
2482 #[builder(default, setter(skip))]
2483 _start: (),
2484 context: ContextPattern,
2485 instr: InstructionPattern,
2486 #[rust_sitter::leaf(pattern = r#"<\s*/\s*combine_pat\s*>"#)]
2487 #[builder(default, setter(skip))]
2488 _end: (),
2489 }
2490
2491 #[derive(Debug, PartialEq)]
2492 pub enum DisjointPatternType {
2493 Instruction(InstructionPattern),
2494 Context(ContextPattern),
2495 Combine(CombinePattern),
2496 }
2497
2498 impl DecisionNodePair {
2499 const ID_REGEX: OnceCell<Regex> = OnceCell::new();
2501 }
2502
2503 #[derive(TypedBuilder, Debug, PartialEq)]
2504 pub struct DecisionNodePair {
2505 #[rust_sitter::leaf(pattern = r#"<\s*pair"#)]
2506 #[builder(default, setter(skip))]
2507 _start: (),
2508 #[rust_sitter::leaf(
2509 pattern = r#"id\s*=\s*"(-?[0-9]+)""#,
2510 transform = |v| {
2511 DecisionNodePair::ID_REGEX
2512 .get_or_init(|| {
2513 Regex::new(r#"id\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
2514 })
2515 .captures(v)
2516 .expect("No captures or no capture group")
2517 .get(1)
2518 .expect("No capture group").as_str().parse().expect("Invalid integer")
2519 }
2520 )]
2521 #[builder(setter(transform = |v: impl Into<Integer>| {
2522 v.into()
2523 }))]
2524 id: Integer,
2525 #[rust_sitter::leaf(pattern = r#">"#)]
2526 #[builder(default, setter(skip))]
2527 _close: (),
2528 pattern: DisjointPatternType,
2529 #[rust_sitter::leaf(pattern = r#"<\s*/\s*pair\s*>"#)]
2530 #[builder(default, setter(skip))]
2531 _end: (),
2532 }
2533
2534 impl DecisionNode {
2535 const NUMBER_REGEX: OnceCell<Regex> = OnceCell::new();
2537 const CONTEXT_REGEX: OnceCell<Regex> = OnceCell::new();
2539 const START_REGEX: OnceCell<Regex> = OnceCell::new();
2541 const SIZE_REGEX: OnceCell<Regex> = OnceCell::new();
2543 }
2544
2545 #[derive(TypedBuilder, Debug, PartialEq)]
2546 pub struct DecisionNode {
2547 #[rust_sitter::leaf(pattern = r#"<\s*decision"#)]
2548 #[builder(default, setter(skip))]
2549 _start: (),
2550 #[rust_sitter::leaf(
2551 pattern = r#"number\s*=\s*"(-?[0-9]+)""#,
2552 transform = |v| {
2553 DecisionNode::NUMBER_REGEX
2554 .get_or_init(|| {
2555 Regex::new(r#"number\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
2556 })
2557 .captures(v)
2558 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
2559 }
2560 )]
2561 #[builder(setter(transform = |v: impl Into<Integer>| {
2562 v.into()
2563 }))]
2564 number: Integer,
2565 #[rust_sitter::leaf(
2566 pattern = r#"context\s*=\s*"([a-z]+)""#,
2567 transform = |v| {
2568 DecisionNode::CONTEXT_REGEX
2569 .get_or_init(|| {
2570 Regex::new(r#"context\s*=\s*"([a-z]+)""#).expect("Invalid regular expression")
2571 })
2572 .captures(v)
2573 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid boolean")
2574 }
2575 )]
2576 context: bool,
2577 #[rust_sitter::leaf(
2578 pattern = r#"start\s*=\s*"(-?[0-9]+)""#,
2579 transform = |v| {
2580 DecisionNode::START_REGEX
2581 .get_or_init(|| {
2582 Regex::new(r#"start\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
2583 })
2584 .captures(v)
2585 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
2586 }
2587 )]
2588 #[builder(setter(transform = |v: impl Into<Integer>| {
2589 v.into()
2590 }))]
2591 start: Integer,
2592 #[rust_sitter::leaf(
2593 pattern = r#"size\s*=\s*"(-?[0-9]+)""#,
2594 transform = |v| {
2595 DecisionNode::SIZE_REGEX
2596 .get_or_init(|| {
2597 Regex::new(r#"size\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
2598 })
2599 .captures(v)
2600 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
2601 }
2602 )]
2603 #[builder(setter(transform = |v: impl Into<Integer>| {
2604 v.into()
2605 }))]
2606 bitsize: Integer,
2607 #[rust_sitter::leaf(pattern = r#">"#)]
2608 #[builder(default, setter(skip))]
2609 _close: (),
2610 pairs: Vec<DecisionNodePair>,
2611 children: Vec<DecisionNode>,
2612 #[rust_sitter::leaf(pattern = r#"<\s*/\s*decision\s*>"#)]
2613 #[builder(default, setter(skip))]
2614 _end: (),
2615 }
2616
2617 impl SubtableSymbol {
2618 const NUMCT_REGEX: OnceCell<Regex> = OnceCell::new();
2619 }
2620
2621 #[derive(TypedBuilder, Debug, PartialEq)]
2622 pub struct SubtableSymbol {
2623 header: SymbolHeader,
2624 #[rust_sitter::leaf(
2625 pattern = r#"numct\s*=\s*"(-?[0-9]+)""#,
2626 transform = |v| {
2627 SubtableSymbol::NUMCT_REGEX
2628 .get_or_init(|| {
2629 Regex::new(r#"numct\s*=\s*"(-?[0-9]+)""#)
2630 .expect("Invalid regular expression")
2631 })
2632 .captures(v)
2633 .expect("No captures or no capture group")
2634 .get(1)
2635 .expect("No capture group").as_str().parse().expect("Invalid integer")
2636 }
2637 )]
2638 #[builder(setter(transform = |v: impl Into<Integer>| {
2639 v.into()
2640 }))]
2641 numct: Integer,
2642 #[rust_sitter::leaf(pattern = r#">"#)]
2643 #[builder(default, setter(skip))]
2644 _close: (),
2645 constructors: Vec<Constructor>,
2646 decisiontree: DecisionNode,
2647 }
2648
2649 impl ValueTableValue {
2650 const VAL_REGEX: OnceCell<Regex> = OnceCell::new();
2652 }
2653
2654 #[derive(TypedBuilder, Debug, PartialEq)]
2655 pub struct ValueTableValue {
2656 #[rust_sitter::leaf(pattern = r#"<\s*valuetab"#)]
2657 #[builder(default, setter(skip))]
2658 _start: (),
2659 #[rust_sitter::leaf(
2660 pattern = r#"val\s*=\s*"(-?[0-9]+)""#,
2661 transform = |v| {
2662 ValueTableValue::VAL_REGEX
2663 .get_or_init(|| {
2664 Regex::new(r#"val\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
2665 })
2666 .captures(v)
2667 .expect("No captures or no capture group")
2668 .get(1)
2669 .expect("No capture group").as_str().parse().expect("Invalid integer")
2670 }
2671 )]
2672 #[builder(setter(transform = |v: impl Into<Integer>| {
2673 v.into()
2674 }))]
2675 val: Integer,
2676 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
2677 #[builder(default, setter(skip))]
2678 _end: (),
2679 }
2680
2681 #[derive(TypedBuilder, Debug, PartialEq)]
2682 pub struct ValueMapSymbol {
2683 #[rust_sitter::leaf(pattern = r#"<\s*valuemap_sym"#)]
2684 #[builder(default, setter(skip))]
2685 _start: (),
2686 header: SymbolHeader,
2687 #[rust_sitter::leaf(pattern = r#">"#)]
2688 #[builder(default, setter(skip))]
2689 _close: (),
2690 patval: PatternValueType,
2691 valuetable: Vec<ValueTableValue>,
2692 #[rust_sitter::leaf(pattern = r#"<\s*/\s*valuemap_sym\s*>"#)]
2693 #[builder(default, setter(skip))]
2694 _end: (),
2695 }
2696
2697 impl NameTableValue {
2698 const NAME_REGEX: OnceCell<Regex> = OnceCell::new();
2699 }
2700
2701 #[derive(TypedBuilder, Debug, PartialEq)]
2702 pub struct NameTableValue {
2703 #[rust_sitter::leaf(pattern = r#"<\s*nametab"#)]
2704 #[builder(default, setter(skip))]
2705 _start: (),
2706 #[rust_sitter::leaf(
2707 pattern = r#"name\s*=\s*"([^"]*)""#,
2708 transform = |v| {
2709 NameTableValue::NAME_REGEX
2710 .get_or_init(|| {
2711 Regex::new(r#"name\s*=\s*"([^"]*)""#).expect("Invalid regular expression")
2712 })
2713 .captures(v)
2714 .expect("No captures or no capture group")
2715 .get(1)
2716 .expect("No capture group")
2717 .as_str()
2718 .to_string()
2719 .xml_unescape()
2720 }
2721 )]
2722 #[builder(setter(transform = |v: impl Into<String>| {
2723 Some(v.into())
2724 }))]
2725 name: Option<String>,
2726 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
2727 #[builder(default, setter(skip))]
2728 _end: (),
2729 }
2730
2731 #[derive(TypedBuilder, Debug, PartialEq)]
2732 pub struct NameSymbol {
2733 #[rust_sitter::leaf(pattern = r#"<\s*name_sym"#)]
2734 #[builder(default, setter(skip))]
2735 _start: (),
2736 header: SymbolHeader,
2737 #[rust_sitter::leaf(pattern = r#">"#)]
2738 #[builder(default, setter(skip))]
2739 _close: (),
2740 patval: PatternValueType,
2741 nametable: Vec<NameTableValue>,
2742 #[rust_sitter::leaf(pattern = r#"<\s*/\s*name_sym\s*>"#)]
2743 #[builder(default, setter(skip))]
2744 _end: (),
2745 }
2746
2747 impl ContextSymbol {
2748 const VARNODE_REGEX: OnceCell<Regex> = OnceCell::new();
2750 const LOW_REGEX: OnceCell<Regex> = OnceCell::new();
2752 const HIGH_REGEX: OnceCell<Regex> = OnceCell::new();
2754 const FLOW_REGEX: OnceCell<Regex> = OnceCell::new();
2756 }
2757
2758 #[derive(TypedBuilder, Debug, PartialEq)]
2759 pub struct ContextSymbol {
2760 #[rust_sitter::leaf(pattern = r#"<\s*context_sym"#)]
2761 #[builder(default, setter(skip))]
2762 _start: (),
2763 header: SymbolHeader,
2764 #[rust_sitter::leaf(
2765 pattern = r#"varnode\s*=\s*"0x([0-9a-fA-F]+)""#,
2766 transform = |v| {
2767 Integer::from_string_base(16, ContextSymbol::VARNODE_REGEX
2768 .get_or_init(|| {
2769 Regex::new(r#"varnode\s*=\s*"0x([0-9a-fA-F]+)""#)
2770 .expect("Invalid regular expression")
2771 })
2772 .captures(v)
2773 .expect("No captures or no capture group")
2774 .get(1)
2775 .expect("No capture group").as_str()).expect("Invalid integer")
2776 }
2777 )]
2778 #[builder(setter(transform = |v: impl Into<Integer>| {
2779 v.into()
2780 }))]
2781 varnode: Integer,
2782 #[rust_sitter::leaf(
2783 pattern = r#"low\s*=\s*"(-?[0-9]+)""#,
2784 transform = |v| {
2785 ContextSymbol::LOW_REGEX
2786 .get_or_init(|| {
2787 Regex::new(r#"low\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
2788 })
2789 .captures(v)
2790 .expect("No captures or no capture group")
2791 .get(1)
2792 .expect("No capture group").as_str().parse().expect("Invalid integer")
2793 }
2794 )]
2795 #[builder(setter(transform = |v: impl Into<Integer>| {
2796 v.into()
2797 }))]
2798 low: Integer,
2799 #[rust_sitter::leaf(
2800 pattern = r#"high\s*=\s*"(-?[0-9]+)""#,
2801 transform = |v| {
2802 ContextSymbol::HIGH_REGEX
2803 .get_or_init(|| {
2804 Regex::new(r#"high\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
2805 })
2806 .captures(v)
2807 .expect("No captures or no capture group")
2808 .get(1)
2809 .expect("No capture group").as_str().parse().expect("Invalid integer")
2810 }
2811 )]
2812 #[builder(setter(transform = |v: impl Into<Integer>| {
2813 v.into()
2814 }))]
2815 high: Integer,
2816 #[rust_sitter::leaf(
2817 pattern = r#"flow\s*=\s*"([a-z]+)""#,
2818 transform = |v| {
2819 ContextSymbol::FLOW_REGEX
2820 .get_or_init(|| {
2821 Regex::new(r#"flow\s*=\s*"([a-z]+)""#).expect("Invalid regular expression")
2822 })
2823 .captures(v)
2824 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid boolean")
2825 }
2826 )]
2827 flow: bool,
2828 #[rust_sitter::leaf(pattern = r#">"#)]
2829 #[builder(default, setter(skip))]
2830 _close: (),
2831 patval: PatternValueType,
2832 #[rust_sitter::leaf(pattern = r#"<\s*/\s*context_sym\s*>"#)]
2833 #[builder(default, setter(skip))]
2834 _end: (),
2835 }
2836
2837 impl VarNodeTableValue {
2838 const ID_REGEX: OnceCell<Regex> = OnceCell::new();
2840 }
2841
2842 #[derive(TypedBuilder, Debug, PartialEq)]
2843 pub struct VarNodeTableValue {
2844 #[rust_sitter::leaf(pattern = r#"<\s*var"#)]
2845 #[builder(default, setter(skip))]
2846 _start: (),
2847 #[rust_sitter::leaf(
2848 pattern = r#"id\s*=\s*"0x([0-9a-fA-F]+)""#,
2849 transform = |v| {
2850 Integer::from_string_base(16, VarNodeTableValue::ID_REGEX
2851 .get_or_init(|| {
2852 Regex::new(r#"id\s*=\s*"0x([0-9a-fA-F]+)""#)
2853 .expect("Invalid regular expression")
2854 })
2855 .captures(v)
2856 .expect("No captures or no capture group")
2857 .get(1)
2858 .expect("No capture group").as_str()).expect("Invalid integer")
2859 }
2860 )]
2861 #[builder(setter(transform = |v: impl Into<Integer>| {
2862 v.into()
2863 }))]
2864 id: Integer,
2865 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
2866 #[builder(default, setter(skip))]
2867 _end: (),
2868 }
2869
2870 #[derive(Debug, PartialEq)]
2871 pub enum VarNodeTableValueType {
2872 Null {
2873 #[rust_sitter::leaf(pattern = r#"<\s*null\s*/\s*>"#)]
2874 _null: (),
2875 },
2876 Value(VarNodeTableValue),
2877 }
2878
2879 #[derive(TypedBuilder, Debug, PartialEq)]
2880 pub struct VarNodeListSymbol {
2881 #[rust_sitter::leaf(pattern = r#"<\s*varlist_sym"#)]
2882 #[builder(default, setter(skip))]
2883 _start: (),
2884 header: SymbolHeader,
2885 #[rust_sitter::leaf(pattern = r#">"#)]
2886 #[builder(default, setter(skip))]
2887 _close: (),
2888 patval: PatternValueType,
2889 varnode_table: Vec<VarNodeTableValueType>,
2890 #[rust_sitter::leaf(pattern = r#"<\s*/\s*varlist_sym\s*>"#)]
2891 #[builder(default, setter(skip))]
2892 _end: (),
2893 }
2894
2895 #[derive(TypedBuilder, Debug, PartialEq)]
2896 pub struct ValueSymbol {
2897 #[rust_sitter::leaf(pattern = r#"<\s*value_sym"#)]
2898 #[builder(default, setter(skip))]
2899 _start: (),
2900 header: SymbolHeader,
2901 #[rust_sitter::leaf(pattern = r#">"#)]
2902 #[builder(default, setter(skip))]
2903 _close: (),
2904 patval: PatternValueType,
2905 #[rust_sitter::leaf(pattern = r#"<\s*/\s*value_sym\s*>"#)]
2906 #[builder(default, setter(skip))]
2907 _end: (),
2908 }
2909
2910 #[derive(Debug, PartialEq)]
2911 pub enum ValueSymbolType {
2912 ValueMapSymbol(ValueMapSymbol),
2913 NameSymbol(NameSymbol),
2914 ContextSymbol(ContextSymbol),
2915 VarNodeListSymbol(VarNodeListSymbol),
2916 ValueSymbol(ValueSymbol),
2917 }
2918
2919 #[derive(Debug, PartialEq)]
2920 pub enum FamilySymbol {
2921 ValueSymbol(ValueSymbolType),
2922 }
2923
2924 #[derive(TypedBuilder, Debug, PartialEq)]
2925 pub struct EpsilonSymbol {
2926 #[rust_sitter::leaf(pattern = r#"<\s*epsilon_sym"#)]
2927 #[builder(default, setter(skip))]
2928 _start: (),
2929 header: SymbolHeader,
2930 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
2931 #[builder(default, setter(skip))]
2932 _end: (),
2933 }
2934
2935 impl VarNodeSymbol {
2936 const SPACE_REGEX: OnceCell<Regex> = OnceCell::new();
2938 const OFFSET_REGEX: OnceCell<Regex> = OnceCell::new();
2940 const SIZE_REGEX: OnceCell<Regex> = OnceCell::new();
2942 }
2943
2944 #[derive(TypedBuilder, Debug, PartialEq)]
2945 pub struct VarNodeSymbol {
2946 #[rust_sitter::leaf(pattern = r#"<\s*varnode_sym"#)]
2947 #[builder(default, setter(skip))]
2948 _start: (),
2949 header: SymbolHeader,
2950 #[rust_sitter::leaf(
2951 pattern = r#"space\s*=\s*"([^"]*)""#,
2952 transform = |v| {
2953 VarNodeSymbol::SPACE_REGEX
2954 .get_or_init(|| {
2955 Regex::new(r#"space\s*=\s*"([^"]*)""#).expect("Invalid regular expression")
2956 })
2957 .captures(v)
2958 .expect("No captures or no capture group")
2959 .get(1)
2960 .expect("No capture group")
2961 .as_str()
2962 .to_string()
2963 .xml_unescape()
2964 }
2965 )]
2966 space: String,
2967 #[rust_sitter::leaf(
2968 pattern = r#"offset\s*=\s*"0x([0-9a-fA-F]+)""#,
2969 transform = |v| {
2970 Integer::from_string_base(16, VarNodeSymbol::OFFSET_REGEX
2971 .get_or_init(|| {
2972 Regex::new(r#"offset\s*=\s*"0x([0-9a-fA-F]+)""#)
2973 .expect("Invalid regular expression")
2974 })
2975 .captures(v)
2976 .expect("No captures or no capture group")
2977 .get(1)
2978 .expect("No capture group").as_str()).expect("Invalid integer")
2979 }
2980 )]
2981 #[builder(setter(transform = |v: impl Into<Integer>| {
2982 v.into()
2983 }))]
2984 offset: Integer,
2985 #[rust_sitter::leaf(
2986 pattern = r#"size\s*=\s*"(-?[0-9]+)""#,
2987 transform = |v| {
2988 VarNodeSymbol::SIZE_REGEX
2989 .get_or_init(|| {
2990 Regex::new(r#"size\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
2991 })
2992 .captures(v)
2993 .expect("No captures or no capture group")
2994 .get(1)
2995 .expect("No capture group").as_str().parse().expect("Invalid integer")
2996 }
2997 )]
2998 #[builder(setter(transform = |v: impl Into<Integer>| {
2999 v.into()
3000 }))]
3001 size: Integer,
3002 #[rust_sitter::leaf(pattern = r#">"#)]
3003 #[builder(default, setter(skip))]
3004 _close: (),
3005 #[rust_sitter::leaf(pattern = r#"<\s*/\s*varnode_sym\s*>"#)]
3006 #[builder(default, setter(skip))]
3007 _end: (),
3008 }
3009
3010 #[derive(Debug, PartialEq)]
3011 pub enum PatternlessSymbol {
3012 EpsilonSymbol(EpsilonSymbol),
3013 VarNodeSymbol(VarNodeSymbol),
3014 }
3015
3016 impl OperandSymbol {
3017 const SUBSYM_REGEX: OnceCell<Regex> = OnceCell::new();
3019 const OFF_REGEX: OnceCell<Regex> = OnceCell::new();
3021 const BASE_REGEX: OnceCell<Regex> = OnceCell::new();
3023 const MINLEN_REGEX: OnceCell<Regex> = OnceCell::new();
3025 const INDEX_REGEX: OnceCell<Regex> = OnceCell::new();
3027 const CODE_REGEX: OnceCell<Regex> = OnceCell::new();
3029 }
3030
3031 #[derive(TypedBuilder, Debug, PartialEq)]
3032 pub struct OperandSymbol {
3033 #[rust_sitter::leaf(pattern = r#"<\s*operand_sym"#)]
3034 #[builder(default, setter(skip))]
3035 _start: (),
3036 header: SymbolHeader,
3037 #[rust_sitter::leaf(
3038 pattern = r#"subsym\s*=\s*"0x([0-9a-fA-F]+)""#,
3039 transform = |v| {
3040 Integer::from_string_base(16, OperandSymbol::SUBSYM_REGEX
3041 .get_or_init(|| {
3042 Regex::new(r#"subsym\s*=\s*"0x([0-9a-fA-F]+)""#)
3043 .expect("Invalid regular expression")
3044 })
3045 .captures(v)
3046 .expect("No captures or no capture group")
3047 .get(1)
3048 .expect("No capture group").as_str()).expect("Invalid integer")
3049 }
3050 )]
3051 #[builder(setter(transform = |v: impl Into<Integer>| {
3052 Some(v.into())
3053 }))]
3054 subsym: Option<Integer>,
3055 #[rust_sitter::leaf(
3056 pattern = r#"off\s*=\s*"(-?[0-9]+)""#,
3057 transform = |v| {
3058 OperandSymbol::OFF_REGEX
3059 .get_or_init(|| {
3060 Regex::new(r#"off\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
3061 })
3062 .captures(v)
3063 .expect("No captures or no capture group")
3064 .get(1)
3065 .expect("No capture group").as_str().parse().expect("Invalid integer")
3066 }
3067 )]
3068 #[builder(setter(transform = |v: impl Into<Integer>| {
3069 v.into()
3070 }))]
3071 off: Integer,
3072 #[rust_sitter::leaf(
3073 pattern = r#"base\s*=\s*"(-?[0-9]+)""#,
3074 transform = |v| {
3075 OperandSymbol::BASE_REGEX
3076 .get_or_init(|| {
3077 Regex::new(r#"base\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
3078 })
3079 .captures(v)
3080 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
3081 }
3082 )]
3083 #[builder(setter(transform = |v: impl Into<Integer>| {
3084 v.into()
3085 }))]
3086 base: Integer,
3087 #[rust_sitter::leaf(
3088 pattern = r#"minlen\s*=\s*"(-?[0-9]+)""#,
3089 transform = |v| {
3090 OperandSymbol::MINLEN_REGEX
3091 .get_or_init(|| {
3092 Regex::new(r#"minlen\s*=\s*"(-?[0-9]+)""#)
3093 .expect("Invalid regular expression")
3094 })
3095 .captures(v)
3096 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
3097 }
3098 )]
3099 #[builder(setter(transform = |v: impl Into<Integer>| {
3100 v.into()
3101 }))]
3102 minlen: Integer,
3103 #[rust_sitter::leaf(
3104 pattern = r#"code\s*=\s*"([a-z]+)""#,
3105 transform = |v| {
3106 OperandSymbol::CODE_REGEX
3107 .get_or_init(|| {
3108 Regex::new(r#"code\s*=\s*"([a-z]+)""#).expect("Invalid regular expression")
3109 })
3110 .captures(v)
3111 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid boolean")
3112 }
3113 )]
3114 code: Option<bool>,
3115 #[rust_sitter::leaf(
3116 pattern = r#"index\s*=\s*"(-?[0-9]+)""#,
3117 transform = |v| {
3118 OperandSymbol::INDEX_REGEX
3119 .get_or_init(|| {
3120 Regex::new(r#"index\s*=\s*"(-?[0-9]+)""#).expect("Invalid regular expression")
3121 })
3122 .captures(v)
3123 .expect("No captures or no capture group").get(1).expect("No capture group").as_str().parse().expect("Invalid integer")
3124 }
3125 )]
3126 #[builder(setter(transform = |v: impl Into<Integer>| {
3127 v.into()
3128 }))]
3129 index: Integer,
3130 #[rust_sitter::leaf(pattern = r#">"#)]
3131 #[builder(default, setter(skip))]
3132 _close: (),
3133 localexp: OperandValue,
3134 defexp: Option<PatternExpressionType>,
3135 #[rust_sitter::leaf(pattern = r#"<\s*/\s*operand_sym\s*>"#)]
3136 #[builder(default, setter(skip))]
3137 _end: (),
3138 }
3139
3140 #[derive(TypedBuilder, Debug, PartialEq)]
3141 pub struct StartSymbol {
3142 #[rust_sitter::leaf(pattern = r#"<\s*start_sym"#)]
3143 #[builder(default, setter(skip))]
3144 _start: (),
3145 header: SymbolHeader,
3146 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
3147 #[builder(default, setter(skip))]
3148 _end: (),
3149 }
3150
3151 #[derive(TypedBuilder, Debug, PartialEq)]
3152 pub struct EndSymbol {
3153 #[rust_sitter::leaf(pattern = r#"<\s*end_sym"#)]
3154 #[builder(default, setter(skip))]
3155 _start: (),
3156 header: SymbolHeader,
3157 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
3158 #[builder(default, setter(skip))]
3159 _end: (),
3160 }
3161
3162 #[derive(TypedBuilder, Debug, PartialEq)]
3163 pub struct Next2Symbol {
3164 #[rust_sitter::leaf(pattern = r#"<\s*next2_sym"#)]
3165 #[builder(default, setter(skip))]
3166 _start: (),
3167 header: SymbolHeader,
3168 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
3169 #[builder(default, setter(skip))]
3170 _end: (),
3171 }
3172
3173 #[derive(TypedBuilder, Debug, PartialEq)]
3174 pub struct FlowDestSymbol {
3175 #[rust_sitter::leaf(pattern = r#"<\s*flowdest_sym"#)]
3176 #[builder(default, setter(skip))]
3177 _start: (),
3178 header: SymbolHeader,
3179 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
3180 #[builder(default, setter(skip))]
3181 _end: (),
3182 }
3183
3184 #[derive(TypedBuilder, Debug, PartialEq)]
3185 pub struct FlowRefSymbol {
3186 #[rust_sitter::leaf(pattern = r#"<\s*flowref_sym"#)]
3187 #[builder(default, setter(skip))]
3188 _start: (),
3189 header: SymbolHeader,
3190 #[rust_sitter::leaf(pattern = r#"/\s*>"#)]
3191 #[builder(default, setter(skip))]
3192 _end: (),
3193 }
3194
3195 #[derive(Debug, PartialEq)]
3196 pub enum SpecificSymbol {
3197 PatternlessSymbol(PatternlessSymbol),
3198 OperandSymbol(OperandSymbol),
3199 StartSymbol(StartSymbol),
3200 EndSymbol(EndSymbol),
3201 Next2Symbol(Next2Symbol),
3202 FlowDestSymbol(FlowDestSymbol),
3203 FlowRefSymbol(FlowRefSymbol),
3204 }
3205
3206 #[derive(Debug, PartialEq)]
3207 pub enum TripleSymbol {
3208 FamilySymbol(FamilySymbol),
3209 SpecificSymbol(SpecificSymbol),
3210 SubtableSymbol {
3211 #[rust_sitter::leaf(pattern = r#"<\s*subtable_sym"#)]
3212 _start: (),
3213 subtable: SubtableSymbol,
3214 #[rust_sitter::leaf(pattern = r#"<\s*/\s*subtable_sym\s*>"#)]
3215 _end: (),
3216 },
3217 }
3218
3219 #[rust_sitter::extra]
3220 #[derive(Debug)]
3221 pub struct Whitespace {
3222 #[rust_sitter::leaf(pattern = r"\s")]
3223 _whitespace: (),
3224 }
3225}
3226
3227#[allow(non_upper_case_globals)]
3228#[cfg(test)]
3229mod test {
3230 use crate::parse;
3231
3232 #[test]
3233 fn test_6502() {
3234 const SLA_6502: &str = include_str!("../Processors/6502/data/languages/6502.sla");
3235 let slgh = parse(SLA_6502).expect("Failed to parse 6502 sla");
3236 println!("{slgh:#?}");
3237 }
3238 #[test]
3239 fn test_65c02() {
3240 const SLA_65c02: &str = include_str!("../Processors/6502/data/languages/65c02.sla");
3241 parse(SLA_65c02).expect("Failed to parse 65c02 sla");
3242 }
3243 #[test]
3244 fn test_68020() {
3245 const SLA_68020: &str = include_str!("../Processors/68000/data/languages/68020.sla");
3246 parse(SLA_68020).expect("Failed to parse 68020 sla");
3247 }
3248 #[test]
3249 fn test_68030() {
3250 const SLA_68030: &str = include_str!("../Processors/68000/data/languages/68030.sla");
3251 parse(SLA_68030).expect("Failed to parse 68030 sla");
3252 }
3253 #[test]
3254 fn test_68040() {
3255 const SLA_68040: &str = include_str!("../Processors/68000/data/languages/68040.sla");
3256 parse(SLA_68040).expect("Failed to parse 68040 sla");
3257 }
3258 #[test]
3259 fn test_coldfire() {
3260 const coldfire: &str = include_str!("../Processors/68000/data/languages/coldfire.sla");
3261 parse(coldfire).expect("Failed to parse coldfire sla");
3262 }
3263 #[test]
3264 fn test_8048() {
3265 const SLA_8048: &str = include_str!("../Processors/8048/data/languages/8048.sla");
3266 parse(SLA_8048).expect("Failed to parse 8048 sla");
3267 }
3268 #[test]
3269 fn test_80251() {
3270 const SLA_80251: &str = include_str!("../Processors/8051/data/languages/80251.sla");
3271 parse(SLA_80251).expect("Failed to parse 80251 sla");
3272 }
3273 #[test]
3274 fn test_80390() {
3275 const SLA_80390: &str = include_str!("../Processors/8051/data/languages/80390.sla");
3276 parse(SLA_80390).expect("Failed to parse 80390 sla");
3277 }
3278 #[test]
3279 fn test_8051() {
3280 const SLA_8051: &str = include_str!("../Processors/8051/data/languages/8051.sla");
3281 parse(SLA_8051).expect("Failed to parse 8051 sla");
3282 }
3283 #[test]
3284 fn test_mx51() {
3285 const mx51: &str = include_str!("../Processors/8051/data/languages/mx51.sla");
3286 parse(mx51).expect("Failed to parse mx51 sla");
3287 }
3288 #[test]
3289 fn test_8085() {
3290 const SLA_8085: &str = include_str!("../Processors/8085/data/languages/8085.sla");
3291 parse(SLA_8085).expect("Failed to parse 8085 sla");
3292 }
3293 #[test]
3294 fn test_AARCH64() {
3295 const AARCH64: &str = include_str!("../Processors/AARCH64/data/languages/AARCH64.sla");
3296 parse(AARCH64).expect("Failed to parse AARCH64 sla");
3297 }
3298 #[test]
3299 fn test_AARCH64BE() {
3300 const AARCH64BE: &str = include_str!("../Processors/AARCH64/data/languages/AARCH64BE.sla");
3301 parse(AARCH64BE).expect("Failed to parse AARCH64BE sla");
3302 }
3303 #[test]
3304 fn test_AARCH64_AppleSilicon() {
3305 const AARCH64_AppleSilicon: &str =
3306 include_str!("../Processors/AARCH64/data/languages/AARCH64_AppleSilicon.sla");
3307 parse(AARCH64_AppleSilicon).expect("Failed to parse AARCH64_AppleSilicon sla");
3308 }
3309 #[test]
3310 fn test_ARM4_be() {
3311 const ARM4_be: &str = include_str!("../Processors/ARM/data/languages/ARM4_be.sla");
3312 parse(ARM4_be).expect("Failed to parse ARM4_be sla");
3313 }
3314 #[test]
3315 fn test_ARM4_le() {
3316 const ARM4_le: &str = include_str!("../Processors/ARM/data/languages/ARM4_le.sla");
3317 parse(ARM4_le).expect("Failed to parse ARM4_le sla");
3318 }
3319 #[test]
3320 fn test_ARM4t_be() {
3321 const ARM4t_be: &str = include_str!("../Processors/ARM/data/languages/ARM4t_be.sla");
3322 parse(ARM4t_be).expect("Failed to parse ARM4t_be sla");
3323 }
3324 #[test]
3325 fn test_ARM4t_le() {
3326 const ARM4t_le: &str = include_str!("../Processors/ARM/data/languages/ARM4t_le.sla");
3327 parse(ARM4t_le).expect("Failed to parse ARM4t_le sla");
3328 }
3329 #[test]
3330 fn test_ARM5_be() {
3331 const ARM5_be: &str = include_str!("../Processors/ARM/data/languages/ARM5_be.sla");
3332 parse(ARM5_be).expect("Failed to parse ARM5_be sla");
3333 }
3334 #[test]
3335 fn test_ARM5_le() {
3336 const ARM5_le: &str = include_str!("../Processors/ARM/data/languages/ARM5_le.sla");
3337 parse(ARM5_le).expect("Failed to parse ARM5_le sla");
3338 }
3339 #[test]
3340 fn test_ARM5t_be() {
3341 const ARM5t_be: &str = include_str!("../Processors/ARM/data/languages/ARM5t_be.sla");
3342 parse(ARM5t_be).expect("Failed to parse ARM5t_be sla");
3343 }
3344 #[test]
3345 fn test_ARM5t_le() {
3346 const ARM5t_le: &str = include_str!("../Processors/ARM/data/languages/ARM5t_le.sla");
3347 parse(ARM5t_le).expect("Failed to parse ARM5t_le sla");
3348 }
3349 #[test]
3350 fn test_ARM6_be() {
3351 const ARM6_be: &str = include_str!("../Processors/ARM/data/languages/ARM6_be.sla");
3352 parse(ARM6_be).expect("Failed to parse ARM6_be sla");
3353 }
3354 #[test]
3355 fn test_ARM6_le() {
3356 const ARM6_le: &str = include_str!("../Processors/ARM/data/languages/ARM6_le.sla");
3357 parse(ARM6_le).expect("Failed to parse ARM6_le sla");
3358 }
3359 #[test]
3360 fn test_ARM7_be() {
3361 const ARM7_be: &str = include_str!("../Processors/ARM/data/languages/ARM7_be.sla");
3362 parse(ARM7_be).expect("Failed to parse ARM7_be sla");
3363 }
3364 #[test]
3365 fn test_ARM7_le() {
3366 const ARM7_le: &str = include_str!("../Processors/ARM/data/languages/ARM7_le.sla");
3367 parse(ARM7_le).expect("Failed to parse ARM7_le sla");
3368 }
3369 #[test]
3370 fn test_ARM8_be() {
3371 const ARM8_be: &str = include_str!("../Processors/ARM/data/languages/ARM8_be.sla");
3372 parse(ARM8_be).expect("Failed to parse ARM8_be sla");
3373 }
3374 #[test]
3375 fn test_ARM8_le() {
3376 const ARM8_le: &str = include_str!("../Processors/ARM/data/languages/ARM8_le.sla");
3377 parse(ARM8_le).expect("Failed to parse ARM8_le sla");
3378 }
3379 #[test]
3380 fn test_avr32a() {
3381 const avr32a: &str = include_str!("../Processors/Atmel/data/languages/avr32a.sla");
3382 parse(avr32a).expect("Failed to parse avr32a sla");
3383 }
3384 #[test]
3385 fn test_avr8() {
3386 const avr8: &str = include_str!("../Processors/Atmel/data/languages/avr8.sla");
3387 parse(avr8).expect("Failed to parse avr8 sla");
3388 }
3389 #[test]
3390 fn test_avr8e() {
3391 const avr8e: &str = include_str!("../Processors/Atmel/data/languages/avr8e.sla");
3392 parse(avr8e).expect("Failed to parse avr8e sla");
3393 }
3394 #[test]
3395 fn test_avr8eind() {
3396 const avr8eind: &str = include_str!("../Processors/Atmel/data/languages/avr8eind.sla");
3397 parse(avr8eind).expect("Failed to parse avr8eind sla");
3398 }
3399 #[test]
3400 fn test_avr8xmega() {
3401 const avr8xmega: &str = include_str!("../Processors/Atmel/data/languages/avr8xmega.sla");
3402 parse(avr8xmega).expect("Failed to parse avr8xmega sla");
3403 }
3404 #[test]
3405 fn test_BPF_le() {
3406 const BPF_le: &str = include_str!("../Processors/BPF/data/languages/BPF_le.sla");
3407 parse(BPF_le).expect("Failed to parse BPF_le sla");
3408 }
3409 #[test]
3410 fn test_CP1600() {
3411 const CP1600: &str = include_str!("../Processors/CP1600/data/languages/CP1600.sla");
3412 parse(CP1600).expect("Failed to parse CP1600 sla");
3413 }
3414 #[test]
3415 fn test_CR16B() {
3416 const CR16B: &str = include_str!("../Processors/CR16/data/languages/CR16B.sla");
3417 parse(CR16B).expect("Failed to parse CR16B sla");
3418 }
3419 #[test]
3420 fn test_CR16C() {
3421 const CR16C: &str = include_str!("../Processors/CR16/data/languages/CR16C.sla");
3422 parse(CR16C).expect("Failed to parse CR16C sla");
3423 }
3424 #[test]
3425 fn test_data_be_64() {
3426 const data_be_64: &str = include_str!("../Processors/DATA/data/languages/data-be-64.sla");
3427 parse(data_be_64).expect("Failed to parse data-be-64 sla");
3428 }
3429 #[test]
3430 fn test_data_le_64() {
3431 const data_le_64: &str = include_str!("../Processors/DATA/data/languages/data-le-64.sla");
3432 parse(data_le_64).expect("Failed to parse data-le-64 sla");
3433 }
3434 #[test]
3435 fn test_Dalvik_Base() {
3436 const Dalvik_Base: &str =
3437 include_str!("../Processors/Dalvik/data/languages/Dalvik_Base.sla");
3438 parse(Dalvik_Base).expect("Failed to parse Dalvik_Base sla");
3439 }
3440 #[test]
3441 fn test_Dalvik_DEX_Android10() {
3442 const Dalvik_DEX_Android10: &str =
3443 include_str!("../Processors/Dalvik/data/languages/Dalvik_DEX_Android10.sla");
3444 parse(Dalvik_DEX_Android10).expect("Failed to parse Dalvik_DEX_Android10 sla");
3445 }
3446 #[test]
3447 fn test_Dalvik_DEX_Android11() {
3448 const Dalvik_DEX_Android11: &str =
3449 include_str!("../Processors/Dalvik/data/languages/Dalvik_DEX_Android11.sla");
3450 parse(Dalvik_DEX_Android11).expect("Failed to parse Dalvik_DEX_Android11 sla");
3451 }
3452 #[test]
3453 fn test_Dalvik_DEX_Android12() {
3454 const Dalvik_DEX_Android12: &str =
3455 include_str!("../Processors/Dalvik/data/languages/Dalvik_DEX_Android12.sla");
3456 parse(Dalvik_DEX_Android12).expect("Failed to parse Dalvik_DEX_Android12 sla");
3457 }
3458 #[test]
3459 fn test_Dalvik_DEX_KitKat() {
3460 const Dalvik_DEX_KitKat: &str =
3461 include_str!("../Processors/Dalvik/data/languages/Dalvik_DEX_KitKat.sla");
3462 parse(Dalvik_DEX_KitKat).expect("Failed to parse Dalvik_DEX_KitKat sla");
3463 }
3464 #[test]
3465 fn test_Dalvik_DEX_Lollipop() {
3466 const Dalvik_DEX_Lollipop: &str =
3467 include_str!("../Processors/Dalvik/data/languages/Dalvik_DEX_Lollipop.sla");
3468 parse(Dalvik_DEX_Lollipop).expect("Failed to parse Dalvik_DEX_Lollipop sla");
3469 }
3470 #[test]
3471 fn test_Dalvik_DEX_Marshmallow() {
3472 const Dalvik_DEX_Marshmallow: &str =
3473 include_str!("../Processors/Dalvik/data/languages/Dalvik_DEX_Marshmallow.sla");
3474 parse(Dalvik_DEX_Marshmallow).expect("Failed to parse Dalvik_DEX_Marshmallow sla");
3475 }
3476 #[test]
3477 fn test_Dalvik_DEX_Nougat() {
3478 const Dalvik_DEX_Nougat: &str =
3479 include_str!("../Processors/Dalvik/data/languages/Dalvik_DEX_Nougat.sla");
3480 parse(Dalvik_DEX_Nougat).expect("Failed to parse Dalvik_DEX_Nougat sla");
3481 }
3482 #[test]
3483 fn test_Dalvik_DEX_Oreo() {
3484 const Dalvik_DEX_Oreo: &str =
3485 include_str!("../Processors/Dalvik/data/languages/Dalvik_DEX_Oreo.sla");
3486 parse(Dalvik_DEX_Oreo).expect("Failed to parse Dalvik_DEX_Oreo sla");
3487 }
3488 #[test]
3489 fn test_Dalvik_DEX_Pie() {
3490 const Dalvik_DEX_Pie: &str =
3491 include_str!("../Processors/Dalvik/data/languages/Dalvik_DEX_Pie.sla");
3492 parse(Dalvik_DEX_Pie).expect("Failed to parse Dalvik_DEX_Pie sla");
3493 }
3494 #[test]
3495 fn test_Dalvik_ODEX_KitKat() {
3496 const Dalvik_ODEX_KitKat: &str =
3497 include_str!("../Processors/Dalvik/data/languages/Dalvik_ODEX_KitKat.sla");
3498 parse(Dalvik_ODEX_KitKat).expect("Failed to parse Dalvik_ODEX_KitKat sla");
3499 }
3500 #[test]
3501 fn test_HC05() {
3502 const HC05: &str = include_str!("../Processors/HCS08/data/languages/HC05.sla");
3503 parse(HC05).expect("Failed to parse HC05 sla");
3504 }
3505 #[test]
3506 fn test_HC08() {
3507 const HC08: &str = include_str!("../Processors/HCS08/data/languages/HC08.sla");
3508 parse(HC08).expect("Failed to parse HC08 sla");
3509 }
3510 #[test]
3511 fn test_HCS08() {
3512 const HCS08: &str = include_str!("../Processors/HCS08/data/languages/HCS08.sla");
3513 parse(HCS08).expect("Failed to parse HCS08 sla");
3514 }
3515 #[test]
3516 fn test_HC12() {
3517 const HC12: &str = include_str!("../Processors/HCS12/data/languages/HC12.sla");
3518 parse(HC12).expect("Failed to parse HC12 sla");
3519 }
3520 #[test]
3521 fn test_HCS12() {
3522 const HCS12: &str = include_str!("../Processors/HCS12/data/languages/HCS12.sla");
3523 parse(HCS12).expect("Failed to parse HCS12 sla");
3524 }
3525 #[test]
3526 fn test_HCS12X() {
3527 const HCS12X: &str = include_str!("../Processors/HCS12/data/languages/HCS12X.sla");
3528 parse(HCS12X).expect("Failed to parse HCS12X sla");
3529 }
3530 #[test]
3531 fn test_JVM() {
3532 const JVM: &str = include_str!("../Processors/JVM/data/languages/JVM.sla");
3533 parse(JVM).expect("Failed to parse JVM sla");
3534 }
3535 #[test]
3536 fn test_m8c() {
3537 const m8c: &str = include_str!("../Processors/M8C/data/languages/m8c.sla");
3538 parse(m8c).expect("Failed to parse m8c sla");
3539 }
3540 #[test]
3541 fn test_6805() {
3542 const SLA_6805: &str = include_str!("../Processors/MC6800/data/languages/6805.sla");
3543 parse(SLA_6805).expect("Failed to parse 6805 sla");
3544 }
3545 #[test]
3546 fn test_6809() {
3547 const SLA_6809: &str = include_str!("../Processors/MC6800/data/languages/6809.sla");
3548 parse(SLA_6809).expect("Failed to parse 6809 sla");
3549 }
3550 #[test]
3551 fn test_H6309() {
3552 const H6309: &str = include_str!("../Processors/MC6800/data/languages/H6309.sla");
3553 parse(H6309).expect("Failed to parse H6309 sla");
3554 }
3555 #[test]
3556 fn test_MCS96() {
3557 const MCS96: &str = include_str!("../Processors/MCS96/data/languages/MCS96.sla");
3558 parse(MCS96).expect("Failed to parse MCS96 sla");
3559 }
3560 #[test]
3561 fn test_mips32R6be() {
3562 const mips32R6be: &str = include_str!("../Processors/MIPS/data/languages/mips32R6be.sla");
3563 parse(mips32R6be).expect("Failed to parse mips32R6be sla");
3564 }
3565 #[test]
3566 fn test_mips32R6le() {
3567 const mips32R6le: &str = include_str!("../Processors/MIPS/data/languages/mips32R6le.sla");
3568 parse(mips32R6le).expect("Failed to parse mips32R6le sla");
3569 }
3570 #[test]
3571 fn test_mips32be() {
3572 const mips32be: &str = include_str!("../Processors/MIPS/data/languages/mips32be.sla");
3573 parse(mips32be).expect("Failed to parse mips32be sla");
3574 }
3575 #[test]
3576 fn test_mips32le() {
3577 const mips32le: &str = include_str!("../Processors/MIPS/data/languages/mips32le.sla");
3578 parse(mips32le).expect("Failed to parse mips32le sla");
3579 }
3580 #[test]
3581 fn test_mips64be() {
3582 const mips64be: &str = include_str!("../Processors/MIPS/data/languages/mips64be.sla");
3583 parse(mips64be).expect("Failed to parse mips64be sla");
3584 }
3585 #[test]
3586 fn test_mips64le() {
3587 const mips64le: &str = include_str!("../Processors/MIPS/data/languages/mips64le.sla");
3588 parse(mips64le).expect("Failed to parse mips64le sla");
3589 }
3590 #[test]
3591 fn test_pa_risc32be() {
3592 const pa_risc32be: &str =
3593 include_str!("../Processors/PA-RISC/data/languages/pa-risc32be.sla");
3594 parse(pa_risc32be).expect("Failed to parse pa-risc32be sla");
3595 }
3596 #[test]
3597 fn test_PIC24E() {
3598 const PIC24E: &str = include_str!("../Processors/PIC/data/languages/PIC24E.sla");
3599 parse(PIC24E).expect("Failed to parse PIC24E sla");
3600 }
3601 #[test]
3602 fn test_PIC24F() {
3603 const PIC24F: &str = include_str!("../Processors/PIC/data/languages/PIC24F.sla");
3604 parse(PIC24F).expect("Failed to parse PIC24F sla");
3605 }
3606 #[test]
3607 fn test_PIC24H() {
3608 const PIC24H: &str = include_str!("../Processors/PIC/data/languages/PIC24H.sla");
3609 parse(PIC24H).expect("Failed to parse PIC24H sla");
3610 }
3611 #[test]
3612 fn test_dsPIC30F() {
3613 const dsPIC30F: &str = include_str!("../Processors/PIC/data/languages/dsPIC30F.sla");
3614 parse(dsPIC30F).expect("Failed to parse dsPIC30F sla");
3615 }
3616 #[test]
3617 fn test_dsPIC33C() {
3618 const dsPIC33C: &str = include_str!("../Processors/PIC/data/languages/dsPIC33C.sla");
3619 parse(dsPIC33C).expect("Failed to parse dsPIC33C sla");
3620 }
3621 #[test]
3622 fn test_dsPIC33E() {
3623 const dsPIC33E: &str = include_str!("../Processors/PIC/data/languages/dsPIC33E.sla");
3624 parse(dsPIC33E).expect("Failed to parse dsPIC33E sla");
3625 }
3626 #[test]
3627 fn test_dsPIC33F() {
3628 const dsPIC33F: &str = include_str!("../Processors/PIC/data/languages/dsPIC33F.sla");
3629 parse(dsPIC33F).expect("Failed to parse dsPIC33F sla");
3630 }
3631 #[test]
3632 fn test_pic12c5xx() {
3633 const pic12c5xx: &str = include_str!("../Processors/PIC/data/languages/pic12c5xx.sla");
3634 parse(pic12c5xx).expect("Failed to parse pic12c5xx sla");
3635 }
3636 #[test]
3637 fn test_pic16() {
3638 const pic16: &str = include_str!("../Processors/PIC/data/languages/pic16.sla");
3639 parse(pic16).expect("Failed to parse pic16 sla");
3640 }
3641 #[test]
3642 fn test_pic16c5x() {
3643 const pic16c5x: &str = include_str!("../Processors/PIC/data/languages/pic16c5x.sla");
3644 parse(pic16c5x).expect("Failed to parse pic16c5x sla");
3645 }
3646 #[test]
3647 fn test_pic16f() {
3648 const pic16f: &str = include_str!("../Processors/PIC/data/languages/pic16f.sla");
3649 parse(pic16f).expect("Failed to parse pic16f sla");
3650 }
3651 #[test]
3652 fn test_pic17c7xx() {
3653 const pic17c7xx: &str = include_str!("../Processors/PIC/data/languages/pic17c7xx.sla");
3654 parse(pic17c7xx).expect("Failed to parse pic17c7xx sla");
3655 }
3656 #[test]
3657 fn test_pic18() {
3658 const pic18: &str = include_str!("../Processors/PIC/data/languages/pic18.sla");
3659 parse(pic18).expect("Failed to parse pic18 sla");
3660 }
3661 #[test]
3662 fn test_ppc_32_4xx_be() {
3663 const ppc_32_4xx_be: &str =
3664 include_str!("../Processors/PowerPC/data/languages/ppc_32_4xx_be.sla");
3665 parse(ppc_32_4xx_be).expect("Failed to parse ppc_32_4xx_be sla");
3666 }
3667 #[test]
3668 fn test_ppc_32_4xx_le() {
3669 const ppc_32_4xx_le: &str =
3670 include_str!("../Processors/PowerPC/data/languages/ppc_32_4xx_le.sla");
3671 parse(ppc_32_4xx_le).expect("Failed to parse ppc_32_4xx_le sla");
3672 }
3673 #[test]
3674 fn test_ppc_32_be() {
3675 const ppc_32_be: &str = include_str!("../Processors/PowerPC/data/languages/ppc_32_be.sla");
3676 parse(ppc_32_be).expect("Failed to parse ppc_32_be sla");
3677 }
3678 #[test]
3679 fn test_ppc_32_e500_be() {
3680 const ppc_32_e500_be: &str =
3681 include_str!("../Processors/PowerPC/data/languages/ppc_32_e500_be.sla");
3682 parse(ppc_32_e500_be).expect("Failed to parse ppc_32_e500_be sla");
3683 }
3684 #[test]
3685 fn test_ppc_32_e500_le() {
3686 const ppc_32_e500_le: &str =
3687 include_str!("../Processors/PowerPC/data/languages/ppc_32_e500_le.sla");
3688 parse(ppc_32_e500_le).expect("Failed to parse ppc_32_e500_le sla");
3689 }
3690 #[test]
3691 fn test_ppc_32_le() {
3692 const ppc_32_le: &str = include_str!("../Processors/PowerPC/data/languages/ppc_32_le.sla");
3693 parse(ppc_32_le).expect("Failed to parse ppc_32_le sla");
3694 }
3695 #[test]
3696 fn test_ppc_32_quicciii_be() {
3697 const ppc_32_quicciii_be: &str =
3698 include_str!("../Processors/PowerPC/data/languages/ppc_32_quicciii_be.sla");
3699 parse(ppc_32_quicciii_be).expect("Failed to parse ppc_32_quicciii_be sla");
3700 }
3701 #[test]
3702 fn test_ppc_32_quicciii_le() {
3703 const ppc_32_quicciii_le: &str =
3704 include_str!("../Processors/PowerPC/data/languages/ppc_32_quicciii_le.sla");
3705 parse(ppc_32_quicciii_le).expect("Failed to parse ppc_32_quicciii_le sla");
3706 }
3707 #[test]
3708 fn test_ppc_64_be() {
3709 const ppc_64_be: &str = include_str!("../Processors/PowerPC/data/languages/ppc_64_be.sla");
3710 parse(ppc_64_be).expect("Failed to parse ppc_64_be sla");
3711 }
3712 #[test]
3713 fn test_ppc_64_isa_altivec_be() {
3714 const ppc_64_isa_altivec_be: &str =
3715 include_str!("../Processors/PowerPC/data/languages/ppc_64_isa_altivec_be.sla");
3716 parse(ppc_64_isa_altivec_be).expect("Failed to parse ppc_64_isa_altivec_be sla");
3717 }
3718 #[test]
3719 fn test_ppc_64_isa_altivec_le() {
3720 const ppc_64_isa_altivec_le: &str =
3721 include_str!("../Processors/PowerPC/data/languages/ppc_64_isa_altivec_le.sla");
3722 parse(ppc_64_isa_altivec_le).expect("Failed to parse ppc_64_isa_altivec_le sla");
3723 }
3724 #[test]
3725 fn test_ppc_64_isa_altivec_vle_be() {
3726 const ppc_64_isa_altivec_vle_be: &str =
3727 include_str!("../Processors/PowerPC/data/languages/ppc_64_isa_altivec_vle_be.sla");
3728 parse(ppc_64_isa_altivec_vle_be).expect("Failed to parse ppc_64_isa_altivec_vle_be sla");
3729 }
3730 #[test]
3731 fn test_ppc_64_isa_be() {
3732 const ppc_64_isa_be: &str =
3733 include_str!("../Processors/PowerPC/data/languages/ppc_64_isa_be.sla");
3734 parse(ppc_64_isa_be).expect("Failed to parse ppc_64_isa_be sla");
3735 }
3736 #[test]
3737 fn test_ppc_64_isa_le() {
3738 const ppc_64_isa_le: &str =
3739 include_str!("../Processors/PowerPC/data/languages/ppc_64_isa_le.sla");
3740 parse(ppc_64_isa_le).expect("Failed to parse ppc_64_isa_le sla");
3741 }
3742 #[test]
3743 fn test_ppc_64_isa_vle_be() {
3744 const ppc_64_isa_vle_be: &str =
3745 include_str!("../Processors/PowerPC/data/languages/ppc_64_isa_vle_be.sla");
3746 parse(ppc_64_isa_vle_be).expect("Failed to parse ppc_64_isa_vle_be sla");
3747 }
3748 #[test]
3749 fn test_ppc_64_le() {
3750 const ppc_64_le: &str = include_str!("../Processors/PowerPC/data/languages/ppc_64_le.sla");
3751 parse(ppc_64_le).expect("Failed to parse ppc_64_le sla");
3752 }
3753
3754 #[test]
3755 fn test_riscv_ilp32d() {
3756 const riscv_ilp32d: &str =
3757 include_str!("../Processors/RISCV/data/languages/riscv.ilp32d.sla");
3758 parse(riscv_ilp32d).expect("Failed to parse riscv_ilp32d sla");
3759 }
3760
3761 #[test]
3762 fn test_riscv_lp64d() {
3763 const riscv_lp64d: &str =
3764 include_str!("../Processors/RISCV/data/languages/riscv.lp64d.sla");
3765 parse(riscv_lp64d).expect("Failed to parse riscv_lp64d sla");
3766 }
3767
3768 #[test]
3769 fn test_SparcV9_32() {
3770 const SparcV9_32: &str = include_str!("../Processors/Sparc/data/languages/SparcV9_32.sla");
3771 parse(SparcV9_32).expect("Failed to parse SparcV9_32 sla");
3772 }
3773 #[test]
3774 fn test_SparcV9_64() {
3775 const SparcV9_64: &str = include_str!("../Processors/Sparc/data/languages/SparcV9_64.sla");
3776 parse(SparcV9_64).expect("Failed to parse SparcV9_64 sla");
3777 }
3778 #[test]
3779 fn test_sh_1() {
3780 const sh_1: &str = include_str!("../Processors/SuperH/data/languages/sh-1.sla");
3781 parse(sh_1).expect("Failed to parse sh-1 sla");
3782 }
3783 #[test]
3784 fn test_sh_2() {
3785 const sh_2: &str = include_str!("../Processors/SuperH/data/languages/sh-2.sla");
3786 parse(sh_2).expect("Failed to parse sh-2 sla");
3787 }
3788 #[test]
3789 fn test_sh_2a() {
3790 const sh_2a: &str = include_str!("../Processors/SuperH/data/languages/sh-2a.sla");
3791 parse(sh_2a).expect("Failed to parse sh-2a sla");
3792 }
3793 #[test]
3794 fn test_SuperH4_be() {
3795 const SuperH4_be: &str =
3796 include_str!("../Processors/SuperH4/data/languages/SuperH4_be.sla");
3797 parse(SuperH4_be).expect("Failed to parse SuperH4_be sla");
3798 }
3799 #[test]
3800 fn test_SuperH4_le() {
3801 const SuperH4_le: &str =
3802 include_str!("../Processors/SuperH4/data/languages/SuperH4_le.sla");
3803 parse(SuperH4_le).expect("Failed to parse SuperH4_le sla");
3804 }
3805 #[test]
3806 fn test_TI_MSP430() {
3807 const TI_MSP430: &str =
3808 include_str!("../Processors/TI_MSP430/data/languages/TI_MSP430.sla");
3809 parse(TI_MSP430).expect("Failed to parse TI_MSP430 sla");
3810 }
3811 #[test]
3812 fn test_TI_MSP430X() {
3813 const TI_MSP430X: &str =
3814 include_str!("../Processors/TI_MSP430/data/languages/TI_MSP430X.sla");
3815 parse(TI_MSP430X).expect("Failed to parse TI_MSP430X sla");
3816 }
3817 #[test]
3818 fn test_toy64_be() {
3819 const toy64_be: &str = include_str!("../Processors/Toy/data/languages/toy64_be.sla");
3820 parse(toy64_be).expect("Failed to parse toy64_be sla");
3821 }
3822 #[test]
3823 fn test_toy64_be_harvard() {
3824 const toy64_be_harvard: &str =
3825 include_str!("../Processors/Toy/data/languages/toy64_be_harvard.sla");
3826 parse(toy64_be_harvard).expect("Failed to parse toy64_be_harvard sla");
3827 }
3828 #[test]
3829 fn test_toy64_le() {
3830 const toy64_le: &str = include_str!("../Processors/Toy/data/languages/toy64_le.sla");
3831 parse(toy64_le).expect("Failed to parse toy64_le sla");
3832 }
3833 #[test]
3834 fn test_toy_be() {
3835 const toy_be: &str = include_str!("../Processors/Toy/data/languages/toy_be.sla");
3836 parse(toy_be).expect("Failed to parse toy_be sla");
3837 }
3838 #[test]
3839 fn test_toy_be_posStack() {
3840 const toy_be_posStack: &str =
3841 include_str!("../Processors/Toy/data/languages/toy_be_posStack.sla");
3842 parse(toy_be_posStack).expect("Failed to parse toy_be_posStack sla");
3843 }
3844 #[test]
3845 fn test_toy_builder_be() {
3846 const toy_builder_be: &str =
3847 include_str!("../Processors/Toy/data/languages/toy_builder_be.sla");
3848 parse(toy_builder_be).expect("Failed to parse toy_builder_be sla");
3849 }
3850 #[test]
3851 fn test_toy_builder_be_align2() {
3852 const toy_builder_be_align2: &str =
3853 include_str!("../Processors/Toy/data/languages/toy_builder_be_align2.sla");
3854 parse(toy_builder_be_align2).expect("Failed to parse toy_builder_be_align2 sla");
3855 }
3856 #[test]
3857 fn test_toy_builder_le() {
3858 const toy_builder_le: &str =
3859 include_str!("../Processors/Toy/data/languages/toy_builder_le.sla");
3860 parse(toy_builder_le).expect("Failed to parse toy_builder_le sla");
3861 }
3862 #[test]
3863 fn test_toy_builder_le_align2() {
3864 const toy_builder_le_align2: &str =
3865 include_str!("../Processors/Toy/data/languages/toy_builder_le_align2.sla");
3866 parse(toy_builder_le_align2).expect("Failed to parse toy_builder_le_align2 sla");
3867 }
3868 #[test]
3869 fn test_toy_le() {
3870 const toy_le: &str = include_str!("../Processors/Toy/data/languages/toy_le.sla");
3871 parse(toy_le).expect("Failed to parse toy_le sla");
3872 }
3873 #[test]
3874 fn test_toy_wsz_be() {
3875 const toy_wsz_be: &str = include_str!("../Processors/Toy/data/languages/toy_wsz_be.sla");
3876 parse(toy_wsz_be).expect("Failed to parse toy_wsz_be sla");
3877 }
3878 #[test]
3879 fn test_toy_wsz_le() {
3880 const toy_wsz_le: &str = include_str!("../Processors/Toy/data/languages/toy_wsz_le.sla");
3881 parse(toy_wsz_le).expect("Failed to parse toy_wsz_le sla");
3882 }
3883 #[test]
3884 fn test_V850() {
3885 const V850: &str = include_str!("../Processors/V850/data/languages/V850.sla");
3886 parse(V850).expect("Failed to parse V850 sla");
3887 }
3888 #[test]
3889 fn test_z180() {
3890 const z180: &str = include_str!("../Processors/Z80/data/languages/z180.sla");
3891 parse(z180).expect("Failed to parse z180 sla");
3892 }
3893 #[test]
3894 fn test_z80() {
3895 const z80: &str = include_str!("../Processors/Z80/data/languages/z80.sla");
3896 parse(z80).expect("Failed to parse z80 sla");
3897 }
3898 #[test]
3899 fn test_eBPF_le() {
3900 const E_BPF_LE: &str = include_str!("../Processors/eBPF/data/languages/eBPF_le.sla");
3901 parse(E_BPF_LE).expect("Failed to parse eBPF_le sla");
3902 }
3903 #[test]
3904 fn test_tricore() {
3905 const TRICORE: &str = include_str!("../Processors/tricore/data/languages/tricore.sla");
3906 parse(TRICORE).expect("Failed to parse tricore sla");
3907 }
3908 #[test]
3909 fn test_x86_64() {
3910 const x86_64: &str = include_str!("../Processors/x86/data/languages/x86-64.sla");
3911 let parsed = parse(x86_64).expect("Failed to parse x86-64 sla");
3912 println!("{:#?}", parsed);
3913 }
3914 #[test]
3915 fn test_x86() {
3916 const X86: &str = include_str!("../Processors/x86/data/languages/x86.sla");
3917 parse(X86).expect("Failed to parse x86 sla");
3918 }
3919}