Class: OboParser::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/parser.rb

Instance Method Summary collapse

Constructor Details

#initialize(lexer, builder) ⇒ Parser

Returns a new instance of Parser.



2
3
4
5
# File 'lib/parser.rb', line 2

def initialize(lexer, builder)
  @lexer = lexer
  @builder = builder
end

Instance Method Details

#parse_fileObject



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/parser.rb', line 7

def parse_file
  # toss everything right now, we just want the terms
  while !@lexer.peek(OboParser::Tokens::Term)
    @lexer.pop(OboParser::Tokens::TagValuePair)
  end

  i = 0
  while !@lexer.peek(OboParser::Tokens::Typedef) && !@lexer.peek(OboParser::Tokens::EndOfFile)
    raise OboParser::ParseError, "infinite loop in Terms" if i > 10000000 
    parse_term
    i += 1
  end

  i = 0
  while @lexer.peek(OboParser::Tokens::Typedef) 
    raise OboParser::ParseError,"infinite loop in Terms" if i > 1000000 # there aren't that many words!
    parse_typedef
    i += 1
  end    
end

#parse_termObject



28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/parser.rb', line 28

def parse_term
  t = @lexer.pop(OboParser::Tokens::Term)
  tags = []
  while !@lexer.peek(OboParser::Tokens::Term) && !@lexer.peek(OboParser::Tokens::Typedef) && !@lexer.peek(OboParser::Tokens::EndOfFile) 
    if @lexer.peek(OboParser::Tokens::TagValuePair)
      t = @lexer.pop(OboParser::Tokens::TagValuePair)
      tags.push [t.tag, t.value]
    else
      raise(OboParser::ParseError, "Expected a tag-value pair, but did not get one following this tag/value: [#{t.tag} / #{t.value}]")
    end
  end
  @builder.add_term(tags)
end

#parse_typedefObject



42
43
44
45
46
47
48
49
50
51
# File 'lib/parser.rb', line 42

def parse_typedef
  @lexer.pop(OboParser::Tokens::Typedef)
  #  @t = @builder.stub_typdef
  tags = []
  while !@lexer.peek(OboParser::Tokens::Typedef) && @lexer.peek(OboParser::Tokens::TagValuePair)
    t = @lexer.pop(OboParser::Tokens::TagValuePair)
    tags.push [t.tag, t.value]
  end
  @builder.add_typedef(tags)
end