1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* This file is part of graze/csv-token |
4
|
|
|
* |
5
|
|
|
* Copyright (c) 2016 Nature Delivered Ltd. <https://www.graze.com> |
6
|
|
|
* |
7
|
|
|
* For the full copyright and license information, please view the LICENSE |
8
|
|
|
* file that was distributed with this source code. |
9
|
|
|
* |
10
|
|
|
* @license https://github.com/graze/csv-token/blob/master/LICENSE.md |
11
|
|
|
* @link https://github.com/graze/csv-token |
12
|
|
|
*/ |
13
|
|
|
|
14
|
|
|
namespace Graze\CsvToken\Tokeniser; |
15
|
|
|
|
16
|
|
|
use Graze\CsvToken\Tokeniser\Token\Token; |
17
|
|
|
use Graze\CsvToken\Tokeniser\Token\TokenStoreInterface; |
18
|
|
|
|
19
|
|
|
trait StateBuilder |
20
|
|
|
{ |
21
|
|
|
/** |
22
|
|
|
* @param TokenStoreInterface $tokenStore |
23
|
|
|
* |
24
|
|
|
* @return State The default starting state |
25
|
|
|
*/ |
26
|
30 |
|
public function buildStates(TokenStoreInterface $tokenStore) |
27
|
|
|
{ |
28
|
30 |
|
$initial = new State($tokenStore, State::S_INITIAL_TOKENS); |
29
|
30 |
|
$any = new State($tokenStore, State::S_ANY_TOKENS); |
30
|
30 |
|
$inQuote = new State($tokenStore, State::S_IN_QUOTE_TOKENS); |
31
|
30 |
|
$inEscape = new State($tokenStore, State::S_IN_ESCAPE_TOKENS); |
32
|
30 |
|
$inQuoteEscape = new State($tokenStore, State::S_IN_QUOTE_ESCAPE_TOKENS); |
33
|
|
|
|
34
|
30 |
|
$initial->addStateTarget(Token::T_ANY & ~Token::T_QUOTE & ~Token::T_ESCAPE, $any); |
35
|
30 |
|
$initial->addStateTarget(Token::T_QUOTE, $inQuote); |
36
|
30 |
|
$initial->addStateTarget(Token::T_ESCAPE, $inEscape); |
37
|
|
|
|
38
|
|
|
// generate state mapping |
39
|
30 |
|
$any->addStateTarget(Token::T_ANY & ~Token::T_QUOTE & ~Token::T_ESCAPE, $any); |
40
|
30 |
|
$any->addStateTarget(Token::T_QUOTE, $inQuote); |
41
|
30 |
|
$any->addStateTarget(Token::T_ESCAPE, $inEscape); |
42
|
|
|
|
43
|
30 |
|
$inQuote->addStateTarget(Token::T_CONTENT | Token::T_DOUBLE_QUOTE, $inQuote); |
44
|
30 |
|
$inQuote->addStateTarget(Token::T_QUOTE, $any); |
45
|
30 |
|
$inQuote->addStateTarget(Token::T_ESCAPE, $inQuoteEscape); |
46
|
|
|
|
47
|
30 |
|
$inEscape->addStateTarget(Token::T_CONTENT, $any); |
48
|
|
|
|
49
|
30 |
|
$inQuoteEscape->addStateTarget(Token::T_CONTENT, $inQuote); |
50
|
|
|
|
51
|
30 |
|
return $initial; |
52
|
|
|
} |
53
|
|
|
} |
54
|
|
|
|