def self.parse(data)
data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)
raise Mail::Field::NilParseError.new(Mail::PhraseList) if data.nil?
phrase_lists = PhraseListsStruct.new([])
phrase_s = nil
p = 0
eof = pe = data.length
stack = []
begin
p ||= 0
pe ||= data.length
cs = start
top = 0
end
begin
testEof = false
_slen, _trans, _keys, _inds, _acts, _nacts = nil
_goto_level = 0
_resume = 10
_eof_trans = 15
_again = 20
_test_eof = 30
_out = 40
while true
if _goto_level <= 0
if p == pe
_goto_level = _test_eof
next
end
if cs == 0
_goto_level = _out
next
end
end
if _goto_level <= _resume
_keys = cs << 1
_inds = _index_offsets[cs]
_slen = _key_spans[cs]
_wide = data[p].ord
_trans = if (_slen > 0 &&
_trans_keys[_keys] <= _wide &&
_wide <= _trans_keys[_keys + 1])
_indicies[_inds + _wide - _trans_keys[_keys]]
else
_indicies[_inds + _slen]
end
cs = _trans_targs[_trans]
if _trans_actions[_trans] != 0
case _trans_actions[_trans]
when 1
begin
phrase_s = p
end
when 13
begin
phrase_lists.phrases << chars(data, phrase_s, p - 1) if phrase_s
phrase_s = nil
end
when 7
begin
end
when 9
begin
end
when 6
begin
end
when 4
begin
end
when 3
begin
begin
stack[top] = cs
top += 1
cs = 30
_goto_level = _again
next
end
end
when 12
begin
begin
top -= 1
cs = stack[top]
_goto_level = _again
next
end
end
when 2
begin
phrase_s = p
end
begin
begin
stack[top] = cs
top += 1
cs = 30
_goto_level = _again
next
end
end
when 14
begin
end
begin
phrase_lists.phrases << chars(data, phrase_s, p - 1) if phrase_s
phrase_s = nil
end
when 8
begin
end
begin
begin
stack[top] = cs
top += 1
cs = 30
_goto_level = _again
next
end
end
when 10
begin
end
begin
begin
stack[top] = cs
top += 1
cs = 30
_goto_level = _again
next
end
end
when 11
begin
end
begin
begin
top -= 1
cs = stack[top]
_goto_level = _again
next
end
end
when 5
begin
end
begin
end
end
end
end
if _goto_level <= _again
if cs == 0
_goto_level = _out
next
end
p += 1
if p != pe
_goto_level = _resume
next
end
end
if _goto_level <= _test_eof
if p == eof
case _eof_actions[cs]
when 13
begin
phrase_lists.phrases << chars(data, phrase_s, p - 1) if phrase_s
phrase_s = nil
end
when 14
begin
end
begin
phrase_lists.phrases << chars(data, phrase_s, p - 1) if phrase_s
phrase_s = nil
end
end
end
end
if _goto_level <= _out
break
end
end
end
if p != eof || cs < 42
raise Mail::Field::IncompleteParseError.new(Mail::PhraseList, data, p)
end
phrase_lists
end