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
27
# File 'lib/parser.rb', line 7

def parse_file
  # At present we ignore the header lines
  while !@lexer.peek(OboParser::Tokens::Term) && !@lexer.peek(OboParser::Tokens::Typedef)
    @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 > 20000 # there aren't that many words! 
    parse_term
    i += 1
  end

  i = 0
  while @lexer.peek(OboParser::Tokens::Typedef) 
    raise OboParser::ParseError,"infinite loop in Typedefs?" if i > 20000 
    parse_typedef
    i += 1
  end    

end

#parse_termObject



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/parser.rb', line 29

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) 
    begin
      
      if @lexer.peek(OboParser::Tokens::IsATag) 
        t = @lexer.pop(OboParser::Tokens::IsATag)
      elsif @lexer.peek(OboParser::Tokens::DisjointFromTag) 
        t = @lexer.pop(OboParser::Tokens::DisjointFromTag)
      elsif @lexer.peek(OboParser::Tokens::RelationshipTag) 
        t = @lexer.pop(OboParser::Tokens::RelationshipTag)
      else 
        t = @lexer.pop(OboParser::Tokens::TagValuePair)
      end
      tags.push(t) 

    rescue 
      raise 
    end
  end
  @builder.add_term(tags)
end

#parse_typedefObject



53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/parser.rb', line 53

def parse_typedef
  @lexer.pop(OboParser::Tokens::Typedef)
  tags = []
  while !@lexer.peek(OboParser::Tokens::Typedef) && @lexer.peek(OboParser::Tokens::TagValuePair)
    begin
      t = @lexer.pop(OboParser::Tokens::TagValuePair)
      tags.push(t) 
    rescue
      raise 
    end
  end
  @builder.add_typedef(tags)
end