ndtypes 0.2.0dev4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING.md +50 -0
  3. data/Gemfile +2 -0
  4. data/History.md +0 -0
  5. data/README.md +19 -0
  6. data/Rakefile +125 -0
  7. data/ext/ruby_ndtypes/extconf.rb +55 -0
  8. data/ext/ruby_ndtypes/gc_guard.c +36 -0
  9. data/ext/ruby_ndtypes/gc_guard.h +12 -0
  10. data/ext/ruby_ndtypes/ndtypes/AUTHORS.txt +5 -0
  11. data/ext/ruby_ndtypes/ndtypes/INSTALL.txt +101 -0
  12. data/ext/ruby_ndtypes/ndtypes/LICENSE.txt +29 -0
  13. data/ext/ruby_ndtypes/ndtypes/MANIFEST.in +3 -0
  14. data/ext/ruby_ndtypes/ndtypes/Makefile.in +87 -0
  15. data/ext/ruby_ndtypes/ndtypes/README.rst +47 -0
  16. data/ext/ruby_ndtypes/ndtypes/config.guess +1530 -0
  17. data/ext/ruby_ndtypes/ndtypes/config.h.in +67 -0
  18. data/ext/ruby_ndtypes/ndtypes/config.sub +1782 -0
  19. data/ext/ruby_ndtypes/ndtypes/configure +5260 -0
  20. data/ext/ruby_ndtypes/ndtypes/configure.ac +161 -0
  21. data/ext/ruby_ndtypes/ndtypes/doc/Makefile +14 -0
  22. data/ext/ruby_ndtypes/ndtypes/doc/_static/copybutton.js +66 -0
  23. data/ext/ruby_ndtypes/ndtypes/doc/conf.py +26 -0
  24. data/ext/ruby_ndtypes/ndtypes/doc/grammar/grammar.rst +27 -0
  25. data/ext/ruby_ndtypes/ndtypes/doc/index.rst +56 -0
  26. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/context.rst +131 -0
  27. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/encodings.rst +68 -0
  28. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/fields-values.rst +175 -0
  29. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/functions.rst +72 -0
  30. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/index.rst +43 -0
  31. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/init.rst +48 -0
  32. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/io.rst +100 -0
  33. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/memory.rst +124 -0
  34. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/predicates.rst +110 -0
  35. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/typedef.rst +31 -0
  36. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/types.rst +594 -0
  37. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/util.rst +166 -0
  38. data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/buffer-protocol.rst +27 -0
  39. data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/index.rst +21 -0
  40. data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/pattern-matching.rst +330 -0
  41. data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/quickstart.rst +144 -0
  42. data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/types.rst +544 -0
  43. data/ext/ruby_ndtypes/ndtypes/doc/releases/index.rst +35 -0
  44. data/ext/ruby_ndtypes/ndtypes/install-sh +527 -0
  45. data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.in +271 -0
  46. data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.vc +269 -0
  47. data/ext/ruby_ndtypes/ndtypes/libndtypes/alloc.c +230 -0
  48. data/ext/ruby_ndtypes/ndtypes/libndtypes/attr.c +268 -0
  49. data/ext/ruby_ndtypes/ndtypes/libndtypes/attr.h +109 -0
  50. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/Makefile.in +73 -0
  51. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/Makefile.vc +70 -0
  52. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/README.txt +16 -0
  53. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.c +2179 -0
  54. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.h +134 -0
  55. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.y +428 -0
  56. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.c +2543 -0
  57. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.h +735 -0
  58. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.l +176 -0
  59. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/export.c +543 -0
  60. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/import.c +110 -0
  61. data/ext/ruby_ndtypes/ndtypes/libndtypes/context.c +228 -0
  62. data/ext/ruby_ndtypes/ndtypes/libndtypes/copy.c +634 -0
  63. data/ext/ruby_ndtypes/ndtypes/libndtypes/encodings.c +116 -0
  64. data/ext/ruby_ndtypes/ndtypes/libndtypes/equal.c +288 -0
  65. data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.c +3067 -0
  66. data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.h +180 -0
  67. data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.y +417 -0
  68. data/ext/ruby_ndtypes/ndtypes/libndtypes/io.c +1658 -0
  69. data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.c +2773 -0
  70. data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.h +734 -0
  71. data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.l +222 -0
  72. data/ext/ruby_ndtypes/ndtypes/libndtypes/match.c +1132 -0
  73. data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.c +2323 -0
  74. data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.h.in +893 -0
  75. data/ext/ruby_ndtypes/ndtypes/libndtypes/overflow.h +161 -0
  76. data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.c +473 -0
  77. data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.h +92 -0
  78. data/ext/ruby_ndtypes/ndtypes/libndtypes/parser.c +246 -0
  79. data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.c +269 -0
  80. data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.h +197 -0
  81. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/Makefile.in +48 -0
  82. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/Makefile.vc +46 -0
  83. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/deserialize.c +1007 -0
  84. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/serialize.c +442 -0
  85. data/ext/ruby_ndtypes/ndtypes/libndtypes/slice.h +42 -0
  86. data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.c +238 -0
  87. data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.h +50 -0
  88. data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.c +371 -0
  89. data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.h +100 -0
  90. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.in +55 -0
  91. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.vc +45 -0
  92. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/alloc_fail.c +82 -0
  93. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/alloc_fail.h +49 -0
  94. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/runtest.c +1657 -0
  95. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test.h +85 -0
  96. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_array.c +115 -0
  97. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_buffer.c +137 -0
  98. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_indent.c +201 -0
  99. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_match.c +2397 -0
  100. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_numba.c +57 -0
  101. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse.c +349 -0
  102. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_error.c +27839 -0
  103. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_roundtrip.c +350 -0
  104. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_record.c +231 -0
  105. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_typecheck.c +375 -0
  106. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_typedef.c +65 -0
  107. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/valgrind.supp +30 -0
  108. data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/bench.c +79 -0
  109. data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/indent.c +94 -0
  110. data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/print_ast.c +96 -0
  111. data/ext/ruby_ndtypes/ndtypes/libndtypes/util.c +474 -0
  112. data/ext/ruby_ndtypes/ndtypes/libndtypes/values.c +228 -0
  113. data/ext/ruby_ndtypes/ndtypes/python/bench.py +49 -0
  114. data/ext/ruby_ndtypes/ndtypes/python/ndt_randtype.py +409 -0
  115. data/ext/ruby_ndtypes/ndtypes/python/ndt_support.py +14 -0
  116. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/__init__.py +70 -0
  117. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/_ndtypes.c +1332 -0
  118. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/docstrings.h +319 -0
  119. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/pyndtypes.h +154 -0
  120. data/ext/ruby_ndtypes/ndtypes/python/test_ndtypes.py +1977 -0
  121. data/ext/ruby_ndtypes/ndtypes/setup.py +288 -0
  122. data/ext/ruby_ndtypes/ndtypes/vcbuild/INSTALL.txt +41 -0
  123. data/ext/ruby_ndtypes/ndtypes/vcbuild/runtest32.bat +15 -0
  124. data/ext/ruby_ndtypes/ndtypes/vcbuild/runtest64.bat +13 -0
  125. data/ext/ruby_ndtypes/ndtypes/vcbuild/vcbuild32.bat +38 -0
  126. data/ext/ruby_ndtypes/ndtypes/vcbuild/vcbuild64.bat +38 -0
  127. data/ext/ruby_ndtypes/ndtypes/vcbuild/vcclean.bat +13 -0
  128. data/ext/ruby_ndtypes/ndtypes/vcbuild/vcdistclean.bat +14 -0
  129. data/ext/ruby_ndtypes/ruby_ndtypes.c +1003 -0
  130. data/ext/ruby_ndtypes/ruby_ndtypes.h +37 -0
  131. data/ext/ruby_ndtypes/ruby_ndtypes_internal.h +28 -0
  132. data/lib/ndtypes.rb +45 -0
  133. data/lib/ndtypes/errors.rb +2 -0
  134. data/lib/ndtypes/version.rb +6 -0
  135. data/ndtypes.gemspec +47 -0
  136. data/spec/gc_table_spec.rb +10 -0
  137. data/spec/ndtypes_spec.rb +289 -0
  138. data/spec/spec_helper.rb +241 -0
  139. metadata +242 -0
