veryl_parser/
stringifier.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use crate::resource_table::StrId;
use crate::veryl_grammar_trait::{HierarchicalIdentifier, Identifier};
use crate::veryl_token::VerylToken;
use crate::veryl_walker::VerylWalker;

#[derive(Default)]
pub struct Stringifier {
    string: String,
    ids: Vec<StrId>,
}

impl Stringifier {
    pub fn new() -> Self {
        Default::default()
    }

    pub fn as_str(&self) -> &str {
        &self.string
    }

    pub fn ids(&self) -> &[StrId] {
        &self.ids
    }

    pub fn hierarchical_identifier_with_prefix_suffix(
        &mut self,
        arg: &HierarchicalIdentifier,
        prefix: &Option<String>,
        suffix: &Option<String>,
    ) {
        let list_len = &arg.hierarchical_identifier_list0.len();

        if *list_len == 0 {
            self.identifier_with_prefix_suffix(&arg.identifier, prefix, suffix);
        } else {
            self.identifier(&arg.identifier);
        }

        for x in &arg.hierarchical_identifier_list {
            self.select(&x.select);
        }

        for (i, x) in arg.hierarchical_identifier_list0.iter().enumerate() {
            self.dot(&x.dot);
            if (i + 1) == *list_len {
                self.identifier_with_prefix_suffix(&x.identifier, prefix, suffix);
            } else {
                self.identifier(&x.identifier);
            }
            for x in &x.hierarchical_identifier_list0_list {
                self.select(&x.select);
            }
        }
    }

    fn identifier_with_prefix_suffix(
        &mut self,
        identifier: &Identifier,
        prefix: &Option<String>,
        suffix: &Option<String>,
    ) {
        if prefix.is_some() || suffix.is_some() {
            let token = identifier.identifier_token.append(prefix, suffix);
            self.veryl_token(&token);
        } else {
            self.veryl_token(&identifier.identifier_token);
        }
    }
}

impl VerylWalker for Stringifier {
    /// Semantic action for non-terminal 'VerylToken'
    fn veryl_token(&mut self, arg: &VerylToken) {
        self.string.push_str(&arg.to_string());
        self.ids.push(arg.token.text);
    }
}