1
0
mirror of https://github.com/danog/liquid.git synced 2024-11-30 08:28:58 +01:00
liquid/expressions/scanner.go
2017-07-20 09:12:31 -04:00

667 lines
13 KiB
Go

//line scanner.rl:1
package expressions
import "strconv"
//line scanner.go:9
var _expression_actions []byte = []byte{
0, 1, 0, 1, 1, 1, 2, 1, 10,
1, 11, 1, 12, 1, 13, 1, 14,
1, 15, 1, 16, 1, 17, 1, 18,
1, 19, 1, 20, 1, 21, 1, 22,
1, 23, 1, 24, 1, 25, 1, 26,
1, 27, 1, 28, 1, 29, 1, 30,
1, 31, 2, 2, 3, 2, 2, 4,
2, 2, 5, 2, 2, 6, 2, 2,
7, 2, 2, 8, 2, 2, 9,
}
var _expression_key_offsets []int16 = []int16{
0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 14, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25,
52, 55, 56, 57, 59, 60, 62, 65,
67, 73, 82, 83, 84, 85, 95, 96,
107, 118, 129, 140, 151, 162, 173, 184,
195, 206, 217, 228, 239, 250, 261, 272,
283, 294, 305,
}
var _expression_trans_keys []byte = []byte{
34, 115, 115, 105, 103, 110, 32, 111,
111, 112, 32, 39, 48, 57, 99, 119,
121, 99, 108, 101, 32, 104, 101, 110,
32, 32, 33, 34, 37, 39, 45, 46,
60, 61, 62, 95, 97, 99, 102, 105,
110, 111, 116, 123, 9, 13, 48, 57,
65, 90, 98, 122, 32, 9, 13, 61,
34, 97, 108, 39, 48, 57, 46, 48,
57, 48, 57, 46, 95, 65, 90, 97,
122, 45, 63, 95, 48, 57, 65, 90,
97, 122, 61, 61, 61, 45, 58, 63,
95, 48, 57, 65, 90, 97, 122, 58,
45, 58, 63, 95, 110, 48, 57, 65,
90, 97, 122, 45, 58, 63, 95, 100,
48, 57, 65, 90, 97, 122, 45, 58,
63, 95, 111, 48, 57, 65, 90, 97,
122, 45, 58, 63, 95, 110, 48, 57,
65, 90, 97, 122, 45, 58, 63, 95,
116, 48, 57, 65, 90, 97, 122, 45,
58, 63, 95, 97, 48, 57, 65, 90,
98, 122, 45, 58, 63, 95, 105, 48,
57, 65, 90, 97, 122, 45, 58, 63,
95, 110, 48, 57, 65, 90, 97, 122,
45, 58, 63, 95, 115, 48, 57, 65,
90, 97, 122, 45, 58, 63, 95, 97,
48, 57, 65, 90, 98, 122, 45, 58,
63, 95, 108, 48, 57, 65, 90, 97,
122, 45, 58, 63, 95, 115, 48, 57,
65, 90, 97, 122, 45, 58, 63, 95,
101, 48, 57, 65, 90, 97, 122, 45,
58, 63, 95, 110, 48, 57, 65, 90,
97, 122, 45, 58, 63, 95, 105, 48,
57, 65, 90, 97, 122, 45, 58, 63,
95, 108, 48, 57, 65, 90, 97, 122,
45, 58, 63, 95, 114, 48, 57, 65,
90, 97, 122, 45, 58, 63, 95, 114,
48, 57, 65, 90, 97, 122, 45, 58,
63, 95, 117, 48, 57, 65, 90, 97,
122, 37,
}
var _expression_single_lengths []byte = []byte{
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 0, 2, 1, 1,
1, 1, 1, 1, 1, 1, 1, 19,
1, 1, 1, 2, 1, 0, 1, 0,
2, 3, 1, 1, 1, 4, 1, 5,
5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 1,
}
var _expression_range_lengths []byte = []byte{
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 4,
1, 0, 0, 0, 0, 1, 1, 1,
2, 3, 0, 0, 0, 3, 0, 3,
3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 0,
}
var _expression_index_offsets []int16 = []int16{
0, 2, 4, 6, 8, 10, 12, 14,
16, 18, 20, 22, 24, 26, 29, 31,
33, 35, 37, 39, 41, 43, 45, 47,
71, 74, 76, 78, 81, 83, 85, 88,
90, 95, 102, 104, 106, 108, 116, 118,
127, 136, 145, 154, 163, 172, 181, 190,
199, 208, 217, 226, 235, 244, 253, 262,
271, 280, 289,
}
var _expression_indicies []byte = []byte{
2, 1, 3, 0, 4, 0, 5, 0,
6, 0, 7, 0, 8, 0, 9, 0,
10, 0, 11, 0, 12, 0, 2, 13,
15, 14, 16, 17, 0, 18, 0, 19,
0, 20, 0, 21, 0, 22, 0, 23,
0, 24, 0, 25, 0, 26, 0, 28,
29, 30, 31, 32, 33, 34, 36, 37,
38, 39, 40, 41, 42, 43, 44, 45,
46, 47, 28, 35, 39, 39, 27, 28,
28, 48, 50, 49, 2, 1, 51, 52,
49, 2, 13, 35, 49, 54, 35, 53,
15, 55, 56, 57, 57, 57, 49, 57,
59, 57, 57, 57, 57, 58, 60, 49,
61, 49, 62, 49, 39, 64, 65, 39,
39, 39, 39, 63, 64, 66, 39, 64,
65, 39, 67, 39, 39, 39, 66, 39,
64, 65, 39, 68, 39, 39, 39, 66,
39, 64, 65, 39, 69, 39, 39, 39,
66, 39, 64, 65, 39, 70, 39, 39,
39, 66, 39, 64, 65, 39, 71, 39,
39, 39, 66, 39, 64, 65, 39, 72,
39, 39, 39, 66, 39, 64, 65, 39,
73, 39, 39, 39, 66, 39, 64, 65,
39, 74, 39, 39, 39, 66, 39, 64,
65, 39, 75, 39, 39, 39, 66, 39,
64, 65, 39, 76, 39, 39, 39, 66,
39, 64, 65, 39, 77, 39, 39, 39,
66, 39, 64, 65, 39, 78, 39, 39,
39, 66, 39, 64, 65, 39, 79, 39,
39, 39, 66, 39, 64, 65, 39, 80,
39, 39, 39, 66, 39, 64, 65, 39,
81, 39, 39, 39, 66, 39, 64, 65,
39, 82, 39, 39, 39, 66, 39, 64,
65, 39, 83, 39, 39, 39, 66, 39,
64, 65, 39, 84, 39, 39, 39, 66,
39, 64, 65, 39, 78, 39, 39, 39,
66, 85, 49,
}
var _expression_trans_targs []byte = []byte{
23, 0, 23, 2, 3, 4, 5, 6,
23, 8, 9, 10, 23, 11, 23, 31,
14, 19, 15, 16, 17, 18, 23, 20,
21, 22, 23, 23, 24, 25, 26, 27,
28, 29, 32, 30, 34, 35, 36, 37,
39, 41, 48, 52, 53, 55, 56, 58,
23, 23, 23, 1, 7, 23, 12, 23,
23, 33, 23, 23, 23, 23, 23, 23,
23, 38, 23, 40, 37, 42, 43, 44,
45, 46, 47, 37, 49, 50, 51, 37,
37, 54, 37, 37, 57, 13,
}
var _expression_trans_actions []byte = []byte{
47, 0, 15, 0, 0, 0, 0, 0,
7, 0, 0, 0, 11, 0, 45, 0,
0, 0, 0, 0, 0, 0, 9, 0,
0, 0, 13, 31, 0, 0, 5, 5,
5, 0, 0, 5, 0, 0, 0, 69,
0, 0, 0, 0, 0, 0, 0, 5,
41, 43, 19, 0, 0, 33, 0, 35,
25, 0, 39, 29, 23, 17, 21, 49,
27, 0, 37, 0, 57, 0, 0, 0,
0, 0, 0, 63, 0, 0, 0, 51,
66, 0, 54, 60, 0, 0,
}
var _expression_to_state_actions []byte = []byte{
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0,
}
var _expression_from_state_actions []byte = []byte{
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 3,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0,
}
var _expression_eof_trans []int16 = []int16{
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 15, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 0,
49, 50, 50, 50, 50, 50, 54, 56,
50, 59, 50, 50, 50, 64, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 50,
}
const expression_start int = 23
const expression_first_final int = 23
const expression_error int = -1
const expression_en_main int = 23
//line scanner.rl:11
type lexer struct {
parseValue
data []byte
p, pe, cs int
ts, te, act int
}
func (l *lexer) token() string {
return string(l.data[l.ts:l.te])
}
func newLexer(data []byte) *lexer {
lex := &lexer{
data: data,
pe: len(data),
}
//line scanner.go:236
{
lex.cs = expression_start
lex.ts = 0
lex.te = 0
lex.act = 0
}
//line scanner.rl:30
return lex
}
func (lex *lexer) Lex(out *yySymType) int {
eof := lex.pe
tok := 0
//line scanner.go:253
{
var _klen int
var _trans int
var _acts int
var _nacts uint
var _keys int
if (lex.p) == (lex.pe) {
goto _test_eof
}
_resume:
_acts = int(_expression_from_state_actions[lex.cs])
_nacts = uint(_expression_actions[_acts])
_acts++
for ; _nacts > 0; _nacts-- {
_acts++
switch _expression_actions[_acts-1] {
case 1:
//line NONE:1
lex.ts = (lex.p)
//line scanner.go:273
}
}
_keys = int(_expression_key_offsets[lex.cs])
_trans = int(_expression_index_offsets[lex.cs])
_klen = int(_expression_single_lengths[lex.cs])
if _klen > 0 {
_lower := int(_keys)
var _mid int
_upper := int(_keys + _klen - 1)
for {
if _upper < _lower {
break
}
_mid = _lower + ((_upper - _lower) >> 1)
switch {
case lex.data[(lex.p)] < _expression_trans_keys[_mid]:
_upper = _mid - 1
case lex.data[(lex.p)] > _expression_trans_keys[_mid]:
_lower = _mid + 1
default:
_trans += int(_mid - int(_keys))
goto _match
}
}
_keys += _klen
_trans += _klen
}
_klen = int(_expression_range_lengths[lex.cs])
if _klen > 0 {
_lower := int(_keys)
var _mid int
_upper := int(_keys + (_klen << 1) - 2)
for {
if _upper < _lower {
break
}
_mid = _lower + (((_upper - _lower) >> 1) & ^1)
switch {
case lex.data[(lex.p)] < _expression_trans_keys[_mid]:
_upper = _mid - 2
case lex.data[(lex.p)] > _expression_trans_keys[_mid+1]:
_lower = _mid + 2
default:
_trans += int((_mid - int(_keys)) >> 1)
goto _match
}
}
_trans += _klen
}
_match:
_trans = int(_expression_indicies[_trans])
_eof_trans:
lex.cs = int(_expression_trans_targs[_trans])
if _expression_trans_actions[_trans] == 0 {
goto _again
}
_acts = int(_expression_trans_actions[_trans])
_nacts = uint(_expression_actions[_acts])
_acts++
for ; _nacts > 0; _nacts-- {
_acts++
switch _expression_actions[_acts-1] {
case 2:
//line NONE:1
lex.te = (lex.p) + 1
case 3:
//line scanner.rl:38
lex.act = 8
case 4:
//line scanner.rl:95
lex.act = 9
case 5:
//line scanner.rl:102
lex.act = 14
case 6:
//line scanner.rl:103
lex.act = 15
case 7:
//line scanner.rl:104
lex.act = 16
case 8:
//line scanner.rl:107
lex.act = 17
case 9:
//line scanner.rl:43
lex.act = 20
case 10:
//line scanner.rl:83
lex.te = (lex.p) + 1
{
tok = ASSIGN
(lex.p)++
goto _out
}
case 11:
//line scanner.rl:84
lex.te = (lex.p) + 1
{
tok = CYCLE
(lex.p)++
goto _out
}
case 12:
//line scanner.rl:85
lex.te = (lex.p) + 1
{
tok = LOOP
(lex.p)++
goto _out
}
case 13:
//line scanner.rl:86
lex.te = (lex.p) + 1
{
tok = WHEN
(lex.p)++
goto _out
}
case 14:
//line scanner.rl:66
lex.te = (lex.p) + 1
{
tok = LITERAL
// TODO unescape \x
out.val = string(lex.data[lex.ts+1 : lex.te-1])
(lex.p)++
goto _out
}
case 15:
//line scanner.rl:98
lex.te = (lex.p) + 1
{
tok = EQ
(lex.p)++
goto _out
}
case 16:
//line scanner.rl:99
lex.te = (lex.p) + 1
{
tok = NEQ
(lex.p)++
goto _out
}
case 17:
//line scanner.rl:100
lex.te = (lex.p) + 1
{
tok = GE
(lex.p)++
goto _out
}
case 18:
//line scanner.rl:101
lex.te = (lex.p) + 1
{
tok = LE
(lex.p)++
goto _out
}
case 19:
//line scanner.rl:108
lex.te = (lex.p) + 1
{
tok = DOTDOT
(lex.p)++
goto _out
}
case 20:
//line scanner.rl:110
lex.te = (lex.p) + 1
{
tok = KEYWORD
out.name = string(lex.data[lex.ts : lex.te-1])
(lex.p)++
goto _out
}
case 21:
//line scanner.rl:112
lex.te = (lex.p) + 1
{
tok = PROPERTY
out.name = string(lex.data[lex.ts+1 : lex.te])
(lex.p)++
goto _out
}
case 22:
//line scanner.rl:115
lex.te = (lex.p) + 1
{
tok = int(lex.data[lex.ts])
(lex.p)++
goto _out
}
case 23:
//line scanner.rl:48
lex.te = (lex.p)
(lex.p)--
{
tok = LITERAL
n, err := strconv.ParseInt(lex.token(), 10, 64)
if err != nil {
panic(err)
}
out.val = int(n)
(lex.p)++
goto _out
}
case 24:
//line scanner.rl:57
lex.te = (lex.p)
(lex.p)--
{
tok = LITERAL
n, err := strconv.ParseFloat(lex.token(), 64)
if err != nil {
panic(err)
}
out.val = n
(lex.p)++
goto _out
}
case 25:
//line scanner.rl:43
lex.te = (lex.p)
(lex.p)--
{
tok = IDENTIFIER
out.name = lex.token()
(lex.p)++
goto _out
}
case 26:
//line scanner.rl:112
lex.te = (lex.p)
(lex.p)--
{
tok = PROPERTY
out.name = string(lex.data[lex.ts+1 : lex.te])
(lex.p)++
goto _out
}
case 27:
//line scanner.rl:114
lex.te = (lex.p)
(lex.p)--
case 28:
//line scanner.rl:115
lex.te = (lex.p)
(lex.p)--
{
tok = int(lex.data[lex.ts])
(lex.p)++
goto _out
}
case 29:
//line scanner.rl:48
(lex.p) = (lex.te) - 1
{
tok = LITERAL
n, err := strconv.ParseInt(lex.token(), 10, 64)
if err != nil {
panic(err)
}
out.val = int(n)
(lex.p)++
goto _out
}
case 30:
//line scanner.rl:115
(lex.p) = (lex.te) - 1
{
tok = int(lex.data[lex.ts])
(lex.p)++
goto _out
}
case 31:
//line NONE:1
switch lex.act {
case 8:
{
(lex.p) = (lex.te) - 1
tok = LITERAL
out.val = lex.token() == "true"
(lex.p)++
goto _out
}
case 9:
{
(lex.p) = (lex.te) - 1
tok = LITERAL
out.val = nil
(lex.p)++
goto _out
}
case 14:
{
(lex.p) = (lex.te) - 1
tok = AND
(lex.p)++
goto _out
}
case 15:
{
(lex.p) = (lex.te) - 1
tok = OR
(lex.p)++
goto _out
}
case 16:
{
(lex.p) = (lex.te) - 1
tok = CONTAINS
(lex.p)++
goto _out
}
case 17:
{
(lex.p) = (lex.te) - 1
tok = IN
(lex.p)++
goto _out
}
case 20:
{
(lex.p) = (lex.te) - 1
tok = IDENTIFIER
out.name = lex.token()
(lex.p)++
goto _out
}
}
//line scanner.go:552
}
}
_again:
_acts = int(_expression_to_state_actions[lex.cs])
_nacts = uint(_expression_actions[_acts])
_acts++
for ; _nacts > 0; _nacts-- {
_acts++
switch _expression_actions[_acts-1] {
case 0:
//line NONE:1
lex.ts = 0
//line scanner.go:566
}
}
(lex.p)++
if (lex.p) != (lex.pe) {
goto _resume
}
_test_eof:
{
}
if (lex.p) == eof {
if _expression_eof_trans[lex.cs] > 0 {
_trans = int(_expression_eof_trans[lex.cs] - 1)
goto _eof_trans
}
}
_out:
{
}
}
//line scanner.rl:119
return tok
}
func (lex *lexer) Error(e string) {
// fmt.Println("scan error:", e)
}