Class: NMEAPlus::Decoder

Inherits:
Parser
  • Object
show all
Defined in:
lib/nmea_plus/generated_parser/tokenizer.rb

Overview

The source file is in .rex format – indentation and most yard documentation is impossible. This class does a very basic parse of an input line, calling MessageFactory.create on the result. In parser.y, this is currently defined to be a NMEAMessageFactory if the line begins with ‘$` and AISMessageFactory if the line begins with `!`. In pratice, you should be using SourceDecoder (which wraps this class) to parse messages from an IO object; this class can only parse individual strings.

Defined Under Namespace

Classes: ScanError

Constant Summary

Constants inherited from Parser

Parser::Racc_arg, Parser::Racc_debug_parser, Parser::Racc_token_to_s_table

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Parser

#_reduce_none

Instance Attribute Details

#filenameObject (readonly)

Returns the value of attribute filename.



15
16
17
# File 'lib/nmea_plus/generated_parser/tokenizer.rb', line 15

def filename
  @filename
end

#linenoObject (readonly)

Returns the value of attribute lineno.



14
15
16
# File 'lib/nmea_plus/generated_parser/tokenizer.rb', line 14

def lineno
  @lineno
end

#stateObject

Returns the value of attribute state.



16
17
18
# File 'lib/nmea_plus/generated_parser/tokenizer.rb', line 16

def state
  @state
end

Instance Method Details

#_next_tokenObject



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/nmea_plus/generated_parser/tokenizer.rb', line 55

def _next_token
  text = @ss.peek(1)
  @lineno  +=  1  if text == "\n"
  token = case @state
  when nil
    case
    when (text = @ss.scan(/\*[0-9A-F]{2}[\w\n\r]*/i))
       action { [:CSUM, text[1..2]] }

    when (text = @ss.scan(/\$/i))
       action { [:CASH, text] }

    when (text = @ss.scan(/!/i))
       action { [:BANG, text] }

    when (text = @ss.scan(/[^\*]+/i))
       action { [:DATA, text] }

    else
      text = @ss.string[@ss.pos .. -1]
      raise  ScanError, "can not match: '" + text + "'"
    end  # if

  else
    raise  ScanError, "undefined state: '" + state.to_s + "'"
  end  # case state
  token
end

#actionObject



24
25
26
# File 'lib/nmea_plus/generated_parser/tokenizer.rb', line 24

def action
  yield
end

#load_file(filename) ⇒ Object



34
35
36
37
38
39
# File 'lib/nmea_plus/generated_parser/tokenizer.rb', line 34

def load_file( filename )
  @filename = filename
  open(filename, "r") do |f|
    scan_setup(f.read)
  end
end

#next_tokenObject



47
48
49
50
51
52
53
# File 'lib/nmea_plus/generated_parser/tokenizer.rb', line 47

def next_token
  return if @ss.eos?
  
  # skips empty actions
  until token = _next_token or @ss.eos?; end
  token
end

#parse(input) ⇒ Object

def _next_token



84
85
86
87
# File 'lib/nmea_plus/generated_parser/tokenizer.rb', line 84

def parse(input)
  @yydebug = true if ENV['DEBUG_RACC']
  scan_str(input)
end

#scan_file(filename) ⇒ Object



41
42
43
44
# File 'lib/nmea_plus/generated_parser/tokenizer.rb', line 41

def scan_file( filename )
  load_file(filename)
  do_parse
end

#scan_setup(str) ⇒ Object



18
19
20
21
22
# File 'lib/nmea_plus/generated_parser/tokenizer.rb', line 18

def scan_setup(str)
  @ss = StringScanner.new(str)
  @lineno =  1
  @state  = nil
end

#scan_str(str) ⇒ Object Also known as: scan



28
29
30
31
# File 'lib/nmea_plus/generated_parser/tokenizer.rb', line 28

def scan_str(str)
  scan_setup(str)
  do_parse
end

#tokenize(input) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
# File 'lib/nmea_plus/generated_parser/tokenizer.rb', line 88

def tokenize(input)
  scan_setup(input)
  ret = []
  last_token = nil
  loop do
    last_token = next_token
    break if last_token.nil?
    ret << last_token
  end
  ret
end