Class: Lrama::Grammar::Symbols::Resolver

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeResolver

Returns a new instance of Resolver.



9
10
11
12
# File 'lib/lrama/grammar/symbols/resolver.rb', line 9

def initialize
  @terms = []
  @nterms = []
end

Instance Attribute Details

#ntermsObject (readonly)

Returns the value of attribute nterms.



7
8
9
# File 'lib/lrama/grammar/symbols/resolver.rb', line 7

def nterms
  @nterms
end

#termsObject (readonly)

Returns the value of attribute terms.



7
8
9
# File 'lib/lrama/grammar/symbols/resolver.rb', line 7

def terms
  @terms
end

Instance Method Details

#add_nterm(id:, alias_name: nil, tag: nil) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/lrama/grammar/symbols/resolver.rb', line 46

def add_nterm(id:, alias_name: nil, tag: nil)
  if (sym = find_symbol_by_id(id))
    return sym
  end

  @symbols = nil
  nterm = Symbol.new(
    id: id, alias_name: alias_name, number: nil, tag: tag,
    term: false, token_id: nil, nullable: nil,
  )
  @nterms << nterm
  nterm
end

#add_term(id:, alias_name: nil, tag: nil, token_id: nil, replace: false) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/lrama/grammar/symbols/resolver.rb', line 22

def add_term(id:, alias_name: nil, tag: nil, token_id: nil, replace: false)
  if token_id && (sym = find_symbol_by_token_id(token_id))
    if replace
      sym.id = id
      sym.alias_name = alias_name
      sym.tag = tag
    end

    return sym
  end

  if (sym = find_symbol_by_id(id))
    return sym
  end

  @symbols = nil
  term = Symbol.new(
    id: id, alias_name: alias_name, number: nil, tag: tag,
    term: true, token_id: token_id, nullable: false
  )
  @terms << term
  term
end

#fill_destructor(destructors) ⇒ Object



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/lrama/grammar/symbols/resolver.rb', line 129

def fill_destructor(destructors)
  symbols.each do |sym|
    destructors.each do |destructor|
      destructor.ident_or_tags.each do |ident_or_tag|
        case ident_or_tag
        when Lrama::Lexer::Token::Ident
          sym.destructor = destructor if sym.id == ident_or_tag
        when Lrama::Lexer::Token::Tag
          sym.destructor = destructor if sym.tag == ident_or_tag
        else
          raise "Unknown token type. #{destructor}"
        end
      end
    end
  end
end

#fill_error_token(error_tokens) ⇒ Object



146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# File 'lib/lrama/grammar/symbols/resolver.rb', line 146

def fill_error_token(error_tokens)
  symbols.each do |sym|
    error_tokens.each do |token|
      token.ident_or_tags.each do |ident_or_tag|
        case ident_or_tag
        when Lrama::Lexer::Token::Ident
          sym.error_token = token if sym.id == ident_or_tag
        when Lrama::Lexer::Token::Tag
          sym.error_token = token if sym.tag == ident_or_tag
        else
          raise "Unknown token type. #{token}"
        end
      end
    end
  end
end

#fill_nterm_type(types) ⇒ Object



105
106
107
108
109
110
# File 'lib/lrama/grammar/symbols/resolver.rb', line 105

def fill_nterm_type(types)
  types.each do |type|
    nterm = find_nterm_by_id!(type.id)
    nterm.tag = type.tag
  end
end

#fill_printer(printers) ⇒ Object



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/lrama/grammar/symbols/resolver.rb', line 112

def fill_printer(printers)
  symbols.each do |sym|
    printers.each do |printer|
      printer.ident_or_tags.each do |ident_or_tag|
        case ident_or_tag
        when Lrama::Lexer::Token::Ident
          sym.printer = printer if sym.id == ident_or_tag
        when Lrama::Lexer::Token::Tag
          sym.printer = printer if sym.tag == ident_or_tag
        else
          raise "Unknown token type. #{printer}"
        end
      end
    end
  end
end

#fill_symbol_numberObject



95
96
97
98
99
100
101
102
103
# File 'lib/lrama/grammar/symbols/resolver.rb', line 95

def fill_symbol_number
  # YYEMPTY = -2
  # YYEOF   =  0
  # YYerror =  1
  # YYUNDEF =  2
  @number = 3
  fill_terms_number
  fill_nterms_number
end

#find_symbol_by_id(id) ⇒ Object



72
73
74
75
76
# File 'lib/lrama/grammar/symbols/resolver.rb', line 72

def find_symbol_by_id(id)
  symbols.find do |s|
    s.id == id || s.alias_name == id.s_value
  end
end

#find_symbol_by_id!(id) ⇒ Object



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

def find_symbol_by_id!(id)
  find_symbol_by_id(id) || (raise "Symbol not found. #{id}")
end

#find_symbol_by_number!(number) ⇒ Object



86
87
88
89
90
91
92
93
# File 'lib/lrama/grammar/symbols/resolver.rb', line 86

def find_symbol_by_number!(number)
  sym = symbols[number]

  raise "Symbol not found. number: `#{number}`" unless sym
  raise "[BUG] Symbol number mismatch. #{number}, #{sym}" if sym.number != number

  sym
end

#find_symbol_by_s_value(s_value) ⇒ Object



64
65
66
# File 'lib/lrama/grammar/symbols/resolver.rb', line 64

def find_symbol_by_s_value(s_value)
  symbols.find { |s| s.id.s_value == s_value }
end

#find_symbol_by_s_value!(s_value) ⇒ Object



68
69
70
# File 'lib/lrama/grammar/symbols/resolver.rb', line 68

def find_symbol_by_s_value!(s_value)
  find_symbol_by_s_value(s_value) || (raise "Symbol not found. value: `#{s_value}`")
end

#find_symbol_by_token_id(token_id) ⇒ Object



82
83
84
# File 'lib/lrama/grammar/symbols/resolver.rb', line 82

def find_symbol_by_token_id(token_id)
  symbols.find {|s| s.token_id == token_id }
end

#find_term_by_s_value(s_value) ⇒ Object



60
61
62
# File 'lib/lrama/grammar/symbols/resolver.rb', line 60

def find_term_by_s_value(s_value)
  terms.find { |s| s.id.s_value == s_value }
end

#sort_by_number!Object



18
19
20
# File 'lib/lrama/grammar/symbols/resolver.rb', line 18

def sort_by_number!
  symbols.sort_by!(&:number)
end

#symbolsObject



14
15
16
# File 'lib/lrama/grammar/symbols/resolver.rb', line 14

def symbols
  @symbols ||= (@terms + @nterms)
end

#token_to_symbol(token) ⇒ Object



163
164
165
166
167
168
169
170
# File 'lib/lrama/grammar/symbols/resolver.rb', line 163

def token_to_symbol(token)
  case token
  when Lrama::Lexer::Token
    find_symbol_by_id!(token)
  else
    raise "Unknown class: #{token}"
  end
end

#validate!Object



172
173
174
175
# File 'lib/lrama/grammar/symbols/resolver.rb', line 172

def validate!
  validate_number_uniqueness!
  validate_alias_name_uniqueness!
end