sportdb-parser 0.5.5 → 0.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1 -1
- data/Manifest.txt +2 -0
- data/lib/sportdb/parser/parser.rb +192 -184
- data/lib/sportdb/parser/racc_parser.rb +58 -0
- data/lib/sportdb/parser/racc_tree.rb +162 -0
- data/lib/sportdb/parser/tokenizer.rb +232 -7
- data/lib/sportdb/parser/version.rb +1 -1
- data/lib/sportdb/parser.rb +9 -298
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac0970b3fbdf8ca8030b5b8de8f149b630b76546acbf094c78ccf5deb6d31ef0
|
4
|
+
data.tar.gz: 8ff6968c2d1113952040ab297cb522e5b8948f9a69c08543e9dd2763b0867f01
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b1a8eb1bef571c019e4201a71ccb73dfe06cf8e348f46f9cfa2b676d7acf639132c27b6c0cb59d9da40521ca82d522a4e240321b7402b38bab0354ca8d313e22
|
7
|
+
data.tar.gz: d4125ca745cdc4fc432e68577f80904a572050447272a32625b9df6f203de101c477be91574a2dc5f37f5ea1341d2bc517ecae4d2a99104c5048f6cbed71085c
|
data/CHANGELOG.md
CHANGED
data/Manifest.txt
CHANGED
@@ -10,6 +10,8 @@ config/rounds_pt.txt
|
|
10
10
|
lib/sportdb/parser.rb
|
11
11
|
lib/sportdb/parser/lang.rb
|
12
12
|
lib/sportdb/parser/parser.rb
|
13
|
+
lib/sportdb/parser/racc_parser.rb
|
14
|
+
lib/sportdb/parser/racc_tree.rb
|
13
15
|
lib/sportdb/parser/token-date.rb
|
14
16
|
lib/sportdb/parser/token-score.rb
|
15
17
|
lib/sportdb/parser/token-status.rb
|
@@ -9,200 +9,200 @@ class RaccMatchParser < Racc::Parser
|
|
9
9
|
##### State transition tables begin ###
|
10
10
|
|
11
11
|
racc_action_table = [
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
99, 100,
|
22
|
-
|
23
|
-
|
12
|
+
34, 120, 12, 106, 33, 38, 30, 58, 95, 39,
|
13
|
+
16, 61, 24, 121, 13, 40, 27, 14, 15, 45,
|
14
|
+
17, 19, 22, 24, 12, 30, 33, 27, 30, 56,
|
15
|
+
71, 32, 16, 62, 63, 130, 13, 43, 27, 14,
|
16
|
+
15, 41, 17, 19, 22, 24, 55, 52, 55, 92,
|
17
|
+
32, 59, 81, 32, 82, 64, 129, 46, 49, 48,
|
18
|
+
42, 73, 75, 76, 77, 68, 53, 56, 53, 56,
|
19
|
+
66, 32, 86, 87, 108, 109, 118, 119, 126, 127,
|
20
|
+
135, 127, 71, 72, 84, 88, 89, 90, 27, 97,
|
21
|
+
99, 42, 100, 101, 32, 103, 32, 110, 38, 112,
|
22
|
+
113, 81, 71, 122, 123, 124, 27, 128, 32, 32,
|
23
|
+
71, 38, 133, 71, 27, 137, 138 ]
|
24
24
|
|
25
25
|
racc_action_check = [
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
0,
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
115, 116,
|
26
|
+
1, 83, 1, 69, 1, 12, 1, 22, 53, 13,
|
27
|
+
1, 27, 22, 83, 1, 14, 1, 1, 1, 17,
|
28
|
+
1, 1, 1, 1, 0, 16, 0, 20, 0, 53,
|
29
|
+
69, 1, 0, 27, 27, 98, 0, 16, 0, 0,
|
30
|
+
0, 15, 0, 0, 0, 0, 21, 21, 50, 50,
|
31
|
+
16, 26, 38, 0, 38, 28, 98, 18, 18, 18,
|
32
|
+
15, 36, 36, 36, 36, 30, 21, 21, 50, 50,
|
33
|
+
29, 29, 40, 40, 71, 71, 82, 82, 93, 93,
|
34
|
+
125, 125, 32, 34, 39, 43, 44, 47, 52, 54,
|
35
|
+
56, 58, 60, 63, 65, 66, 68, 73, 74, 76,
|
36
|
+
77, 79, 81, 85, 88, 89, 92, 96, 102, 104,
|
37
|
+
106, 115, 116, 117, 127, 130, 132 ]
|
38
38
|
|
39
39
|
racc_action_pointer = [
|
40
|
-
|
41
|
-
nil, nil, -2,
|
42
|
-
-
|
43
|
-
nil,
|
44
|
-
nil,
|
45
|
-
nil,
|
46
|
-
nil, nil,
|
47
|
-
|
48
|
-
|
49
|
-
nil,
|
50
|
-
nil, nil,
|
51
|
-
nil, nil, nil, nil,
|
52
|
-
nil, nil, nil, nil, 76, nil,
|
53
|
-
nil,
|
40
|
+
22, 0, nil, nil, nil, nil, nil, nil, nil, nil,
|
41
|
+
nil, nil, -2, -6, 0, 37, 19, 15, 53, nil,
|
42
|
+
11, 42, -11, nil, nil, nil, 22, 5, 51, 40,
|
43
|
+
35, nil, 50, nil, 83, nil, 58, nil, 44, 68,
|
44
|
+
54, nil, nil, 74, 75, nil, nil, 66, nil, nil,
|
45
|
+
44, nil, 72, 4, 85, nil, 63, nil, 68, nil,
|
46
|
+
76, nil, nil, 77, nil, 63, 91, nil, 65, -2,
|
47
|
+
nil, 41, nil, 93, 91, nil, 95, 96, nil, 93,
|
48
|
+
nil, 70, 64, -3, nil, 99, nil, nil, 100, 101,
|
49
|
+
nil, nil, 90, 74, nil, nil, 103, nil, 30, nil,
|
50
|
+
nil, nil, 77, nil, 78, nil, 78, nil, nil, nil,
|
51
|
+
nil, nil, nil, nil, nil, 104, 101, 81, nil, nil,
|
52
|
+
nil, nil, nil, nil, nil, 76, nil, 98, nil, nil,
|
53
|
+
88, nil, 107, nil, nil, nil, nil, nil, nil ]
|
54
54
|
|
55
55
|
racc_action_default = [
|
56
56
|
-90, -90, -1, -3, -4, -5, -6, -7, -8, -9,
|
57
|
-
-10, -11, -90, -90, -
|
58
|
-
-51, -53, -56, -65, -66, -90, -90, -74,
|
59
|
-
-
|
60
|
-
-55, -90, -90, -
|
61
|
-
-46, -90, -90, -90, -60, -90, -52, -54, -71,
|
62
|
-
-68, -69, -90, -
|
63
|
-
-
|
64
|
-
-90, -90, -90, -32, -90, -35, -36, -90, -90,
|
65
|
-
-45, -90, -90, -49, -57, -90, -59, -61, -63,
|
66
|
-
-
|
67
|
-
-14, -17, -19, -23, -90, -90, -27, -29, -30,
|
68
|
-
-33, -34, -38, -72, -90, -48, -90, -58, -62,
|
69
|
-
-84, -90, -26, -28, -47, -50, -64, -25 ]
|
57
|
+
-10, -11, -90, -90, -90, -54, -90, -90, -90, -41,
|
58
|
+
-90, -90, -51, -53, -56, -65, -66, -90, -90, -74,
|
59
|
+
-90, -79, -90, -89, -90, -2, -90, -13, -20, -90,
|
60
|
+
-90, -37, -55, -90, -90, -39, -40, -90, -43, -44,
|
61
|
+
-90, -46, -90, -90, -90, -60, -90, -52, -54, -71,
|
62
|
+
-90, -68, -69, -90, -73, -90, -77, -80, -90, -81,
|
63
|
+
-82, -85, 139, -90, -90, -15, -16, -18, -21, -22,
|
64
|
+
-24, -90, -90, -90, -32, -90, -35, -36, -90, -90,
|
65
|
+
-42, -45, -90, -90, -49, -57, -90, -59, -61, -63,
|
66
|
+
-67, -70, -76, -78, -75, -83, -90, -86, -87, -88,
|
67
|
+
-12, -14, -17, -19, -23, -90, -90, -27, -29, -30,
|
68
|
+
-31, -33, -34, -38, -72, -90, -48, -90, -58, -62,
|
69
|
+
-90, -84, -90, -26, -28, -47, -50, -64, -25 ]
|
70
70
|
|
71
71
|
racc_goto_table = [
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
nil, nil, nil,
|
76
|
-
nil, nil,
|
77
|
-
nil,
|
78
|
-
nil, nil,
|
79
|
-
nil, nil,
|
80
|
-
nil,
|
72
|
+
50, 37, 70, 80, 67, 93, 51, 102, 2, 35,
|
73
|
+
104, 1, 36, 74, 78, 79, 116, 117, 83, 85,
|
74
|
+
47, 57, 96, 98, 60, 44, 65, 69, 107, nil,
|
75
|
+
nil, nil, 94, nil, nil, 91, nil, nil, nil, 105,
|
76
|
+
nil, nil, nil, nil, 114, 125, nil, nil, nil, nil,
|
77
|
+
nil, 115, nil, nil, nil, nil, nil, nil, nil, nil,
|
78
|
+
nil, nil, nil, 111, nil, nil, nil, nil, nil, nil,
|
79
|
+
nil, nil, 94, nil, nil, nil, 131, 67, nil, 67,
|
80
|
+
nil, nil, nil, nil, nil, nil, nil, 134, nil, nil,
|
81
81
|
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
82
|
-
nil, nil, nil,
|
82
|
+
nil, nil, nil, nil, 132, nil, nil, 136 ]
|
83
83
|
|
84
84
|
racc_goto_check = [
|
85
|
-
26, 13,
|
85
|
+
26, 13, 18, 17, 38, 28, 27, 36, 2, 2,
|
86
86
|
36, 1, 12, 14, 15, 16, 19, 20, 21, 22,
|
87
|
-
|
88
|
-
nil, nil,
|
89
|
-
nil, nil,
|
90
|
-
nil, nil, nil, nil, nil, nil,
|
91
|
-
nil, nil, 13, nil, nil, nil, nil, nil, nil,
|
92
|
-
nil, nil,
|
93
|
-
nil,
|
87
|
+
24, 29, 30, 31, 34, 35, 37, 39, 40, nil,
|
88
|
+
nil, nil, 26, nil, nil, 27, nil, nil, nil, 18,
|
89
|
+
nil, nil, nil, nil, 17, 28, nil, nil, nil, nil,
|
90
|
+
nil, 18, nil, nil, nil, nil, nil, nil, nil, nil,
|
91
|
+
nil, nil, nil, 13, nil, nil, nil, nil, nil, nil,
|
92
|
+
nil, nil, 26, nil, nil, nil, 18, 38, nil, 38,
|
93
|
+
nil, nil, nil, nil, nil, nil, nil, 18, nil, nil,
|
94
94
|
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
95
|
-
nil, nil, nil,
|
95
|
+
nil, nil, nil, nil, 13, nil, nil, 26 ]
|
96
96
|
|
97
97
|
racc_goto_pointer = [
|
98
98
|
nil, 11, 8, nil, nil, nil, nil, nil, nil, nil,
|
99
|
-
nil, nil, 0, -11, -
|
100
|
-
-
|
101
|
-
-
|
102
|
-
-
|
99
|
+
nil, nil, 0, -11, -23, -24, -23, -35, -30, -66,
|
100
|
+
-65, -21, -21, nil, 2, nil, -20, -15, -47, -1,
|
101
|
+
-31, -33, nil, nil, -3, 9, -58, -3, -25, -5,
|
102
|
+
-43 ]
|
103
103
|
|
104
104
|
racc_goto_default = [
|
105
105
|
nil, nil, nil, 3, 4, 5, 6, 7, 8, 9,
|
106
|
-
10, 11, nil, nil, nil, nil, nil, nil,
|
107
|
-
nil, nil, nil,
|
108
|
-
|
106
|
+
10, 11, nil, nil, nil, nil, nil, nil, nil, nil,
|
107
|
+
nil, nil, nil, 18, nil, 20, 21, nil, nil, 23,
|
108
|
+
54, nil, 25, 26, nil, 28, 29, nil, 31, nil,
|
109
109
|
nil ]
|
110
110
|
|
111
111
|
racc_reduce_table = [
|
112
112
|
0, 0, :racc_error,
|
113
|
-
1,
|
114
|
-
2,
|
115
|
-
1,
|
116
|
-
1,
|
117
|
-
1,
|
118
|
-
1,
|
119
|
-
1,
|
120
|
-
1,
|
121
|
-
1,
|
122
|
-
1,
|
123
|
-
1,
|
124
|
-
4,
|
125
|
-
1,
|
126
|
-
3,
|
127
|
-
2,
|
128
|
-
1,
|
129
|
-
2,
|
130
|
-
1,
|
131
|
-
2,
|
132
|
-
1,
|
133
|
-
2,
|
134
|
-
1,
|
135
|
-
2,
|
136
|
-
1,
|
137
|
-
4,
|
138
|
-
3,
|
139
|
-
1,
|
140
|
-
2,
|
141
|
-
1, 51, :_reduce_none,
|
142
|
-
1, 51, :_reduce_none,
|
143
|
-
4, 37, :_reduce_31,
|
144
|
-
1, 52, :_reduce_32,
|
145
|
-
2, 52, :_reduce_33,
|
146
|
-
4, 38, :_reduce_34,
|
147
|
-
1, 53, :_reduce_35,
|
148
|
-
1, 53, :_reduce_36,
|
149
|
-
2, 34, :_reduce_37,
|
150
|
-
4, 34, :_reduce_38,
|
151
|
-
2, 35, :_reduce_39,
|
152
|
-
2, 36, :_reduce_40,
|
153
|
-
1, 54, :_reduce_41,
|
154
|
-
3, 54, :_reduce_42,
|
113
|
+
1, 36, :_reduce_none,
|
114
|
+
2, 36, :_reduce_none,
|
115
|
+
1, 37, :_reduce_none,
|
116
|
+
1, 37, :_reduce_none,
|
117
|
+
1, 37, :_reduce_none,
|
118
|
+
1, 37, :_reduce_none,
|
119
|
+
1, 37, :_reduce_none,
|
120
|
+
1, 37, :_reduce_none,
|
121
|
+
1, 37, :_reduce_none,
|
122
|
+
1, 37, :_reduce_none,
|
123
|
+
1, 37, :_reduce_none,
|
124
|
+
4, 46, :_reduce_12,
|
125
|
+
1, 47, :_reduce_13,
|
126
|
+
3, 47, :_reduce_14,
|
127
|
+
2, 47, :_reduce_15,
|
128
|
+
1, 49, :_reduce_none,
|
129
|
+
2, 49, :_reduce_17,
|
130
|
+
1, 49, :_reduce_none,
|
131
|
+
2, 49, :_reduce_19,
|
132
|
+
1, 48, :_reduce_20,
|
133
|
+
2, 48, :_reduce_21,
|
134
|
+
1, 50, :_reduce_22,
|
135
|
+
2, 50, :_reduce_23,
|
136
|
+
1, 50, :_reduce_24,
|
137
|
+
4, 52, :_reduce_25,
|
138
|
+
3, 51, :_reduce_26,
|
139
|
+
1, 54, :_reduce_27,
|
140
|
+
2, 54, :_reduce_28,
|
155
141
|
1, 55, :_reduce_none,
|
156
142
|
1, 55, :_reduce_none,
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
4,
|
161
|
-
1,
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
1,
|
176
|
-
3,
|
177
|
-
1,
|
178
|
-
|
179
|
-
|
180
|
-
1,
|
181
|
-
|
182
|
-
|
183
|
-
2,
|
184
|
-
|
185
|
-
2,
|
186
|
-
1,
|
187
|
-
|
188
|
-
3,
|
189
|
-
1,
|
190
|
-
|
191
|
-
1,
|
192
|
-
|
193
|
-
|
194
|
-
1,
|
195
|
-
|
196
|
-
3,
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
1,
|
201
|
-
|
143
|
+
4, 41, :_reduce_31,
|
144
|
+
1, 56, :_reduce_32,
|
145
|
+
2, 56, :_reduce_33,
|
146
|
+
4, 42, :_reduce_34,
|
147
|
+
1, 57, :_reduce_35,
|
148
|
+
1, 57, :_reduce_36,
|
149
|
+
2, 38, :_reduce_37,
|
150
|
+
4, 38, :_reduce_38,
|
151
|
+
2, 39, :_reduce_39,
|
152
|
+
2, 40, :_reduce_40,
|
153
|
+
1, 58, :_reduce_41,
|
154
|
+
3, 58, :_reduce_42,
|
155
|
+
1, 59, :_reduce_none,
|
156
|
+
1, 59, :_reduce_none,
|
157
|
+
3, 43, :_reduce_45,
|
158
|
+
2, 43, :_reduce_46,
|
159
|
+
5, 43, :_reduce_47,
|
160
|
+
4, 43, :_reduce_48,
|
161
|
+
1, 63, :_reduce_49,
|
162
|
+
3, 63, :_reduce_50,
|
163
|
+
1, 60, :_reduce_51,
|
164
|
+
2, 60, :_reduce_52,
|
165
|
+
1, 60, :_reduce_none,
|
166
|
+
1, 64, :_reduce_54,
|
167
|
+
2, 64, :_reduce_55,
|
168
|
+
1, 64, :_reduce_56,
|
169
|
+
2, 62, :_reduce_57,
|
170
|
+
3, 62, :_reduce_58,
|
171
|
+
2, 62, :_reduce_59,
|
172
|
+
1, 62, :_reduce_60,
|
173
|
+
2, 65, :_reduce_61,
|
174
|
+
3, 65, :_reduce_62,
|
175
|
+
1, 66, :_reduce_63,
|
176
|
+
3, 66, :_reduce_64,
|
177
|
+
1, 61, :_reduce_none,
|
178
|
+
1, 61, :_reduce_none,
|
179
|
+
3, 68, :_reduce_67,
|
180
|
+
1, 69, :_reduce_none,
|
181
|
+
1, 69, :_reduce_none,
|
182
|
+
3, 67, :_reduce_70,
|
183
|
+
2, 67, :_reduce_71,
|
184
|
+
4, 44, :_reduce_72,
|
185
|
+
2, 44, :_reduce_73,
|
186
|
+
1, 70, :_reduce_74,
|
187
|
+
3, 70, :_reduce_75,
|
188
|
+
3, 70, :_reduce_76,
|
189
|
+
1, 72, :_reduce_none,
|
190
|
+
2, 72, :_reduce_none,
|
191
|
+
1, 71, :_reduce_79,
|
192
|
+
2, 71, :_reduce_80,
|
193
|
+
2, 73, :_reduce_81,
|
194
|
+
1, 74, :_reduce_82,
|
195
|
+
2, 74, :_reduce_83,
|
196
|
+
3, 74, :_reduce_84,
|
197
|
+
1, 53, :_reduce_85,
|
198
|
+
2, 53, :_reduce_86,
|
199
|
+
1, 75, :_reduce_87,
|
200
|
+
1, 75, :_reduce_88,
|
201
|
+
1, 45, :_reduce_89 ]
|
202
202
|
|
203
203
|
racc_reduce_n = 90
|
204
204
|
|
205
|
-
racc_shift_n =
|
205
|
+
racc_shift_n = 139
|
206
206
|
|
207
207
|
racc_token_table = {
|
208
208
|
false => 0,
|
@@ -219,25 +219,29 @@ racc_token_table = {
|
|
219
219
|
"]" => 11,
|
220
220
|
:YELLOW_CARD => 12,
|
221
221
|
:RED_CARD => 13,
|
222
|
-
:
|
222
|
+
:GROUP_DEF => 14,
|
223
223
|
"|" => 15,
|
224
|
-
:
|
225
|
-
:
|
224
|
+
:TEAM => 16,
|
225
|
+
:ROUND_DEF => 17,
|
226
226
|
:DATE => 18,
|
227
227
|
:DURATION => 19,
|
228
|
-
:
|
229
|
-
:
|
230
|
-
:
|
231
|
-
|
232
|
-
:
|
233
|
-
|
234
|
-
:
|
235
|
-
|
236
|
-
:
|
237
|
-
:
|
238
|
-
|
239
|
-
|
240
|
-
|
228
|
+
:GROUP => 20,
|
229
|
+
:ROUND => 21,
|
230
|
+
:ORD => 22,
|
231
|
+
:TIME => 23,
|
232
|
+
:STATUS => 24,
|
233
|
+
"@" => 25,
|
234
|
+
:TIMEZONE => 26,
|
235
|
+
:TEXT => 27,
|
236
|
+
:VS => 28,
|
237
|
+
:SCORE => 29,
|
238
|
+
";" => 30,
|
239
|
+
:PLAYER => 31,
|
240
|
+
:MINUTE => 32,
|
241
|
+
:OG => 33,
|
242
|
+
:PEN => 34 }
|
243
|
+
|
244
|
+
racc_nt_base = 35
|
241
245
|
|
242
246
|
racc_use_result_var = true
|
243
247
|
|
@@ -273,20 +277,24 @@ Racc_token_to_s_table = [
|
|
273
277
|
"\"]\"",
|
274
278
|
"YELLOW_CARD",
|
275
279
|
"RED_CARD",
|
276
|
-
"
|
280
|
+
"GROUP_DEF",
|
277
281
|
"\"|\"",
|
278
|
-
"
|
279
|
-
"
|
282
|
+
"TEAM",
|
283
|
+
"ROUND_DEF",
|
280
284
|
"DATE",
|
281
285
|
"DURATION",
|
286
|
+
"GROUP",
|
287
|
+
"ROUND",
|
282
288
|
"ORD",
|
283
289
|
"TIME",
|
284
290
|
"STATUS",
|
285
291
|
"\"@\"",
|
286
292
|
"TIMEZONE",
|
293
|
+
"TEXT",
|
287
294
|
"VS",
|
288
295
|
"SCORE",
|
289
296
|
"\";\"",
|
297
|
+
"PLAYER",
|
290
298
|
"MINUTE",
|
291
299
|
"OG",
|
292
300
|
"PEN",
|
@@ -0,0 +1,58 @@
|
|
1
|
+
|
2
|
+
####
|
3
|
+
# RaccMatchParser support machinery (incl. node classes/abstract syntax tree)
|
4
|
+
|
5
|
+
class RaccMatchParser
|
6
|
+
|
7
|
+
|
8
|
+
def initialize( txt )
|
9
|
+
## puts "==> txt:"
|
10
|
+
## puts txt
|
11
|
+
|
12
|
+
parser = SportDb::Parser.new
|
13
|
+
@tokens = parser.tokenize( txt )
|
14
|
+
## pp @tokens
|
15
|
+
|
16
|
+
## quick hack - convert to racc format single char literal tokens e.g. '@' etc.
|
17
|
+
@tokens = @tokens.map do |tok|
|
18
|
+
if tok.size == 1
|
19
|
+
[tok[0].to_s, tok[0].to_s]
|
20
|
+
else
|
21
|
+
tok
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
def next_token
|
28
|
+
tok = @tokens.shift
|
29
|
+
puts "next_token => #{tok.pretty_inspect}"
|
30
|
+
tok
|
31
|
+
end
|
32
|
+
|
33
|
+
# on_error do |error_token_id, error_value, value_stack|
|
34
|
+
# puts "Parse error on token: #{error_token_id}, value: #{error_value}"
|
35
|
+
# end
|
36
|
+
|
37
|
+
def parse
|
38
|
+
puts "parse:"
|
39
|
+
@tree = []
|
40
|
+
do_parse
|
41
|
+
@tree
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
def on_error(*args)
|
46
|
+
puts
|
47
|
+
puts "!! on parse error:"
|
48
|
+
puts "args=#{args.pretty_inspect}"
|
49
|
+
exit 1 ## exit for now - get and print more info about context etc.!!
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
=begin
|
54
|
+
on_error do |error_token_id, error_value, value_stack|
|
55
|
+
puts "Parse error on token: #{error_token_id}, value: #{error_value}"
|
56
|
+
end
|
57
|
+
=end
|
58
|
+
end # class RaccMatchParser
|
@@ -0,0 +1,162 @@
|
|
1
|
+
|
2
|
+
####
|
3
|
+
# RaccMatchParser support machinery (incl. node classes/abstract syntax tree)
|
4
|
+
|
5
|
+
class RaccMatchParser
|
6
|
+
|
7
|
+
|
8
|
+
LineupLine = Struct.new( :team, :lineup ) do
|
9
|
+
def pretty_print( printer )
|
10
|
+
printer.text( "<LineupLine " )
|
11
|
+
printer.text( self.team )
|
12
|
+
printer.text( " lineup=" + self.lineup.pretty_inspect )
|
13
|
+
printer.text( ">" )
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
Lineup = Struct.new( :name, :card, :sub ) do
|
18
|
+
def pretty_print( printer )
|
19
|
+
buf = String.new
|
20
|
+
buf << self.name
|
21
|
+
buf << " card=" + self.card.pretty_inspect if card
|
22
|
+
buf << " sub=" + self.sub.pretty_inspect if sub
|
23
|
+
printer.text( buf )
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
Card = Struct.new( :name, :minute ) do
|
29
|
+
def to_s
|
30
|
+
buf = String.new
|
31
|
+
buf << "#{self.name}"
|
32
|
+
buf << " #{self.minute.to_s}" if self.minute
|
33
|
+
buf
|
34
|
+
end
|
35
|
+
|
36
|
+
def pretty_print( printer )
|
37
|
+
printer.text( to_s )
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
Sub = Struct.new( :minute, :sub ) do
|
43
|
+
def pretty_print( printer )
|
44
|
+
buf = String.new
|
45
|
+
buf << "(#{self.minute.to_s} "
|
46
|
+
buf << self.sub.pretty_inspect
|
47
|
+
buf << ")"
|
48
|
+
printer.text( buf )
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
GroupDef = Struct.new( :name, :teams ) do
|
55
|
+
def pretty_print( printer )
|
56
|
+
printer.text( "<GroupDef " )
|
57
|
+
printer.text( self.name )
|
58
|
+
printer.text( " teams=" + self.teams.pretty_inspect )
|
59
|
+
printer.text( ">" )
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
RoundDef = Struct.new( :name, :date, :duration ) do
|
65
|
+
def pretty_print( printer )
|
66
|
+
printer.text( "<RoundDef " )
|
67
|
+
printer.text( self.name )
|
68
|
+
printer.text( " date=" + self.date.pretty_inspect ) if date
|
69
|
+
printer.text( " durattion=" + self.duration.pretty_inspect ) if duration
|
70
|
+
printer.text( ">" )
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
DateHeader = Struct.new( :date ) do
|
75
|
+
def pretty_print( printer )
|
76
|
+
printer.text( "<DateHeader " )
|
77
|
+
printer.text( "#{self.date.pretty_inspect}>" )
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
GroupHeader = Struct.new( :name ) do
|
82
|
+
def pretty_print( printer )
|
83
|
+
printer.text( "<GroupHeader " )
|
84
|
+
printer.text( "#{self.name}>" )
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
RoundHeader = Struct.new( :names ) do
|
89
|
+
def pretty_print( printer )
|
90
|
+
printer.text( "<RoundHeader " )
|
91
|
+
printer.text( "#{self.names.join(', ')}>" )
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
MatchLine = Struct.new( :ord, :date, :time,
|
96
|
+
:team1, :team2, :score,
|
97
|
+
:status,
|
98
|
+
:geo,
|
99
|
+
:timezone ) do ## change to geos - why? why not?
|
100
|
+
|
101
|
+
def pretty_print( printer )
|
102
|
+
printer.text( "<MatchLine " )
|
103
|
+
printer.text( "#{self.team1} v #{self.team2}")
|
104
|
+
printer.breakable
|
105
|
+
|
106
|
+
members.zip(values) do |name, value|
|
107
|
+
next if [:team1, :team2].include?( name )
|
108
|
+
next if value.nil?
|
109
|
+
|
110
|
+
printer.text( "#{name}=#{value.pretty_inspect}" )
|
111
|
+
end
|
112
|
+
|
113
|
+
printer.text( ">" )
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
GoalLine = Struct.new( :goals1, :goals2 ) do
|
119
|
+
def pretty_print( printer )
|
120
|
+
printer.text( "<GoalLine " )
|
121
|
+
printer.text( "goals1=" + self.goals1.pretty_inspect + "," )
|
122
|
+
printer.breakable
|
123
|
+
printer.text( "goals2=" + self.goals2.pretty_inspect + ">" )
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
Goal = Struct.new( :player, :minutes ) do
|
128
|
+
def to_s
|
129
|
+
buf = String.new
|
130
|
+
buf << "#{self.player}"
|
131
|
+
buf << " "
|
132
|
+
buf << minutes.map { |min| min.to_s }.join(' ')
|
133
|
+
buf
|
134
|
+
end
|
135
|
+
|
136
|
+
def pretty_print( printer )
|
137
|
+
printer.text( to_s )
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
|
142
|
+
|
143
|
+
##
|
144
|
+
## fix - move :og, :pen to Goal if possible - why? why not?
|
145
|
+
## or change to GoalMinute ???
|
146
|
+
Minute = Struct.new( :m, :offset, :og, :pen ) do
|
147
|
+
def to_s
|
148
|
+
buf = String.new
|
149
|
+
buf << "#{self.m}"
|
150
|
+
buf << "+#{self.offset}" if self.offset
|
151
|
+
buf << "'"
|
152
|
+
buf << "(og)" if self.og
|
153
|
+
buf << "(pen)" if self.pen
|
154
|
+
buf
|
155
|
+
end
|
156
|
+
|
157
|
+
def pretty_print( printer )
|
158
|
+
printer.text( to_s )
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
end # class RaccMatchParser
|
@@ -14,8 +14,239 @@ def log( msg )
|
|
14
14
|
end
|
15
15
|
|
16
16
|
|
17
|
+
## transforms
|
18
|
+
##
|
19
|
+
## Netherlands 1-2 (1-1) England
|
20
|
+
## => text => team
|
21
|
+
## score|vs
|
22
|
+
## text => team
|
23
|
+
|
24
|
+
|
25
|
+
## token iter/find better name
|
26
|
+
## e.g. TokenBuffer/Scanner or such ??
|
27
|
+
class Tokens
|
28
|
+
def initialize( tokens )
|
29
|
+
@tokens = tokens
|
30
|
+
@pos = 0
|
31
|
+
end
|
32
|
+
|
33
|
+
def pos() @pos; end
|
34
|
+
def eos?() @pos >= @tokens.size; end
|
35
|
+
|
36
|
+
|
37
|
+
def include?( *types )
|
38
|
+
pos = @pos
|
39
|
+
## puts " starting include? #{types.inspect} @ #{pos}"
|
40
|
+
while pos < @tokens.size do
|
41
|
+
return true if types.include?( @tokens[pos][0] )
|
42
|
+
pos +=1
|
43
|
+
end
|
44
|
+
false
|
45
|
+
end
|
46
|
+
|
47
|
+
## pattern e.g. [:TEXT, [:VS,:SCORE], :TEXT]
|
48
|
+
def match?( *pattern )
|
49
|
+
## puts " starting match? #{pattern.inspect} @ #{@pos}"
|
50
|
+
pattern.each_with_index do |types,offset|
|
51
|
+
## if single symbol wrap in array
|
52
|
+
types = types.is_a?(Array) ? types : [types]
|
53
|
+
return false unless types.include?( peek(offset) )
|
54
|
+
end
|
55
|
+
true
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
## return token type (e.g. :TEXT, :NUM, etc.)
|
60
|
+
def cur() peek(0); end
|
61
|
+
## return content (assumed to be text)
|
62
|
+
def text(offset=0)
|
63
|
+
## raise error - why? why not?
|
64
|
+
## return nil?
|
65
|
+
if peek( offset ) != :text
|
66
|
+
raise ArgumentError, "text(#{offset}) - token not a text type"
|
67
|
+
end
|
68
|
+
@tokens[@pos+offset][1]
|
69
|
+
end
|
70
|
+
|
17
71
|
|
18
|
-
def
|
72
|
+
def peek(offset=1)
|
73
|
+
## return nil if eos
|
74
|
+
if @pos+offset >= @tokens.size
|
75
|
+
nil
|
76
|
+
else
|
77
|
+
@tokens[@pos+offset][0]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
## note - returns complete token
|
82
|
+
def next
|
83
|
+
# if @pos >= @tokens.size
|
84
|
+
# raise ArgumentError, "end of array - #{@pos} >= #{@tokens.size}"
|
85
|
+
# end
|
86
|
+
# throw (standard) end of iteration here why? why not?
|
87
|
+
|
88
|
+
t = @tokens[@pos]
|
89
|
+
@pos += 1
|
90
|
+
t
|
91
|
+
end
|
92
|
+
|
93
|
+
def collect( &blk )
|
94
|
+
tokens = []
|
95
|
+
loop do
|
96
|
+
break if eos?
|
97
|
+
tokens << if block_given?
|
98
|
+
blk.call( self.next )
|
99
|
+
else
|
100
|
+
self.next
|
101
|
+
end
|
102
|
+
end
|
103
|
+
tokens
|
104
|
+
end
|
105
|
+
end # class Tokens
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
### convience helper - ignore errors by default
|
111
|
+
def tokenize( lines, debug: false )
|
112
|
+
tokens, _ = tokenize_with_errors( lines, debug: debug )
|
113
|
+
tokens
|
114
|
+
end
|
115
|
+
|
116
|
+
def tokenize_with_errors( lines, debug: false )
|
117
|
+
|
118
|
+
##
|
119
|
+
## note - for convenience - add support
|
120
|
+
## comments (incl. inline end-of-line comments) and empty lines here
|
121
|
+
## why? why not?
|
122
|
+
## why? keeps handling "centralized" here in one place
|
123
|
+
|
124
|
+
## todo/fix - rework and make simpler
|
125
|
+
## no need to double join array of string to txt etc.
|
126
|
+
|
127
|
+
txt_pre = if lines.is_a?( Array )
|
128
|
+
## join together with newline
|
129
|
+
lines.reduce( String.new ) do |mem,line|
|
130
|
+
mem << line; mem << "\n"; mem
|
131
|
+
end
|
132
|
+
else ## assume single-all-in-one txt
|
133
|
+
lines
|
134
|
+
end
|
135
|
+
|
136
|
+
## preprocess automagically - why? why not?
|
137
|
+
## strip lines with comments and empty lines striped / removed
|
138
|
+
## keep empty lines? why? why not?
|
139
|
+
## keep leading spaces (indent) - why?
|
140
|
+
txt = String.new
|
141
|
+
txt_pre.each_line do |line| ## preprocess
|
142
|
+
line = line.strip
|
143
|
+
next if line.empty? || line.start_with?('#') ### skip empty lines and comments
|
144
|
+
|
145
|
+
line = line.sub( /#.*/, '' ).strip ### cut-off end-of line comments too
|
146
|
+
|
147
|
+
txt << line
|
148
|
+
txt << "\n"
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
tokens_by_line = [] ## note: add tokens line-by-line (flatten later)
|
153
|
+
errors = [] ## keep a list of errors - why? why not?
|
154
|
+
|
155
|
+
txt.each_line do |line|
|
156
|
+
line = line.rstrip ## note - MUST remove/strip trailing newline (spaces optional)!!!
|
157
|
+
|
158
|
+
more_tokens, more_errors = _tokenize_line( line, debug: debug )
|
159
|
+
|
160
|
+
tokens_by_line << more_tokens
|
161
|
+
errors += more_errors
|
162
|
+
end # each line
|
163
|
+
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
tokens_by_line = tokens_by_line.map do |tokens|
|
168
|
+
#############
|
169
|
+
## pass 1
|
170
|
+
## replace all texts with keyword matches
|
171
|
+
## (e.g. group, round, leg, etc.)
|
172
|
+
tokens = tokens.map do |t|
|
173
|
+
if t[0] == :TEXT
|
174
|
+
text = t[1]
|
175
|
+
t = if is_group?( text )
|
176
|
+
[:GROUP, text]
|
177
|
+
elsif is_round?( text ) || is_leg?( text )
|
178
|
+
[:ROUND, text]
|
179
|
+
else
|
180
|
+
t ## pass through as-is (1:1)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
t
|
184
|
+
end
|
185
|
+
|
186
|
+
#################
|
187
|
+
## pass 2
|
188
|
+
## transform tokens (using simple patterns)
|
189
|
+
## to help along the (racc look ahead 1 - LA1) parser
|
190
|
+
nodes = []
|
191
|
+
|
192
|
+
buf = Tokens.new( tokens )
|
193
|
+
## pp buf
|
194
|
+
|
195
|
+
|
196
|
+
loop do
|
197
|
+
break if buf.eos?
|
198
|
+
|
199
|
+
if buf.pos == 0 ## MUST start line
|
200
|
+
## check for
|
201
|
+
## group def or round def
|
202
|
+
if buf.match?( :ROUND, :'|' ) ## assume round def (change round to round_def)
|
203
|
+
nodes << [:ROUND_DEF, buf.next[1]]
|
204
|
+
nodes << buf.next
|
205
|
+
nodes += buf.collect
|
206
|
+
break
|
207
|
+
end
|
208
|
+
if buf.match?( :GROUP, :'|' ) ## assume group def (change group to group_def)
|
209
|
+
nodes << [:GROUP_DEF, buf.next[1]]
|
210
|
+
nodes << buf.next
|
211
|
+
## change all text to team - why? why not?
|
212
|
+
nodes += buf.collect { |t|
|
213
|
+
t[0] == :TEXT ? [:TEAM, t[1]] : t
|
214
|
+
}
|
215
|
+
break
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
|
220
|
+
if buf.match?( :TEXT, [:SCORE, :VS, :'-'], :TEXT )
|
221
|
+
nodes << [:TEAM, buf.next[1]]
|
222
|
+
nodes << buf.next
|
223
|
+
nodes << [:TEAM, buf.next[1]]
|
224
|
+
elsif buf.match?( :TEXT, :MINUTE )
|
225
|
+
nodes << [:PLAYER, buf.next[1]]
|
226
|
+
nodes << buf.next
|
227
|
+
else
|
228
|
+
## pass through
|
229
|
+
nodes << buf.next
|
230
|
+
end
|
231
|
+
end # loop
|
232
|
+
nodes
|
233
|
+
end # map tokens_by_line
|
234
|
+
|
235
|
+
|
236
|
+
|
237
|
+
## flatten tokens
|
238
|
+
tokens = []
|
239
|
+
tokens_by_line.each do |tok|
|
240
|
+
tokens += tok
|
241
|
+
tokens << [:NEWLINE, "\n"] ## auto-add newlines
|
242
|
+
end
|
243
|
+
|
244
|
+
[tokens,errors]
|
245
|
+
end # method tokenize_with_errors
|
246
|
+
|
247
|
+
|
248
|
+
|
249
|
+
def _tokenize_line( line, debug: false )
|
19
250
|
tokens = []
|
20
251
|
errors = [] ## keep a list of errors - why? why not?
|
21
252
|
|
@@ -252,11 +483,5 @@ def tokenize_with_errors( line, debug: false )
|
|
252
483
|
end
|
253
484
|
|
254
485
|
|
255
|
-
### convience helper - ignore errors by default
|
256
|
-
def tokenize( line, debug: false )
|
257
|
-
tokens, _ = tokenize_with_errors( line, debug: debug )
|
258
|
-
tokens
|
259
|
-
end
|
260
|
-
|
261
486
|
end # class Parser
|
262
487
|
end # module SportDb
|
data/lib/sportdb/parser.rb
CHANGED
@@ -24,7 +24,9 @@ require_relative 'parser/token-status'
|
|
24
24
|
require_relative 'parser/token'
|
25
25
|
require_relative 'parser/tokenizer'
|
26
26
|
|
27
|
-
require_relative 'parser/parser'
|
27
|
+
require_relative 'parser/parser' ## auto-generated by racc (from parser.y)
|
28
|
+
require_relative 'parser/racc_parser'
|
29
|
+
require_relative 'parser/racc_tree'
|
28
30
|
|
29
31
|
|
30
32
|
|
@@ -44,9 +46,11 @@ end # module SportDb
|
|
44
46
|
|
45
47
|
|
46
48
|
module SportDb
|
47
|
-
|
48
|
-
|
49
|
-
|
49
|
+
###
|
50
|
+
## todo/fix - use LangHelper or such
|
51
|
+
## e.g. class Parser
|
52
|
+
## include LangHelper
|
53
|
+
## end
|
50
54
|
class Parser
|
51
55
|
## keep "old" access to checking for group, round & friends
|
52
56
|
## for now for compatibility
|
@@ -54,302 +58,9 @@ class Parser
|
|
54
58
|
def is_round?( text ) Lang.is_round?( text ); end
|
55
59
|
def is_leg?( text ) Lang.is_leg?( text ); end
|
56
60
|
end
|
61
|
+
end # module SportDb
|
57
62
|
|
58
63
|
|
59
64
|
|
60
|
-
class Tokenizer
|
61
|
-
|
62
|
-
attr_reader :tokens
|
63
|
-
|
64
|
-
def initialize( txt )
|
65
|
-
parser = Parser.new
|
66
|
-
|
67
|
-
tree = []
|
68
|
-
|
69
|
-
lines = txt.split( "\n" )
|
70
|
-
lines.each_with_index do |line,i|
|
71
|
-
next if line.strip.empty? || line.strip.start_with?( '#' )
|
72
|
-
## support for inline (end-of-line) comments
|
73
|
-
line = line.sub( /#.*/, '' ).strip
|
74
|
-
|
75
|
-
puts "line >#{line}<"
|
76
|
-
tokens = parser.tokenize( line )
|
77
|
-
pp tokens
|
78
|
-
|
79
|
-
tree << tokens
|
80
|
-
end
|
81
|
-
|
82
|
-
|
83
|
-
=begin
|
84
|
-
## quick hack
|
85
|
-
## turn all text tokens followed by minute token
|
86
|
-
## into player tokens!!!
|
87
|
-
##
|
88
|
-
## also auto-convert text tokens into team tokens - why? why not?
|
89
|
-
tree.each do |tokens|
|
90
|
-
tokens.each_with_index do |t0,idx|
|
91
|
-
t1 = tokens[idx+1]
|
92
|
-
if t1 && t1[0] == :minute && t0[0] == :text
|
93
|
-
t0[0] = :player
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
=end
|
98
|
-
|
99
|
-
=begin
|
100
|
-
## auto-add/insert start tokens for known line patterns
|
101
|
-
## START_GOALS for goals_line
|
102
|
-
## why? why not?
|
103
|
-
=end
|
104
|
-
|
105
|
-
## flatten
|
106
|
-
@tokens = []
|
107
|
-
tree.each do |tokens|
|
108
|
-
@tokens += tokens
|
109
|
-
@tokens << [:NEWLINE, "\n"] ## auto-add newlines
|
110
|
-
end
|
111
|
-
|
112
|
-
|
113
|
-
## convert to racc format
|
114
|
-
@tokens = @tokens.map do |tok|
|
115
|
-
if tok.size == 1
|
116
|
-
[tok[0].to_s, tok[0].to_s]
|
117
|
-
elsif tok.size == 2
|
118
|
-
#############
|
119
|
-
## pass 1
|
120
|
-
## replace all texts with keyword matches (e.g. group, round, leg, etc.)
|
121
|
-
if tok[0] == :TEXT
|
122
|
-
text = tok[1]
|
123
|
-
tok = if parser.is_group?( text )
|
124
|
-
[:GROUP, text]
|
125
|
-
elsif parser.is_round?( text ) || parser.is_leg?( text )
|
126
|
-
[:ROUND, text]
|
127
|
-
else
|
128
|
-
tok ## pass through as-is (1:1)
|
129
|
-
end
|
130
|
-
end
|
131
|
-
## pass 2
|
132
|
-
tok
|
133
|
-
else
|
134
|
-
raise ArgumentError, "tokens of size 1|2 expected; got #{tok.pretty_inspect}"
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
def next_token
|
142
|
-
@tokens.shift
|
143
|
-
end
|
144
|
-
end # class Tokenizer
|
145
|
-
end # module SportDb
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
####
|
150
|
-
# RaccMatchParser support machinery (incl. node classes/abstract syntax tree)
|
151
|
-
|
152
|
-
class RaccMatchParser
|
153
|
-
|
154
|
-
|
155
|
-
LineupLine = Struct.new( :team, :lineup ) do
|
156
|
-
def pretty_print( printer )
|
157
|
-
printer.text( "<LineupLine " )
|
158
|
-
printer.text( self.team )
|
159
|
-
printer.text( " lineup=" + self.lineup.pretty_inspect )
|
160
|
-
printer.text( ">" )
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
Lineup = Struct.new( :name, :card, :sub ) do
|
165
|
-
def pretty_print( printer )
|
166
|
-
buf = String.new
|
167
|
-
buf << self.name
|
168
|
-
buf << " card=" + self.card.pretty_inspect if card
|
169
|
-
buf << " sub=" + self.sub.pretty_inspect if sub
|
170
|
-
printer.text( buf )
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
|
175
|
-
Card = Struct.new( :name, :minute ) do
|
176
|
-
def to_s
|
177
|
-
buf = String.new
|
178
|
-
buf << "#{self.name}"
|
179
|
-
buf << " #{self.minute.to_s}" if self.minute
|
180
|
-
buf
|
181
|
-
end
|
182
|
-
|
183
|
-
def pretty_print( printer )
|
184
|
-
printer.text( to_s )
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
|
189
|
-
Sub = Struct.new( :minute, :sub ) do
|
190
|
-
def pretty_print( printer )
|
191
|
-
buf = String.new
|
192
|
-
buf << "(#{self.minute.to_s} "
|
193
|
-
buf << self.sub.pretty_inspect
|
194
|
-
buf << ")"
|
195
|
-
printer.text( buf )
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
GroupDef = Struct.new( :name, :teams ) do
|
202
|
-
def pretty_print( printer )
|
203
|
-
printer.text( "<GroupDef " )
|
204
|
-
printer.text( self.name )
|
205
|
-
printer.text( " teams=" + self.teams.pretty_inspect )
|
206
|
-
printer.text( ">" )
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
|
211
|
-
RoundDef = Struct.new( :name, :date, :duration ) do
|
212
|
-
def pretty_print( printer )
|
213
|
-
printer.text( "<RoundDef " )
|
214
|
-
printer.text( self.name )
|
215
|
-
printer.text( " date=" + self.date.pretty_inspect ) if date
|
216
|
-
printer.text( " durattion=" + self.duration.pretty_inspect ) if duration
|
217
|
-
printer.text( ">" )
|
218
|
-
end
|
219
|
-
end
|
220
|
-
|
221
|
-
DateHeader = Struct.new( :date ) do
|
222
|
-
def pretty_print( printer )
|
223
|
-
printer.text( "<DateHeader " )
|
224
|
-
printer.text( "#{self.date.pretty_inspect}>" )
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
GroupHeader = Struct.new( :name ) do
|
229
|
-
def pretty_print( printer )
|
230
|
-
printer.text( "<GroupHeader " )
|
231
|
-
printer.text( "#{self.name}>" )
|
232
|
-
end
|
233
|
-
end
|
234
|
-
|
235
|
-
RoundHeader = Struct.new( :names ) do
|
236
|
-
def pretty_print( printer )
|
237
|
-
printer.text( "<RoundHeader " )
|
238
|
-
printer.text( "#{self.names.join(', ')}>" )
|
239
|
-
end
|
240
|
-
end
|
241
|
-
|
242
|
-
MatchLine = Struct.new( :ord, :date, :time,
|
243
|
-
:team1, :team2, :score,
|
244
|
-
:status,
|
245
|
-
:geo,
|
246
|
-
:timezone ) do ## change to geos - why? why not?
|
247
|
-
|
248
|
-
def pretty_print( printer )
|
249
|
-
printer.text( "<MatchLine " )
|
250
|
-
printer.text( "#{self.team1} v #{self.team2}")
|
251
|
-
printer.breakable
|
252
|
-
|
253
|
-
members.zip(values) do |name, value|
|
254
|
-
next if [:team1, :team2].include?( name )
|
255
|
-
next if value.nil?
|
256
|
-
|
257
|
-
printer.text( "#{name}=#{value.pretty_inspect}" )
|
258
|
-
end
|
259
|
-
|
260
|
-
printer.text( ">" )
|
261
|
-
end
|
262
|
-
|
263
|
-
end
|
264
|
-
|
265
|
-
GoalLine = Struct.new( :goals1, :goals2 ) do
|
266
|
-
def pretty_print( printer )
|
267
|
-
printer.text( "<GoalLine " )
|
268
|
-
printer.text( "goals1=" + self.goals1.pretty_inspect + "," )
|
269
|
-
printer.breakable
|
270
|
-
printer.text( "goals2=" + self.goals2.pretty_inspect + ">" )
|
271
|
-
end
|
272
|
-
end
|
273
|
-
|
274
|
-
Goal = Struct.new( :player, :minutes ) do
|
275
|
-
def to_s
|
276
|
-
buf = String.new
|
277
|
-
buf << "#{self.player}"
|
278
|
-
buf << " "
|
279
|
-
buf << minutes.map { |min| min.to_s }.join(' ')
|
280
|
-
buf
|
281
|
-
end
|
282
|
-
|
283
|
-
def pretty_print( printer )
|
284
|
-
printer.text( to_s )
|
285
|
-
end
|
286
|
-
|
287
|
-
end
|
288
|
-
|
289
|
-
|
290
|
-
##
|
291
|
-
## fix - move :og, :pen to Goal if possible - why? why not?
|
292
|
-
## or change to GoalMinute ???
|
293
|
-
Minute = Struct.new( :m, :offset, :og, :pen ) do
|
294
|
-
def to_s
|
295
|
-
buf = String.new
|
296
|
-
buf << "#{self.m}"
|
297
|
-
buf << "+#{self.offset}" if self.offset
|
298
|
-
buf << "'"
|
299
|
-
buf << "(og)" if self.og
|
300
|
-
buf << "(pen)" if self.pen
|
301
|
-
buf
|
302
|
-
end
|
303
|
-
|
304
|
-
def pretty_print( printer )
|
305
|
-
printer.text( to_s )
|
306
|
-
end
|
307
|
-
end
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
def initialize(input)
|
313
|
-
puts "==> input:"
|
314
|
-
puts input
|
315
|
-
@tokenizer = SportDb::Tokenizer.new(input)
|
316
|
-
end
|
317
|
-
|
318
|
-
|
319
|
-
def next_token
|
320
|
-
tok = @tokenizer.next_token
|
321
|
-
puts "next_token => #{tok.pretty_inspect}"
|
322
|
-
tok
|
323
|
-
end
|
324
|
-
|
325
|
-
# on_error do |error_token_id, error_value, value_stack|
|
326
|
-
# puts "Parse error on token: #{error_token_id}, value: #{error_value}"
|
327
|
-
# end
|
328
|
-
|
329
|
-
def parse
|
330
|
-
puts "parse:"
|
331
|
-
@tree = []
|
332
|
-
do_parse
|
333
|
-
@tree
|
334
|
-
end
|
335
|
-
|
336
|
-
|
337
|
-
def on_error(*args)
|
338
|
-
puts
|
339
|
-
puts "!! on parse error:"
|
340
|
-
puts "args=#{args.pretty_inspect}"
|
341
|
-
exit 1 ## exit for now - get and print more info about context etc.!!
|
342
|
-
end
|
343
|
-
|
344
|
-
|
345
|
-
=begin
|
346
|
-
on_error do |error_token_id, error_value, value_stack|
|
347
|
-
puts "Parse error on token: #{error_token_id}, value: #{error_value}"
|
348
|
-
end
|
349
|
-
=end
|
350
|
-
|
351
|
-
end
|
352
|
-
|
353
|
-
|
354
65
|
puts SportDb::Module::Parser.banner # say hello
|
355
66
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sportdb-parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-01-
|
11
|
+
date: 2025-01-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cocos
|
@@ -98,6 +98,8 @@ files:
|
|
98
98
|
- lib/sportdb/parser.rb
|
99
99
|
- lib/sportdb/parser/lang.rb
|
100
100
|
- lib/sportdb/parser/parser.rb
|
101
|
+
- lib/sportdb/parser/racc_parser.rb
|
102
|
+
- lib/sportdb/parser/racc_tree.rb
|
101
103
|
- lib/sportdb/parser/token-date.rb
|
102
104
|
- lib/sportdb/parser/token-score.rb
|
103
105
|
- lib/sportdb/parser/token-status.rb
|