@@ -0,0 +1,134 @@
1
+ /* A Bison parser, made by GNU Bison 3.0.4. */
2
+
3
+ /* Bison interface for Yacc-like parsers in C
4
+
5
+ Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
+
20
+ /* As a special exception, you may create a larger work that contains
21
+ part or all of the Bison parser skeleton and distribute that work
22
+ under terms of your choice, so long as that work isn't itself a
23
+ parser generator using the skeleton or a modified version thereof
24
+ as a parser skeleton. Alternatively, if you modify or redistribute
25
+ the parser skeleton itself, you may (at your option) remove this
26
+ special exception, which will cause the skeleton and the resulting
27
+ Bison output files to be licensed under the GNU General Public
28
+ License without this special exception.
29
+
30
+ This special exception was added by the Free Software Foundation in
31
+ version 2.2 of Bison. */
32
+
33
+ #ifndef YY_NDT_BP_BPGRAMMAR_H_INCLUDED
34
+ # define YY_NDT_BP_BPGRAMMAR_H_INCLUDED
35
+ /* Debug traces. */
36
+ #ifndef YYDEBUG
37
+ # define YYDEBUG 0
38
+ #endif
39
+ #if YYDEBUG
40
+ extern int ndt_bpdebug;
41
+ #endif
42
+ /* "%code requires" blocks. */
43
+ #line 292 "bpgrammar.y" /* yacc.c:1909 */
44
+
45
+ #include <ctype.h>
46
+ #include <assert.h>
47
+ #include "ndtypes.h"
48
+ #include "parsefuncs.h"
49
+ #include "seq.h"
50
+ #include "overflow.h"
51
+ #define YY_TYPEDEF_YY_SCANNER_T
52
+ typedef void * yyscan_t;
53
+
54
+ #line 55 "bpgrammar.h" /* yacc.c:1909 */
55
+
56
+ /* Token type. */
57
+ #ifndef YYTOKENTYPE
58
+ # define YYTOKENTYPE
59
+ enum yytokentype
60
+ {
61
+ ENDMARKER = 0,
62
+ BYTES = 258,
63
+ RECORD = 259,
64
+ PAD = 260,
65
+ AT = 261,
66
+ EQUAL = 262,
67
+ LESS = 263,
68
+ GREATER = 264,
69
+ BANG = 265,
70
+ COMMA = 266,
71
+ COLON = 267,
72
+ LPAREN = 268,
73
+ RPAREN = 269,
74
+ LBRACE = 270,
75
+ RBRACE = 271,
76
+ RARROW = 272,
77
+ ERRTOKEN = 273,
78
+ DTYPE = 274,
79
+ INTEGER = 275,
80
+ NAME = 276
81
+ };
82
+ #endif
83
+
84
+ /* Value type. */
85
+ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
86
+
87
+ union YYSTYPE
88
+ {
89
+ #line 325 "bpgrammar.y" /* yacc.c:1909 */
90
+
91
+ ndt_t *ndt;
92
+ ndt_field_t *field;
93
+ ndt_field_seq_t *field_seq;
94
+ ndt_string_seq_t *string_seq;
95
+ ndt_type_seq_t *type_seq;
96
+ char *string;
97
+ unsigned char uchar;
98
+ uint16_t uint16;
99
+
100
+ #line 101 "bpgrammar.h" /* yacc.c:1909 */
101
+ };
102
+
103
+ typedef union YYSTYPE YYSTYPE;
104
+ # define YYSTYPE_IS_TRIVIAL 1
105
+ # define YYSTYPE_IS_DECLARED 1
106
+ #endif
107
+
108
+ /* Location type. */
109
+ #if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
110
+ typedef struct YYLTYPE YYLTYPE;
111
+ struct YYLTYPE
112
+ {
113
+ int first_line;
114
+ int first_column;
115
+ int last_line;
116
+ int last_column;
117
+ };
118
+ # define YYLTYPE_IS_DECLARED 1
119
+ # define YYLTYPE_IS_TRIVIAL 1
120
+ #endif
121
+
122
+
123
+
124
+ int ndt_bpparse (yyscan_t scanner, ndt_t **ast, ndt_context_t *ctx);
125
+ /* "%code provides" blocks. */
126
+ #line 303 "bpgrammar.y" /* yacc.c:1909 */
127
+
128
+ #define YY_DECL extern int ndt_bplexfunc(YYSTYPE *yylval_param, YYLTYPE *yylloc_param, yyscan_t yyscanner, ndt_context_t *ctx)
129
+ extern int ndt_bplexfunc(YYSTYPE *, YYLTYPE *, yyscan_t, ndt_context_t *);
130
+ void yyerror(YYLTYPE *loc, yyscan_t scanner, ndt_t **ast, ndt_context_t *ctx, const char *msg);
131
+
132
+ #line 133 "bpgrammar.h" /* yacc.c:1909 */
133
+
134
+ #endif /* !YY_NDT_BP_BPGRAMMAR_H_INCLUDED */
@@ -0,0 +1,428 @@
1
+ %{
2
+ /*
3
+ * BSD 3-Clause License
4
+ *
5
+ * Copyright (c) 2017-2018, plures
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are met:
10
+ *
11
+ * 1. Redistributions of source code must retain the above copyright notice,
12
+ * this list of conditions and the following disclaimer.
13
+ *
14
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
15
+ * this list of conditions and the following disclaimer in the documentation
16
+ * and/or other materials provided with the distribution.
17
+ *
18
+ * 3. Neither the name of the copyright holder nor the names of its
19
+ * contributors may be used to endorse or promote products derived from
20
+ * this software without specific prior written permission.
21
+ *
22
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
26
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
+ */
33
+
34
+
35
+ #include "bpgrammar.h"
36
+ #include "bplexer.h"
37
+
38
+
39
+ void
40
+ yyerror(YYLTYPE *loc, yyscan_t scanner, ndt_t **ast, ndt_context_t *ctx,
41
+ const char *msg)
42
+ {
43
+ (void)scanner;
44
+ (void)ast;
45
+
46
+ ndt_err_format(ctx, NDT_ParseError, "%d:%d: %s\n", loc->first_line,
47
+ loc->first_column, msg);
48
+ }
49
+
50
+ int
51
+ yylex(YYSTYPE *val, YYLTYPE *loc, yyscan_t scanner, ndt_context_t *ctx)
52
+ {
53
+ return ndt_bplexfunc(val, loc, scanner, ctx);
54
+ }
55
+
56
+ static uint16_t
57
+ add_uint16(uint16_t a, uint16_t b, ndt_context_t *ctx)
58
+ {
59
+ bool overflow = 0;
60
+ uint16_t c = ADDu16(a, b, &overflow);
61
+
62
+ if (overflow) {
63
+ ndt_err_format(ctx, NDT_ValueError, "overflow while adding uint16");
64
+ return UINT16_MAX;
65
+ }
66
+
67
+ return c;
68
+ }
69
+
70
+ static ndt_t *
71
+ primitive_native(char dtype, ndt_context_t *ctx)
72
+ {
73
+ switch (dtype) {
74
+ case '?': return ndt_primitive(Bool, 0, ctx);
75
+
76
+ case 'c': return ndt_char(Ascii, ctx);
77
+ case 'b': return ndt_primitive(Int8, 0, ctx);
78
+ case 'B': return ndt_primitive(Uint8, 0, ctx);
79
+
80
+ case 'h': return ndt_signed(sizeof(short), 0, ctx);
81
+ case 'i': return ndt_signed(sizeof(int), 0, ctx);
82
+ case 'l': return ndt_signed(sizeof(long), 0, ctx);
83
+ case 'q': return ndt_signed(sizeof(long long), 0, ctx);
84
+ case 'n': return ndt_signed(sizeof(size_t), 0, ctx);
85
+
86
+ case 'H': return ndt_unsigned(sizeof(unsigned short), 0, ctx);
87
+ case 'I': return ndt_unsigned(sizeof(unsigned int), 0, ctx);
88
+ case 'L': return ndt_unsigned(sizeof(unsigned long), 0, ctx);
89
+ case 'Q': return ndt_unsigned(sizeof(unsigned long long), 0, ctx);
90
+ case 'N': return ndt_unsigned(sizeof(size_t), 0, ctx);
91
+
92
+ case 'e': return ndt_primitive(Float16, 0, ctx);
93
+ case 'f': return ndt_primitive(Float32, 0, ctx);
94
+ case 'd': return ndt_primitive(Float64, 0, ctx);
95
+
96
+ case 'E': return ndt_primitive(Complex32, 0, ctx);
97
+ case 'F': return ndt_primitive(Complex64, 0, ctx);
98
+ case 'D': return ndt_primitive(Complex128, 0, ctx);
99
+
100
+ default:
101
+ ndt_err_format(ctx, NDT_ValueError,
102
+ "invalid or unsupported dtype '%c'", dtype);
103
+ return NULL;
104
+ }
105
+ }
106
+
107
+ static ndt_t *
108
+ primitive_fixed(char dtype, uint32_t flags, ndt_context_t *ctx)
109
+ {
110
+ switch (dtype) {
111
+ case '?': return ndt_primitive(Bool, flags, ctx);
112
+
113
+ case 'c': return ndt_char(Ascii, ctx);
114
+ case 'b': return ndt_primitive(Int8, flags, ctx);
115
+ case 'B': return ndt_primitive(Uint8, flags, ctx);
116
+
117
+ case 'h': return ndt_primitive(Int16, flags, ctx);
118
+ case 'i': return ndt_primitive(Int32, flags, ctx);
119
+ case 'l': return ndt_primitive(Int32, flags, ctx);
120
+ case 'q': return ndt_primitive(Int64, flags, ctx);
121
+
122
+ case 'H': return ndt_primitive(Uint16, flags, ctx);
123
+ case 'I': return ndt_primitive(Uint32, flags, ctx);
124
+ case 'L': return ndt_primitive(Uint32, flags, ctx);
125
+ case 'Q': return ndt_primitive(Uint64, flags, ctx);
126
+
127
+ case 'e': return ndt_primitive(Float16, flags, ctx);
128
+ case 'f': return ndt_primitive(Float32, flags, ctx);
129
+ case 'd': return ndt_primitive(Float64, flags, ctx);
130
+
131
+ case 'E': return ndt_primitive(Complex32, flags, ctx);
132
+ case 'F': return ndt_primitive(Complex64, flags, ctx);
133
+ case 'D': return ndt_primitive(Complex128, flags, ctx);
134
+
135
+ default:
136
+ ndt_err_format(ctx, NDT_ValueError,
137
+ "invalid or unsupported dtype '%c'", dtype);
138
+ return NULL;
139
+ }
140
+ }
141
+
142
+ static ndt_t *
143
+ make_dtype(char modifier, char dtype, ndt_context_t *ctx)
144
+ {
145
+ switch (modifier) {
146
+ case '@':
147
+ return primitive_native(dtype, ctx);
148
+ case '=':
149
+ return primitive_fixed(dtype, 0, ctx);
150
+ case '<':
151
+ return primitive_fixed(dtype, NDT_LITTLE_ENDIAN, ctx);
152
+ case '>':
153
+ return primitive_fixed(dtype, NDT_BIG_ENDIAN, ctx);
154
+ case '!':
155
+ return primitive_fixed(dtype, NDT_BIG_ENDIAN, ctx);
156
+ default:
157
+ ndt_err_format(ctx, NDT_RuntimeError, "invalid modifier '%c'",
158
+ modifier);
159
+ return NULL;
160
+ }
161
+ }
162
+
163
+ static ndt_t *
164
+ make_fixed_bytes(char *v, ndt_context_t *ctx)
165
+ {
166
+ uint16_opt_t align = {None, 0};
167
+ int64_t datasize = 1;
168
+
169
+ if (v != NULL) {
170
+ datasize = ndt_strtoll(v, 0, INT64_MAX, ctx);
171
+ ndt_free(v);
172
+ if (ndt_err_occurred(ctx)) {
173
+ return NULL;
174
+ }
175
+ }
176
+
177
+ if (datasize < 1) {
178
+ ndt_err_format(ctx, NDT_ValueError,
179
+ "fixed bytes datasize must be greater than 0");
180
+ return NULL;
181
+ }
182
+
183
+ return ndt_fixed_bytes(datasize, align, ctx);
184
+ }
185
+
186
+ static ndt_t *
187
+ make_dimensions(ndt_string_seq_t *seq, ndt_t *type, ndt_context_t *ctx)
188
+ {
189
+ ndt_t *t;
190
+ int64_t shape;
191
+ int64_t i;
192
+
193
+ if (seq->len < 1 || seq->len > NDT_MAX_DIM) {
194
+ ndt_err_format(ctx, NDT_ValueError,
195
+ "number of dimensions must be between 1 and %d", NDT_MAX_DIM);
196
+ ndt_string_seq_del(seq);
197
+ ndt_del(type);
198
+ return NULL;
199
+ }
200
+
201
+ for (i=seq->len-1, t=type; i>=0; i--, type=t) {
202
+ shape = ndt_strtoll(seq->ptr[i], 0, INT_MAX, ctx);
203
+ if (ndt_err_occurred(ctx)) {
204
+ ndt_string_seq_del(seq);
205
+ return NULL;
206
+ }
207
+
208
+ t = ndt_fixed_dim(type, shape, INT64_MAX, ctx);
209
+ if (t == NULL) {
210
+ ndt_string_seq_del(seq);
211
+ return NULL;
212
+ }
213
+ }
214
+
215
+ ndt_string_seq_del(seq);
216
+
217
+ return t;
218
+ }
219
+
220
+ static ndt_field_t *
221
+ make_field(char *name, ndt_t *type, uint16_t padding, ndt_context_t *ctx)
222
+ {
223
+ uint16_opt_t align = {None, 0};
224
+ uint16_opt_t pack = {None, 0};
225
+ uint16_opt_t pad = {Some, 0};
226
+
227
+ pad.Some = padding;
228
+ return ndt_field(name, type, align, pack, pad, ctx);
229
+ }
230
+
231
+ static ndt_t *
232
+ make_record(ndt_field_seq_t *fields, ndt_context_t *ctx)
233
+ {
234
+ uint16_opt_t align = {None, 0};
235
+ uint16_opt_t pack = {None, 0};
236
+ ndt_t *t;
237
+ int64_t i;
238
+
239
+ fields = ndt_field_seq_finalize(fields);
240
+ if (fields == NULL) {
241
+ return ndt_record(Nonvariadic, NULL, 0, align, pack, ctx);
242
+ }
243
+
244
+ assert(fields->len >= 1);
245
+
246
+ fields->ptr[0].Concrete.align = 1;
247
+ fields->ptr[0].Concrete.explicit_align = true;
248
+
249
+ for (i = 1; i < fields->len; i++) {
250
+ uint16_t a = 1;
251
+ if (fields->ptr[i-1].Concrete.pad != 0) {
252
+ a = fields->ptr[i-1].type->align + fields->ptr[i-1].Concrete.pad;
253
+ }
254
+ fields->ptr[i].Concrete.align = a;
255
+ fields->ptr[i].Concrete.explicit_align = true;
256
+ }
257
+
258
+ t = ndt_record(Nonvariadic, fields->ptr, fields->len, align, pack, ctx);
259
+ ndt_free(fields);
260
+
261
+ return t;
262
+ }
263
+
264
+ static ndt_type_seq_t *
265
+ broadcast_seq_new(ndt_t *type, ndt_context_t *ctx)
266
+ {
267
+ ndt_t *t;
268
+
269
+ t = ndt_ellipsis_dim(NULL, type, ctx);
270
+ if (t == NULL) {
271
+ return NULL;
272
+ }
273
+
274
+ return ndt_type_seq_new(t, ctx);
275
+ }
276
+
277
+ static ndt_type_seq_t *
278
+ broadcast_seq_append(ndt_type_seq_t *seq, ndt_t *type, ndt_context_t *ctx)
279
+ {
280
+ ndt_t *t;
281
+
282
+ t = ndt_ellipsis_dim(NULL, type, ctx);
283
+ if (t == NULL) {
284
+ ndt_type_seq_del(seq);
285
+ return NULL;
286
+ }
287
+
288
+ return ndt_type_seq_append(seq, t, ctx);
289
+ }
290
+ %}
291
+
292
+ %code requires {
293
+ #include <ctype.h>
294
+ #include <assert.h>
295
+ #include "ndtypes.h"
296
+ #include "parsefuncs.h"
297
+ #include "seq.h"
298
+ #include "overflow.h"
299
+ #define YY_TYPEDEF_YY_SCANNER_T
300
+ typedef void * yyscan_t;
301
+ }
302
+
303
+ %code provides {
304
+ #define YY_DECL extern int ndt_bplexfunc(YYSTYPE *yylval_param, YYLTYPE *yylloc_param, yyscan_t yyscanner, ndt_context_t *ctx)
305
+ extern int ndt_bplexfunc(YYSTYPE *, YYLTYPE *, yyscan_t, ndt_context_t *);
306
+ void yyerror(YYLTYPE *loc, yyscan_t scanner, ndt_t **ast, ndt_context_t *ctx, const char *msg);
307
+ }
308
+
309
+
310
+ %pure-parser
311
+ %error-verbose
312
+
313
+
314
+ %locations
315
+ %initial-action {
316
+ @$.first_line = 1;
317
+ @$.first_column = 1;
318
+ @$.last_line = 1;
319
+ @$.last_column = 1;
320
+ }
321
+
322
+ %lex-param {yyscan_t scanner} {ndt_context_t *ctx}
323
+ %parse-param {yyscan_t scanner} {ndt_t **ast} {ndt_context_t *ctx}
324
+
325
+ %union {
326
+ ndt_t *ndt;
327
+ ndt_field_t *field;
328
+ ndt_field_seq_t *field_seq;
329
+ ndt_string_seq_t *string_seq;
330
+ ndt_type_seq_t *type_seq;
331
+ char *string;
332
+ unsigned char uchar;
333
+ uint16_t uint16;
334
+ }
335
+
336
+ %start input
337
+ %type <ndt> input
338
+ %type <ndt> datatype
339
+
340
+ %type <ndt> record
341
+ %type <field> field
342
+ %type <field_seq> field_seq
343
+
344
+ %type <ndt> dtype
345
+ %type <type_seq> dtype_seq
346
+
347
+ %type <string_seq> dimensions
348
+ %type <string> repeat
349
+
350
+ %type <ndt> function
351
+
352
+ %type <uchar> modifier
353
+ %type <uint16> padding
354
+
355
+ %token
356
+ BYTES RECORD PAD
357
+
358
+ AT EQUAL LESS GREATER BANG COMMA COLON LPAREN RPAREN LBRACE RBRACE RARROW
359
+ ERRTOKEN
360
+
361
+ %token <uchar>
362
+ DTYPE
363
+
364
+ %token <string>
365
+ INTEGER NAME
366
+
367
+ %token ENDMARKER 0 "end of file"
368
+
369
+ %destructor { ndt_del($$); } <ndt>
370
+ %destructor { ndt_field_del($$); } <field>
371
+ %destructor { ndt_field_seq_del($$); } <field_seq>
372
+ %destructor { ndt_string_seq_del($$); } <string_seq>
373
+ %destructor { ndt_type_seq_del($$); } <type_seq>
374
+ %destructor { ndt_free($$); } <string>
375
+
376
+ %%
377
+
378
+ input:
379
+ datatype ENDMARKER { $$ = $1; *ast = $$; YYACCEPT; }
380
+
381
+ datatype:
382
+ LPAREN dimensions RPAREN dtype { $$ = make_dimensions($2, $4, ctx); if ($$ == NULL) YYABORT; }
383
+ | dtype { $$ = $1; }
384
+ | function { $$ = $1; }
385
+
386
+ dimensions:
387
+ INTEGER { $$ = ndt_string_seq_new($1, ctx); if ($$ == NULL) YYABORT; }
388
+ | dimensions COMMA INTEGER { $$ = ndt_string_seq_append($1, $3, ctx); if ($$ == NULL) YYABORT; }
389
+
390
+ dtype:
391
+ modifier DTYPE { $$ = make_dtype($1, $2, ctx); if ($$ == NULL) YYABORT; }
392
+ | repeat BYTES { $$ = make_fixed_bytes($1, ctx); if ($$ == NULL) YYABORT; }
393
+ | record { $$ = $1; }
394
+
395
+ record:
396
+ RECORD LBRACE field_seq RBRACE { $$ = make_record($3, ctx); if ($$ == NULL) YYABORT; }
397
+
398
+ field_seq:
399
+ field { $$ = ndt_field_seq_new($1, ctx); if ($$ == NULL) YYABORT; }
400
+ | field_seq field { $$ = ndt_field_seq_append($1, $2, ctx); if ($$ == NULL) YYABORT; }
401
+
402
+ field:
403
+ datatype COLON NAME COLON padding { $$ = make_field($3, $1, $5, ctx); if ($$ == NULL) YYABORT; }
404
+
405
+ function:
406
+ dtype_seq RARROW dtype_seq { $$ = mk_function($1, $3, ctx); if ($$ == NULL) YYABORT; }
407
+
408
+ dtype_seq:
409
+ dtype { $$ = broadcast_seq_new($1, ctx); if ($$ == NULL) YYABORT; }
410
+ | dtype_seq dtype { $$ = broadcast_seq_append($1, $2, ctx); if ($$ == NULL) YYABORT; }
411
+
412
+ modifier:
413
+ %empty { $$ = '@'; }
414
+ | AT { $$ = '@'; }
415
+ | EQUAL { $$ = '='; }
416
+ | LESS { $$ = '<'; }
417
+ | GREATER { $$ = '>'; }
418
+ | BANG { $$ = '!'; }
419
+
420
+ repeat:
421
+ %empty { $$ = NULL; }
422
+ | INTEGER { $$ = $1; if ($$ == NULL) YYABORT; }
423
+
424
+ padding:
425
+ %empty { $$ = 0; }
426
+ | padding PAD { $$ = add_uint16($1, 1, ctx); if (ndt_err_occurred(ctx)) YYABORT; }
427
+
428
+