Class: NMEAPlus::Decoder
- Inherits:
-
Parser
- Object
- Racc::Parser
- Parser
- NMEAPlus::Decoder
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
#filename ⇒ Object
Returns the value of attribute filename.
15
16
17
|
# File 'lib/nmea_plus/generated_parser/tokenizer.rb', line 15
def filename
@filename
end
|
#lineno ⇒ Object
Returns the value of attribute lineno.
14
15
16
|
# File 'lib/nmea_plus/generated_parser/tokenizer.rb', line 14
def lineno
@lineno
end
|
#state ⇒ Object
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_token ⇒ Object
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
else
raise ScanError, "undefined state: '" + state.to_s + "'"
end token
end
|
#action ⇒ Object
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_token ⇒ Object
47
48
49
50
51
52
53
|
# File 'lib/nmea_plus/generated_parser/tokenizer.rb', line 47
def next_token
return if @ss.eos?
until token = _next_token or @ss.eos?; end
token
end
|
#parse(input) ⇒ Object
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
|