diff --git a/expressions/expressions_test.go b/expressions/expressions_test.go index f381c52..ead545b 100644 --- a/expressions/expressions_test.go +++ b/expressions/expressions_test.go @@ -21,6 +21,12 @@ var evaluatorTests = []struct { {`'abc'`, "abc"}, {`"abc"`, "abc"}, + {`"a\\bc"`, "a\\bc"}, + {`"a\"bc"`, "a\"bc"}, + {`"\u007b\u007b abc \u007d\u007d"`, "{{ abc }}"}, + // TODO: single-quoted cannot be escaped + // {`'a\'bc'`, "a'bc"}, + // Variables {`n`, 123}, diff --git a/expressions/scanner.go b/expressions/scanner.go index 774a168..d401334 100644 --- a/expressions/scanner.go +++ b/expressions/scanner.go @@ -17,197 +17,197 @@ var _expression_actions []byte = []byte{ } var _expression_key_offsets []int16 = []int16{ - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 14, 16, 17, + 0, 2, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 15, 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, + 26, 53, 56, 57, 59, 61, 62, 64, + 67, 69, 75, 84, 85, 86, 87, 97, + 98, 109, 120, 131, 142, 153, 164, 175, + 186, 197, 208, 219, 230, 241, 252, 263, + 274, 285, 296, 307, } 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, + 34, 92, 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, 92, 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, 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, + 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, 105, 48, + 97, 122, 45, 58, 63, 95, 115, 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, + 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, 117, 48, 57, 65, 90, 97, - 122, 37, + 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{ + 2, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 2, 1, 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, + 19, 1, 1, 2, 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, 1, + 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, + 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, 0, + 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, + 0, 3, 4, 6, 8, 10, 12, 14, + 16, 18, 20, 22, 24, 26, 28, 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, + 49, 73, 76, 78, 81, 84, 86, 88, + 91, 93, 98, 105, 107, 109, 111, 119, + 121, 130, 139, 148, 157, 166, 175, 184, + 193, 202, 211, 220, 229, 238, 247, 256, + 265, 274, 283, 292, } var _expression_indicies []byte = []byte{ - 2, 1, 3, 0, 4, 0, 5, 0, + 2, 3, 1, 1, 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, + 10, 0, 11, 0, 12, 0, 13, 0, + 2, 14, 16, 15, 17, 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, + 0, 24, 0, 25, 0, 26, 0, 27, + 0, 29, 30, 31, 32, 33, 34, 35, + 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 29, 36, 40, 40, + 28, 29, 29, 49, 51, 50, 2, 3, + 1, 52, 53, 50, 2, 14, 36, 50, + 55, 36, 54, 16, 56, 57, 58, 58, + 58, 50, 58, 60, 58, 58, 58, 58, + 59, 61, 50, 62, 50, 63, 50, 40, + 65, 66, 40, 40, 40, 40, 64, 65, + 67, 40, 65, 66, 40, 68, 40, 40, + 40, 67, 40, 65, 66, 40, 69, 40, + 40, 40, 67, 40, 65, 66, 40, 70, + 40, 40, 40, 67, 40, 65, 66, 40, + 71, 40, 40, 40, 67, 40, 65, 66, + 40, 72, 40, 40, 40, 67, 40, 65, + 66, 40, 73, 40, 40, 40, 67, 40, + 65, 66, 40, 74, 40, 40, 40, 67, + 40, 65, 66, 40, 75, 40, 40, 40, + 67, 40, 65, 66, 40, 76, 40, 40, + 40, 67, 40, 65, 66, 40, 77, 40, + 40, 40, 67, 40, 65, 66, 40, 78, + 40, 40, 40, 67, 40, 65, 66, 40, + 79, 40, 40, 40, 67, 40, 65, 66, + 40, 80, 40, 40, 40, 67, 40, 65, + 66, 40, 81, 40, 40, 40, 67, 40, + 65, 66, 40, 82, 40, 40, 40, 67, + 40, 65, 66, 40, 83, 40, 40, 40, + 67, 40, 65, 66, 40, 84, 40, 40, + 40, 67, 40, 65, 66, 40, 85, 40, + 40, 40, 67, 40, 65, 66, 40, 79, + 40, 40, 40, 67, 86, 50, } 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, + 24, 0, 24, 1, 3, 4, 5, 6, + 7, 24, 9, 10, 11, 24, 12, 24, + 32, 15, 20, 16, 17, 18, 19, 24, + 21, 22, 23, 24, 24, 25, 26, 27, + 28, 29, 30, 33, 31, 35, 36, 37, + 38, 40, 42, 49, 53, 54, 56, 57, + 59, 24, 24, 24, 2, 8, 24, 13, + 24, 24, 34, 24, 24, 24, 24, 24, + 24, 24, 39, 24, 41, 38, 43, 44, + 45, 46, 47, 48, 38, 50, 51, 52, + 38, 38, 55, 38, 38, 58, 14, } 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, + 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, + 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, 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, + 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, 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, + 1, 1, 1, 1, 1, 16, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 0, 50, 51, 51, 51, 51, 51, 55, + 57, 51, 60, 51, 51, 51, 65, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 51, } -const expression_start int = 23 -const expression_first_final int = 23 +const expression_start int = 24 +const expression_first_final int = 24 const expression_error int = -1 -const expression_en_main int = 23 +const expression_en_main int = 24 //line scanner.rl:11 @@ -344,25 +344,25 @@ func (lex *lexer) Lex(out *yySymType) int { //line scanner.rl:38 lex.act = 8 case 4: -//line scanner.rl:95 +//line scanner.rl:109 lex.act = 9 case 5: -//line scanner.rl:102 +//line scanner.rl:116 lex.act = 14 case 6: -//line scanner.rl:103 +//line scanner.rl:117 lex.act = 15 case 7: -//line scanner.rl:104 +//line scanner.rl:118 lex.act = 16 case 8: -//line scanner.rl:107 +//line scanner.rl:121 lex.act = 17 case 9: //line scanner.rl:43 lex.act = 20 case 10: -//line scanner.rl:83 +//line scanner.rl:97 lex.te = (lex.p) + 1 { tok = ASSIGN @@ -370,7 +370,7 @@ func (lex *lexer) Lex(out *yySymType) int { goto _out } case 11: -//line scanner.rl:84 +//line scanner.rl:98 lex.te = (lex.p) + 1 { tok = CYCLE @@ -378,7 +378,7 @@ func (lex *lexer) Lex(out *yySymType) int { goto _out } case 12: -//line scanner.rl:85 +//line scanner.rl:99 lex.te = (lex.p) + 1 { tok = LOOP @@ -386,7 +386,7 @@ func (lex *lexer) Lex(out *yySymType) int { goto _out } case 13: -//line scanner.rl:86 +//line scanner.rl:100 lex.te = (lex.p) + 1 { tok = WHEN @@ -398,14 +398,26 @@ func (lex *lexer) Lex(out *yySymType) int { lex.te = (lex.p) + 1 { tok = LITERAL - // TODO unescape \x - out.val = string(lex.data[lex.ts+1 : lex.te-1]) + + var s string + // TODO: single-quoted cannot be escaped + if lex.data[lex.ts] == '\'' { + s = string(lex.data[lex.ts+1 : lex.te-1]) + } else { + unquotedStr, err := strconv.Unquote(string(lex.data[lex.ts:lex.te])) + if err != nil { + panic(err) + } + s = unquotedStr + } + + out.val = s (lex.p)++ goto _out } case 15: -//line scanner.rl:98 +//line scanner.rl:112 lex.te = (lex.p) + 1 { tok = EQ @@ -413,7 +425,7 @@ func (lex *lexer) Lex(out *yySymType) int { goto _out } case 16: -//line scanner.rl:99 +//line scanner.rl:113 lex.te = (lex.p) + 1 { tok = NEQ @@ -421,7 +433,7 @@ func (lex *lexer) Lex(out *yySymType) int { goto _out } case 17: -//line scanner.rl:100 +//line scanner.rl:114 lex.te = (lex.p) + 1 { tok = GE @@ -429,7 +441,7 @@ func (lex *lexer) Lex(out *yySymType) int { goto _out } case 18: -//line scanner.rl:101 +//line scanner.rl:115 lex.te = (lex.p) + 1 { tok = LE @@ -437,7 +449,7 @@ func (lex *lexer) Lex(out *yySymType) int { goto _out } case 19: -//line scanner.rl:108 +//line scanner.rl:122 lex.te = (lex.p) + 1 { tok = DOTDOT @@ -445,7 +457,7 @@ func (lex *lexer) Lex(out *yySymType) int { goto _out } case 20: -//line scanner.rl:110 +//line scanner.rl:124 lex.te = (lex.p) + 1 { tok = KEYWORD @@ -454,7 +466,7 @@ func (lex *lexer) Lex(out *yySymType) int { goto _out } case 21: -//line scanner.rl:112 +//line scanner.rl:126 lex.te = (lex.p) + 1 { tok = PROPERTY @@ -463,7 +475,7 @@ func (lex *lexer) Lex(out *yySymType) int { goto _out } case 22: -//line scanner.rl:115 +//line scanner.rl:129 lex.te = (lex.p) + 1 { tok = int(lex.data[lex.ts]) @@ -512,7 +524,7 @@ func (lex *lexer) Lex(out *yySymType) int { } case 26: -//line scanner.rl:112 +//line scanner.rl:126 lex.te = (lex.p) (lex.p)-- { @@ -522,12 +534,12 @@ func (lex *lexer) Lex(out *yySymType) int { goto _out } case 27: -//line scanner.rl:114 +//line scanner.rl:128 lex.te = (lex.p) (lex.p)-- case 28: -//line scanner.rl:115 +//line scanner.rl:129 lex.te = (lex.p) (lex.p)-- { @@ -550,7 +562,7 @@ func (lex *lexer) Lex(out *yySymType) int { } case 30: -//line scanner.rl:115 +//line scanner.rl:129 (lex.p) = (lex.te) - 1 { tok = int(lex.data[lex.ts]) @@ -618,7 +630,7 @@ func (lex *lexer) Lex(out *yySymType) int { } } -//line scanner.go:552 +//line scanner.go:564 } } @@ -633,7 +645,7 @@ func (lex *lexer) Lex(out *yySymType) int { //line NONE:1 lex.ts = 0 -//line scanner.go:566 +//line scanner.go:578 } } @@ -656,7 +668,7 @@ func (lex *lexer) Lex(out *yySymType) int { } } -//line scanner.rl:119 +//line scanner.rl:133 return tok } diff --git a/expressions/scanner.rl b/expressions/scanner.rl index 20a6e2a..da00468 100644 --- a/expressions/scanner.rl +++ b/expressions/scanner.rl @@ -65,8 +65,20 @@ func (lex *lexer) Lex(out *yySymType) int { } action String { tok = LITERAL - // TODO unescape \x - out.val = string(lex.data[lex.ts+1:lex.te-1]) + + var s string + // TODO: single-quoted cannot be escaped + if lex.data[lex.ts] == '\'' { + s = string(lex.data[lex.ts+1:lex.te-1]) + } else { + unquotedStr, err := strconv.Unquote(string(lex.data[lex.ts:lex.te])) + if err != nil { + panic(err) + } + s = unquotedStr + } + + out.val = s fbreak; } action Relation { tok = RELATION; out.name = lex.token(); fbreak; } @@ -76,7 +88,9 @@ func (lex *lexer) Lex(out *yySymType) int { property = '.' (alpha | '_') . (alnum | '_' | '-')* '?' ? ; int = '-'? digit+ ; float = '-'? digit+ ('.' digit+)? ; - string = '"' (any - '"')* '"' | "'" (any - "'")* "'" ; # TODO escapes + + dqchar = [^"\\] | ( '\\' any ); + string = '"' . dqchar* . '"' | "'" (any - "'")* "'" ; main := |* # statement selectors, should match constants in parser.go diff --git a/expressions/y.go b/expressions/y.go index dd62703..5051c7c 100644 --- a/expressions/y.go +++ b/expressions/y.go @@ -1,3 +1,5 @@ +// Code generated by goyacc expressions.y. DO NOT EDIT. + //line expressions.y:2 package expressions @@ -84,6 +86,7 @@ var yyToknames = [...]string{ "'['", "']'", } + var yyStatenames = [...]string{} const yyEofCode = 1 @@ -108,7 +111,6 @@ const yyPrivate = 57344 const yyLast = 104 var yyAct = [...]int{ - 9, 74, 46, 41, 8, 87, 78, 23, 14, 15, 18, 10, 11, 25, 42, 3, 4, 5, 6, 25, 37, 58, 10, 11, 40, 42, 45, 50, 51, 52, @@ -121,8 +123,8 @@ var yyAct = [...]int{ 85, 86, 83, 19, 34, 2, 1, 73, 20, 39, 17, 22, 67, 63, } -var yyPact = [...]int{ +var yyPact = [...]int{ 7, -1000, 60, 76, 89, 71, 18, -1000, 19, 49, -1000, -1000, 18, -1000, 18, 18, -6, 14, -3, -1000, 10, 38, 1, 39, 83, -1000, 18, 18, 18, 18, @@ -133,29 +135,29 @@ var yyPact = [...]int{ -1000, -1000, -1000, 69, 20, -1000, -1000, -1000, 18, -1000, 88, 86, 6, -1000, -25, -1000, -1000, -1000, } -var yyPgo = [...]int{ +var yyPgo = [...]int{ 0, 0, 71, 4, 94, 1, 103, 102, 101, 2, 100, 99, 3, 98, 97, 10, 96, } -var yyR1 = [...]int{ +var yyR1 = [...]int{ 0, 16, 16, 16, 16, 16, 10, 11, 11, 12, 12, 8, 9, 9, 15, 13, 6, 6, 5, 5, 14, 14, 14, 1, 1, 1, 1, 1, 3, 3, 3, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, } -var yyR2 = [...]int{ +var yyR2 = [...]int{ 0, 2, 5, 3, 3, 3, 2, 3, 1, 0, 3, 2, 0, 3, 1, 4, 5, 1, 1, 1, 0, 2, 3, 1, 1, 2, 4, 3, 1, 3, 4, 1, 3, 1, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, } -var yyChk = [...]int{ +var yyChk = [...]int{ -1000, -16, -4, 8, 9, 10, 11, -2, -3, -1, 4, 5, 29, 25, 17, 18, 5, -10, -15, 4, -13, 5, -8, -1, 22, 7, 31, 12, 13, 24, @@ -166,8 +168,8 @@ var yyChk = [...]int{ 25, -12, -12, -14, -5, 4, 5, -9, 28, 5, 6, 20, -1, 4, -5, 4, 5, 30, } -var yyDef = [...]int{ +var yyDef = [...]int{ 0, -2, 0, 0, 0, 0, 0, 41, 33, 28, 23, 24, 0, 1, 0, 0, 0, 0, 9, 14, 0, 0, 0, 12, 0, 25, 0, 0, 0, 0, @@ -178,8 +180,8 @@ var yyDef = [...]int{ 2, 7, 10, 15, 0, -2, -2, 13, 0, 21, 0, 0, 32, 22, 0, 18, 19, 16, } -var yyTok1 = [...]int{ +var yyTok1 = [...]int{ 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, @@ -194,11 +196,12 @@ var yyTok1 = [...]int{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 22, } -var yyTok2 = [...]int{ +var yyTok2 = [...]int{ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, } + var yyTok3 = [...]int{ 0, } @@ -542,87 +545,87 @@ yydefault: case 1: yyDollar = yyS[yypt-2 : yypt+1] - //line expressions.y:46 +//line expressions.y:46 { yylex.(*lexer).val = yyDollar[1].f } case 2: yyDollar = yyS[yypt-5 : yypt+1] - //line expressions.y:47 +//line expressions.y:47 { yylex.(*lexer).Assignment = Assignment{yyDollar[2].name, &expression{yyDollar[4].f}} } case 3: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:50 +//line expressions.y:50 { yylex.(*lexer).Cycle = yyDollar[2].cycle } case 4: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:51 +//line expressions.y:51 { yylex.(*lexer).Loop = yyDollar[2].loop } case 5: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:52 +//line expressions.y:52 { yylex.(*lexer).When = When{yyDollar[2].exprs} } case 6: yyDollar = yyS[yypt-2 : yypt+1] - //line expressions.y:55 +//line expressions.y:55 { yyVAL.cycle = yyDollar[2].cyclefn(yyDollar[1].s) } case 7: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:58 +//line expressions.y:58 { h, t := yyDollar[2].s, yyDollar[3].ss yyVAL.cyclefn = func(g string) Cycle { return Cycle{g, append([]string{h}, t...)} } } case 8: yyDollar = yyS[yypt-1 : yypt+1] - //line expressions.y:62 +//line expressions.y:62 { vals := yyDollar[1].ss yyVAL.cyclefn = func(h string) Cycle { return Cycle{Values: append([]string{h}, vals...)} } } case 9: yyDollar = yyS[yypt-0 : yypt+1] - //line expressions.y:69 +//line expressions.y:69 { yyVAL.ss = []string{} } case 10: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:70 +//line expressions.y:70 { yyVAL.ss = append([]string{yyDollar[2].s}, yyDollar[3].ss...) } case 11: yyDollar = yyS[yypt-2 : yypt+1] - //line expressions.y:73 +//line expressions.y:73 { yyVAL.exprs = append([]Expression{&expression{yyDollar[1].f}}, yyDollar[2].exprs...) } case 12: yyDollar = yyS[yypt-0 : yypt+1] - //line expressions.y:75 +//line expressions.y:75 { yyVAL.exprs = []Expression{} } case 13: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:76 +//line expressions.y:76 { yyVAL.exprs = append([]Expression{&expression{yyDollar[2].f}}, yyDollar[3].exprs...) } case 14: yyDollar = yyS[yypt-1 : yypt+1] - //line expressions.y:79 +//line expressions.y:79 { s, ok := yyDollar[1].val.(string) if !ok { @@ -632,40 +635,40 @@ yydefault: } case 15: yyDollar = yyS[yypt-4 : yypt+1] - //line expressions.y:87 +//line expressions.y:87 { name, expr, mods := yyDollar[1].name, yyDollar[3].f, yyDollar[4].loopmods yyVAL.loop = Loop{name, &expression{expr}, mods} } case 16: yyDollar = yyS[yypt-5 : yypt+1] - //line expressions.y:93 +//line expressions.y:93 { yyVAL.f = makeRangeExpr(yyDollar[2].f, yyDollar[4].f) } case 18: yyDollar = yyS[yypt-1 : yypt+1] - //line expressions.y:101 +//line expressions.y:101 { val := yyDollar[1].val yyVAL.f = func(Context) values.Value { return values.ValueOf(val) } } case 19: yyDollar = yyS[yypt-1 : yypt+1] - //line expressions.y:102 +//line expressions.y:102 { name := yyDollar[1].name yyVAL.f = func(ctx Context) values.Value { return values.ValueOf(ctx.Get(name)) } } case 20: yyDollar = yyS[yypt-0 : yypt+1] - //line expressions.y:105 +//line expressions.y:105 { yyVAL.loopmods = loopModifiers{Cols: math.MaxUint32} } case 21: yyDollar = yyS[yypt-2 : yypt+1] - //line expressions.y:106 +//line expressions.y:106 { switch yyDollar[2].name { case "reversed": @@ -677,7 +680,7 @@ yydefault: } case 22: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:115 +//line expressions.y:115 { // TODO can this be a variable? switch yyDollar[2].name { case "cols": @@ -705,63 +708,63 @@ yydefault: } case 23: yyDollar = yyS[yypt-1 : yypt+1] - //line expressions.y:143 +//line expressions.y:143 { val := yyDollar[1].val yyVAL.f = func(Context) values.Value { return values.ValueOf(val) } } case 24: yyDollar = yyS[yypt-1 : yypt+1] - //line expressions.y:144 +//line expressions.y:144 { name := yyDollar[1].name yyVAL.f = func(ctx Context) values.Value { return values.ValueOf(ctx.Get(name)) } } case 25: yyDollar = yyS[yypt-2 : yypt+1] - //line expressions.y:145 +//line expressions.y:145 { yyVAL.f = makeObjectPropertyExpr(yyDollar[1].f, yyDollar[2].name) } case 26: yyDollar = yyS[yypt-4 : yypt+1] - //line expressions.y:146 +//line expressions.y:146 { yyVAL.f = makeIndexExpr(yyDollar[1].f, yyDollar[3].f) } case 27: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:147 +//line expressions.y:147 { yyVAL.f = yyDollar[2].f } case 29: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:152 +//line expressions.y:152 { yyVAL.f = makeFilter(yyDollar[1].f, yyDollar[3].name, nil) } case 30: yyDollar = yyS[yypt-4 : yypt+1] - //line expressions.y:153 +//line expressions.y:153 { yyVAL.f = makeFilter(yyDollar[1].f, yyDollar[3].name, yyDollar[4].filter_params) } case 31: yyDollar = yyS[yypt-1 : yypt+1] - //line expressions.y:157 +//line expressions.y:157 { yyVAL.filter_params = []valueFn{yyDollar[1].f} } case 32: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:159 +//line expressions.y:159 { yyVAL.filter_params = append(yyDollar[1].filter_params, yyDollar[3].f) } case 34: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:163 +//line expressions.y:163 { fa, fb := yyDollar[1].f, yyDollar[3].f yyVAL.f = func(ctx Context) values.Value { @@ -771,7 +774,7 @@ yydefault: } case 35: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:170 +//line expressions.y:170 { fa, fb := yyDollar[1].f, yyDollar[3].f yyVAL.f = func(ctx Context) values.Value { @@ -781,7 +784,7 @@ yydefault: } case 36: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:177 +//line expressions.y:177 { fa, fb := yyDollar[1].f, yyDollar[3].f yyVAL.f = func(ctx Context) values.Value { @@ -791,7 +794,7 @@ yydefault: } case 37: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:184 +//line expressions.y:184 { fa, fb := yyDollar[1].f, yyDollar[3].f yyVAL.f = func(ctx Context) values.Value { @@ -801,7 +804,7 @@ yydefault: } case 38: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:191 +//line expressions.y:191 { fa, fb := yyDollar[1].f, yyDollar[3].f yyVAL.f = func(ctx Context) values.Value { @@ -811,7 +814,7 @@ yydefault: } case 39: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:198 +//line expressions.y:198 { fa, fb := yyDollar[1].f, yyDollar[3].f yyVAL.f = func(ctx Context) values.Value { @@ -821,13 +824,13 @@ yydefault: } case 40: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:205 +//line expressions.y:205 { yyVAL.f = makeContainsExpr(yyDollar[1].f, yyDollar[3].f) } case 42: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:210 +//line expressions.y:210 { fa, fb := yyDollar[1].f, yyDollar[3].f yyVAL.f = func(ctx Context) values.Value { @@ -836,7 +839,7 @@ yydefault: } case 43: yyDollar = yyS[yypt-3 : yypt+1] - //line expressions.y:216 +//line expressions.y:216 { fa, fb := yyDollar[1].f, yyDollar[3].f yyVAL.f = func(ctx Context) values.Value {