Skip to main content

veryl_parser/
stringifier.rs

1use crate::resource_table::StrId;
2use crate::veryl_grammar_trait::{HierarchicalIdentifier, Identifier};
3use crate::veryl_token::VerylToken;
4use crate::veryl_walker::VerylWalker;
5
6#[derive(Default)]
7pub struct Stringifier {
8    string: String,
9    ids: Vec<StrId>,
10}
11
12impl Stringifier {
13    pub fn new() -> Self {
14        Default::default()
15    }
16
17    pub fn as_str(&self) -> &str {
18        &self.string
19    }
20
21    pub fn ids(&self) -> &[StrId] {
22        &self.ids
23    }
24
25    pub fn hierarchical_identifier_with_prefix_suffix(
26        &mut self,
27        arg: &HierarchicalIdentifier,
28        prefix: &Option<String>,
29        suffix: &Option<String>,
30    ) {
31        let list_len = &arg.hierarchical_identifier_list0.len();
32
33        if *list_len == 0 {
34            self.identifier_with_prefix_suffix(&arg.identifier, prefix, suffix);
35        } else {
36            self.identifier(&arg.identifier);
37        }
38
39        for x in &arg.hierarchical_identifier_list {
40            self.select(&x.select);
41        }
42
43        for (i, x) in arg.hierarchical_identifier_list0.iter().enumerate() {
44            self.dot(&x.dot);
45            if (i + 1) == *list_len {
46                self.identifier_with_prefix_suffix(&x.identifier, prefix, suffix);
47            } else {
48                self.identifier(&x.identifier);
49            }
50            for x in &x.hierarchical_identifier_list0_list {
51                self.select(&x.select);
52            }
53        }
54    }
55
56    fn identifier_with_prefix_suffix(
57        &mut self,
58        identifier: &Identifier,
59        prefix: &Option<String>,
60        suffix: &Option<String>,
61    ) {
62        if prefix.is_some() || suffix.is_some() {
63            let token = identifier.identifier_token.append(prefix, suffix);
64            self.veryl_token(&token);
65        } else {
66            self.veryl_token(&identifier.identifier_token);
67        }
68    }
69}
70
71impl VerylWalker for Stringifier {
72    /// Semantic action for non-terminal 'VerylToken'
73    fn veryl_token(&mut self, arg: &VerylToken) {
74        self.string.push_str(&arg.to_string());
75        self.ids.push(arg.token.text);
76    }
77}