Class: Lrama::Grammar::RuleBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/lrama/grammar/rule_builder.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(rule_counter, midrule_action_counter, parameterized_resolver, position_in_original_rule_rhs = nil, lhs_tag: nil, skip_preprocess_references: false) ⇒ RuleBuilder

Returns a new instance of RuleBuilder.



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/lrama/grammar/rule_builder.rb', line 32

def initialize(rule_counter, midrule_action_counter, parameterized_resolver, position_in_original_rule_rhs = nil, lhs_tag: nil, skip_preprocess_references: false)
  @rule_counter = rule_counter
  @midrule_action_counter = midrule_action_counter
  @parameterized_resolver = parameterized_resolver
  @position_in_original_rule_rhs = position_in_original_rule_rhs
  @skip_preprocess_references = skip_preprocess_references

  @lhs = nil
  @lhs_tag = lhs_tag
  @rhs = []
  @user_code = nil
  @precedence_sym = nil
  @line = nil
  @rules = []
  @rule_builders_for_parameterized = []
  @rule_builders_for_derived_rules = []
  @parameterized_rules = []
  @midrule_action_rules = []
end

Instance Attribute Details

#lhsObject

TODO: rbs-inline 0.11.0 doesn't support instance variables. Move these type declarations above instance variable definitions, once it's supported. see: https://github.com/soutaro/rbs-inline/pull/149

@rbs! @position_in_original_rule_rhs: Integer? @skip_preprocess_references: bool @rules: Array @rule_builders_for_parameterized: Array @rule_builders_for_derived_rules: Array @parameterized_rules: Array @midrule_action_rules: Array @replaced_rhs: Array?



21
22
23
# File 'lib/lrama/grammar/rule_builder.rb', line 21

def lhs
  @lhs
end

#lhs_tagObject (readonly)

: Lexer::Token::Tag?



26
27
28
# File 'lib/lrama/grammar/rule_builder.rb', line 26

def lhs_tag
  @lhs_tag
end

#lineObject

: Integer?



22
23
24
# File 'lib/lrama/grammar/rule_builder.rb', line 22

def line
  @line
end

#midrule_action_counterObject (readonly)

: Counter



24
25
26
# File 'lib/lrama/grammar/rule_builder.rb', line 24

def midrule_action_counter
  @midrule_action_counter
end

#parameterized_resolverObject (readonly)

: Grammar::Parameterized::Resolver



25
26
27
# File 'lib/lrama/grammar/rule_builder.rb', line 25

def parameterized_resolver
  @parameterized_resolver
end

#precedence_symObject

: Grammar::Symbol?



29
30
31
# File 'lib/lrama/grammar/rule_builder.rb', line 29

def precedence_sym
  @precedence_sym
end

#rhsObject (readonly)

: Array



27
28
29
# File 'lib/lrama/grammar/rule_builder.rb', line 27

def rhs
  @rhs
end

#rule_counterObject (readonly)

: Counter



23
24
25
# File 'lib/lrama/grammar/rule_builder.rb', line 23

def rule_counter
  @rule_counter
end

#user_codeObject

: Lexer::Token::UserCode?



28
29
30
# File 'lib/lrama/grammar/rule_builder.rb', line 28

def user_code
  @user_code
end

Instance Method Details

#add_rhs(rhs) ⇒ Object



53
54
55
56
57
58
59
# File 'lib/lrama/grammar/rule_builder.rb', line 53

def add_rhs(rhs)
  @line ||= rhs.line

  flush_user_code

  @rhs << rhs
end

#complete_inputObject



78
79
80
# File 'lib/lrama/grammar/rule_builder.rb', line 78

def complete_input
  freeze_rhs
end

#has_inline_rules?Boolean

Returns:

  • (Boolean)


96
97
98
# File 'lib/lrama/grammar/rule_builder.rb', line 96

def has_inline_rules?
  rhs.any? { |token| @parameterized_resolver.find_inline(token) }
end

#rulesObject



91
92
93
# File 'lib/lrama/grammar/rule_builder.rb', line 91

def rules
  @parameterized_rules + @midrule_action_rules + @rules
end

#setup_rulesObject



83
84
85
86
87
88
# File 'lib/lrama/grammar/rule_builder.rb', line 83

def setup_rules
  preprocess_references unless @skip_preprocess_references
  process_rhs
  resolve_inline_rules
  build_rules
end