Class: Antlr4::Runtime::Trees
- Inherits:
-
Object
- Object
- Antlr4::Runtime::Trees
- Defined in:
- lib/antlr4/runtime/trees.rb
Class Method Summary collapse
- ._find_all_nodes(t, index, find_tokens, nodes) ⇒ Object
- .ancestor_of?(t, u) ⇒ Boolean
- .ancestors(t) ⇒ Object
- .children(t) ⇒ Object
- .descendants(t) ⇒ Object
- .find_all_nodes(t, index, find_tokens) ⇒ Object
- .find_all_rule_nodes(t, rule_index) ⇒ Object
- .find_all_token_nodes(t, ttype) ⇒ Object
- .find_node_such_that(t, pred) ⇒ Object
- .node_text_recog(t, recog) ⇒ Object
- .node_text_rulenames(t, rule_names) ⇒ Object
- .root_of_subtree_enclosing_region(t, start_token_index, stop_token_index) ⇒ Object
- .strip_children_out_of_range(t, root, start_index, stop_index) ⇒ Object
- .to_s_tree_recog(t, recog = nil) ⇒ Object
- .to_s_tree_rulenames(t, rule_names) ⇒ Object
Class Method Details
._find_all_nodes(t, index, find_tokens, nodes) ⇒ Object
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/antlr4/runtime/trees.rb', line 111 def self._find_all_nodes(t, index, find_tokens, nodes) # check this node (the root) first if find_tokens && t.is_a?(TerminalNode) tnode = t nodes.add(t) if tnode.getSymbol.type == index elsif !find_tokens && t.is_a(ParserRuleContext) ctx = t nodes.push(t) if ctx.rule_index == index end # check children i = 0 while i < t.child_count _find_all_nodes(t.child(i), index, find_tokens, nodes) i += 1 end end |
.ancestor_of?(t, u) ⇒ Boolean
85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/antlr4/runtime/trees.rb', line 85 def self.ancestor_of?(t, u) return false if t.nil? || u.nil? || t.get_parent.nil? p = u.get_parent until p.nil? return true if t == p p = p.get_parent end false end |
.ancestors(t) ⇒ Object
73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/antlr4/runtime/trees.rb', line 73 def self.ancestors(t) return [] if t.get_parent.nil? ancestors = [] t = t.get_parent until t.nil? ancestors.unshift(t) # insert at start t = t.get_parent end ancestors end |
.children(t) ⇒ Object
62 63 64 65 66 67 68 69 70 71 |
# File 'lib/antlr4/runtime/trees.rb', line 62 def self.children(t) kids = [] i = 0 while i < t.child_count kids << t.child(i) i += 1 end kids end |
.descendants(t) ⇒ Object
128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/antlr4/runtime/trees.rb', line 128 def self.descendants(t) nodes = [] nodes.push(t) n = t.child_count i = 0 while i < n nodes.add_all(descendants(t.child(i))) i += 1 end nodes end |
.find_all_nodes(t, index, find_tokens) ⇒ Object
105 106 107 108 109 |
# File 'lib/antlr4/runtime/trees.rb', line 105 def self.find_all_nodes(t, index, find_tokens) nodes = [] _find_all_nodes(t, index, find_tokens, nodes) nodes end |
.find_all_rule_nodes(t, rule_index) ⇒ Object
101 102 103 |
# File 'lib/antlr4/runtime/trees.rb', line 101 def self.find_all_rule_nodes(t, rule_index) find_all_nodes(t, rule_index, false) end |
.find_all_token_nodes(t, ttype) ⇒ Object
97 98 99 |
# File 'lib/antlr4/runtime/trees.rb', line 97 def self.find_all_token_nodes(t, ttype) find_all_nodes(t, ttype, true) end |
.find_node_such_that(t, pred) ⇒ Object
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 |
# File 'lib/antlr4/runtime/trees.rb', line 179 def self.find_node_such_that(t, pred) return t if pred.test(t) return nil if t.nil? n = t.child_count i = 0 while i < n u = find_node_such_that(t.child(i), pred) return u unless u.nil? i += 1 end nil end |
.node_text_recog(t, recog) ⇒ Object
28 29 30 31 32 |
# File 'lib/antlr4/runtime/trees.rb', line 28 def self.node_text_recog(t, recog) rule_names = !recog.nil? ? recog.rule_names : nil rule_names_list = !rule_names.nil? ? rule_names : nil getNodeText(t, rule_names_list) end |
.node_text_rulenames(t, rule_names) ⇒ Object
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 |
# File 'lib/antlr4/runtime/trees.rb', line 34 def self.node_text_rulenames(t, rule_names) unless rule_names.nil? if t.is_a? RuleContext rule_index = t.rule_context.rule_index rule_name = rule_names[rule_index] alt_number = t.alt_number if alt_number != ATN::INVALID_ALT_NUMBER return rule_name + ':' + alt_number end return rule_name elsif t.is_a? ErrorNode return t.to_s elsif t.is_a? TerminalNode symbol = t.getSymbol unless symbol.nil? s = symbol.text return s end end end # no recog for rule names payload = t.payload return payload.text if payload.is_a Token t.payload.to_s end |
.root_of_subtree_enclosing_region(t, start_token_index, stop_token_index) ⇒ Object
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
# File 'lib/antlr4/runtime/trees.rb', line 141 def self.root_of_subtree_enclosing_region(t, start_token_index, stop_token_index) n = t.child_count i = 0 while i < n ParseTree child = t.child(i) ParserRuleContext r = root_of_subtree_enclosing_region(child, start_token_index, stop_token_index) return r unless r.nil? i += 1 end if t.is_a? ParserRuleContext r = t if start_token_index >= r.getStart.token_index && # is range fully contained in t? (r.getStop.nil? || stop_token_index <= r.getStop.token_index) # note: r.getStop()==nil likely implies that we bailed out of parser and there's nothing to the right return r end end nil end |
.strip_children_out_of_range(t, root, start_index, stop_index) ⇒ Object
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
# File 'lib/antlr4/runtime/trees.rb', line 163 def self.strip_children_out_of_range(t, root, start_index, stop_index) return if t.nil? i = 0 while i < t.child_count child = t.child(i) range = child.source_interval next unless child.is_a? ParserRuleContext && (range.b < start_index || range.a > stop_index) if ancestor_of?(child, root) # replace only if subtree doesn't have displayed root abbrev = CommonToken.new(Token::INVALID_TYPE) t.children.set(i, TerminalNodeImpl.new(abbrev)) end end end |
.to_s_tree_recog(t, recog = nil) ⇒ Object
3 4 5 6 7 |
# File 'lib/antlr4/runtime/trees.rb', line 3 def self.to_s_tree_recog(t, recog = nil) rule_names = !recog.nil? ? recog.rule_names : nil rule_names_list = !rule_names.nil? ? rule_names : nil to_s_tree_rulenames(t, rule_names_list) end |
.to_s_tree_rulenames(t, rule_names) ⇒ Object
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# File 'lib/antlr4/runtime/trees.rb', line 9 def self.to_s_tree_rulenames(t, rule_names) s = Utils.escape_whitespace(getNodeText(t, rule_names), false) return s if t.child_count == 0 buf = '' buf << '(' s = Utils.escape_whitespace(getNodeText(t, rule_names), false) buf << s buf << ' ' i = 0 while i < t.child_count buf << ' ' if i > 0 buf << to_string_tree(t.child(i), rule_names) i += 1 end buf << ')' buf end |