sportdb-parser 0.7.2 → 0.8.0
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 +8 -3
- data/Rakefile +23 -0
- data/lib/sportdb/parser/debuggable.rb +53 -0
- data/lib/sportdb/parser/lexer-logger.rb +20 -0
- data/lib/sportdb/parser/lexer-on_goal.rb +1 -6
- data/lib/sportdb/parser/lexer-on_prop_misc.rb +14 -1
- data/lib/sportdb/parser/lexer-on_top.rb +8 -0
- data/lib/sportdb/parser/lexer-tokenize.rb +22 -3
- data/lib/sportdb/parser/lexer.rb +27 -51
- data/lib/sportdb/parser/parse_tree--core.rb +29 -0
- data/lib/sportdb/parser/parse_tree-match.rb +309 -0
- data/lib/sportdb/parser/parse_tree-props.rb +233 -0
- data/lib/sportdb/parser/parse_tree.rb +202 -0
- data/lib/sportdb/parser/parser-top.rb +102 -0
- data/lib/sportdb/parser/parser.rb +1069 -909
- data/lib/sportdb/parser/token-geo.rb +1 -1
- data/lib/sportdb/parser/token-goals.rb +0 -8
- data/lib/sportdb/parser/token-prop.rb +40 -0
- data/lib/sportdb/parser/token.rb +33 -0
- data/lib/sportdb/parser/version.rb +2 -2
- data/lib/sportdb/parser.rb +45 -47
- metadata +10 -5
- data/lib/sportdb/parser/racc_parser.rb +0 -92
- data/lib/sportdb/parser/racc_tree.rb +0 -524
- /data/lib/sportdb/parser/{parser_runtime.rb → parser-runtime.rb} +0 -0
|
@@ -92,14 +92,6 @@ START_GOAL_LINE_ALT_RE = %r{
|
|
|
92
92
|
|
|
93
93
|
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
###
|
|
97
|
-
## e.g. (-; Metzger)
|
|
98
|
-
GOAL_NONE_RE = %r{ (?<goals_none>
|
|
99
|
-
-[ ]*;
|
|
100
|
-
)
|
|
101
|
-
}x
|
|
102
|
-
|
|
103
95
|
###
|
|
104
96
|
# note - alternate goal separator dash (-) MUST have leading and trailing space!!!
|
|
105
97
|
# e.g. (Metzger 83 - Krämer 29, 88, Cichy 33, Rahn 37)
|
|
@@ -263,6 +263,46 @@ ENCLOSED_NAME_RE = %r{
|
|
|
263
263
|
|
|
264
264
|
|
|
265
265
|
|
|
266
|
+
###
|
|
267
|
+
## e.g. -; ... or
|
|
268
|
+
## None - ... or
|
|
269
|
+
CARDS_NONE_LEFT_RE = %r{ (?<cards_none_left>
|
|
270
|
+
## (i) w/ semicolon (;)
|
|
271
|
+
(?: (?: - | \bnone)
|
|
272
|
+
[ ]* ;
|
|
273
|
+
)
|
|
274
|
+
## (ii) w/ dash (-)
|
|
275
|
+
| (?: (?: ∅ | \bnone)
|
|
276
|
+
[ ]+ - ## space REQUIRED
|
|
277
|
+
(?=[ ]|\z) ## positive lookahead - speace required
|
|
278
|
+
)
|
|
279
|
+
)}ix
|
|
280
|
+
|
|
281
|
+
## e.g ... ;-
|
|
282
|
+
## or ... ; None
|
|
283
|
+
CARDS_NONE_RIGHT_RE = %r{ (?<cards_none_right>
|
|
284
|
+
## (i) w/ semicolon (;)
|
|
285
|
+
(?: ; [ ]*
|
|
286
|
+
(?: - | none\b)
|
|
287
|
+
)
|
|
288
|
+
## (ii) w/ dash (-)
|
|
289
|
+
| (?:
|
|
290
|
+
(?<=[ ]) ## positive lookbehind - space required
|
|
291
|
+
- [ ]+ ## space REQUIRED
|
|
292
|
+
(?: ∅ | none\b)
|
|
293
|
+
)
|
|
294
|
+
)}ix
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
CARDS_SEP_ALT_RE = %r{(?<cards_sep_alt>
|
|
298
|
+
(?<=[ ]) ## positive lookbehind - space required
|
|
299
|
+
-
|
|
300
|
+
(?=[ ]|\z) ## positive lookahead - speace required
|
|
301
|
+
)}x
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
|
|
266
306
|
|
|
267
307
|
|
|
268
308
|
end # class Lexer
|
data/lib/sportdb/parser/token.rb
CHANGED
|
@@ -58,6 +58,35 @@ VS_RE = %r{
|
|
|
58
58
|
}ix
|
|
59
59
|
|
|
60
60
|
|
|
61
|
+
##
|
|
62
|
+
## ▪SF or ▪1,▪17, etc.
|
|
63
|
+
## note - only numbers and upcase allowed
|
|
64
|
+
## limited to two-letters for now - make more generic - why? why not?
|
|
65
|
+
## may add SF1, SF2, or such later !!!
|
|
66
|
+
INLINE_ROUND_SHORT_RE = %r{
|
|
67
|
+
(?<inline_round_short>
|
|
68
|
+
▪
|
|
69
|
+
(?<inline_round_text>
|
|
70
|
+
[0-9]+
|
|
71
|
+
| [A-Z]{1,2} [0-9]*
|
|
72
|
+
)
|
|
73
|
+
(?= [ ]|$) # positive lookAHEAD for space (or end-of-line)
|
|
74
|
+
)}x
|
|
75
|
+
|
|
76
|
+
###
|
|
77
|
+
## ▪ Replay
|
|
78
|
+
## ▪ 1st Leg
|
|
79
|
+
INLINE_ROUND_BIG_RE = %r{
|
|
80
|
+
(?<inline_round_big>
|
|
81
|
+
▪ [ ]
|
|
82
|
+
(?<inline_round_text>
|
|
83
|
+
[^\[\(@]+? ## note - non-greedy
|
|
84
|
+
## allow commas (,) or slash(/) - why? why not?
|
|
85
|
+
)
|
|
86
|
+
(?= [ ]{2}|$) # positive lookAHEAD for TWO(!) spaces (or end-of-line)
|
|
87
|
+
)}x
|
|
88
|
+
|
|
89
|
+
|
|
61
90
|
|
|
62
91
|
|
|
63
92
|
##############
|
|
@@ -68,6 +97,10 @@ VS_RE = %r{
|
|
|
68
97
|
|
|
69
98
|
RE = Regexp.union(
|
|
70
99
|
SPACES_RE,
|
|
100
|
+
|
|
101
|
+
INLINE_ROUND_SHORT_RE,
|
|
102
|
+
INLINE_ROUND_BIG_RE,
|
|
103
|
+
|
|
71
104
|
STATUS_RE, ## match status e.g. [cancelled], etc.
|
|
72
105
|
|
|
73
106
|
INLINE_WO_RE, ## (inline) match status - w/o (walkout)
|
data/lib/sportdb/parser.rb
CHANGED
|
@@ -6,8 +6,9 @@ require 'cocos'
|
|
|
6
6
|
require_relative 'parser/version'
|
|
7
7
|
|
|
8
8
|
|
|
9
|
+
require_relative 'parser/debuggable' ## generic debug/logger helper
|
|
10
|
+
|
|
9
11
|
|
|
10
|
-
## core machinery
|
|
11
12
|
|
|
12
13
|
##
|
|
13
14
|
## add shared/most basic regexes here
|
|
@@ -61,11 +62,12 @@ require_relative 'parser/token'
|
|
|
61
62
|
|
|
62
63
|
|
|
63
64
|
require_relative 'parser/lexer_buffer' ## incl. Tokens (aka TokenBuffer)
|
|
65
|
+
require_relative 'parser/lexer_token'
|
|
64
66
|
|
|
65
67
|
require_relative 'parser/lexer-prep_doc'
|
|
66
68
|
require_relative 'parser/lexer-prep_line'
|
|
67
69
|
|
|
68
|
-
require_relative 'parser/
|
|
70
|
+
require_relative 'parser/lexer-logger' ## e.g. _trace, _warn, _info, etc.
|
|
69
71
|
require_relative 'parser/lexer-tokenize'
|
|
70
72
|
require_relative 'parser/lexer-on_round_def'
|
|
71
73
|
require_relative 'parser/lexer-on_group_def'
|
|
@@ -79,62 +81,58 @@ require_relative 'parser/lexer'
|
|
|
79
81
|
|
|
80
82
|
## note - use "embeded" racc parser runtime
|
|
81
83
|
## MUST uncomment require 'racc/parser' in generated parser!!!
|
|
82
|
-
require_relative 'parser/
|
|
84
|
+
require_relative 'parser/parser-runtime'
|
|
83
85
|
|
|
84
86
|
require_relative 'parser/parser' ## auto-generated by racc (from parser.y)
|
|
85
|
-
require_relative 'parser/
|
|
86
|
-
|
|
87
|
+
require_relative 'parser/parser-top'
|
|
88
|
+
|
|
89
|
+
require_relative 'parser/parse_tree--core' ## incl. core extensions eg. as_json on Object/Array/Hash
|
|
90
|
+
require_relative 'parser/parse_tree'
|
|
91
|
+
require_relative 'parser/parse_tree-match'
|
|
92
|
+
require_relative 'parser/parse_tree-props'
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
## deprecated - remove old RaccMatchParser name sooner than later!!
|
|
96
|
+
## use Fbtxt.parse for "public" api
|
|
97
|
+
RaccMatchParser = SportDb::Parser
|
|
87
98
|
|
|
88
99
|
|
|
89
100
|
|
|
90
101
|
###
|
|
91
102
|
# make parser api (easily) available - why? why not?
|
|
103
|
+
#
|
|
104
|
+
# use Fbtxt.parse( txt ) &&
|
|
105
|
+
# Fbtxt.lex( txt) -- or Fbtxt.tokenize?
|
|
106
|
+
#
|
|
107
|
+
# Fbtxt.lex( txt,
|
|
108
|
+
# flatten: true|false, ## keep nested [] for lines (no NEWLINE tokens)
|
|
109
|
+
# transform: true|false ) ## builtin transforms eg. merge DATE & TIME => DATETIME, etc.
|
|
110
|
+
#
|
|
111
|
+
# how to deal with errors?
|
|
112
|
+
## always return [tokens, errors] or such?
|
|
113
|
+
## or return a Result struct - why? why not?
|
|
92
114
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
module Fbtxt
|
|
118
|
+
|
|
119
|
+
def self.lex( txt, flatten: true ) ## returns SportDb::LexerResult (ok?/tokens/errors)
|
|
120
|
+
lexer = SportDb::Lexer.new( txt )
|
|
121
|
+
## move "wrapping" into result obj inside lexer - why? why not?
|
|
122
|
+
tokens, errors = lexer.tokenize_with_errors( flatten: flatten )
|
|
123
|
+
SportDb::LexerResult.new( tokens, errors )
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def self.parse( txt ) ## returns SportDb::ParserResult (ok?/tree/errors)
|
|
127
|
+
parser = SportDb::Parser.new( txt )
|
|
128
|
+
## move "wrapping" into result obj inside parser - why? why not?
|
|
129
|
+
tree, errors = parser.parse_with_errors
|
|
130
|
+
SportDb::ParserResult.new( tree, errors )
|
|
131
|
+
end
|
|
132
|
+
end # module Fbtxt
|
|
102
133
|
|
|
103
134
|
|
|
104
135
|
|
|
105
|
-
module SportDb
|
|
106
|
-
class Parser
|
|
107
|
-
####################
|
|
108
|
-
# "default" lexer & parser (wraps RaccMatchParser)
|
|
109
|
-
|
|
110
|
-
def tokenize_with_errors( lines, debug: false )
|
|
111
|
-
lexer = Lexer.new( lines )
|
|
112
|
-
tokens, errors = lexer.tokenize_with_errors
|
|
113
|
-
[tokens, errors]
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
### convience helper - ignore errors by default
|
|
117
|
-
def tokenize( lines, debug: false )
|
|
118
|
-
tokens, _ = tokenize_with_errors( lines, debug: debug )
|
|
119
|
-
tokens
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
def parse_with_errors( lines, debug: false )
|
|
124
|
-
## todo/check - if lines needs to chack for array of lines and such
|
|
125
|
-
## or handled by tokenizer???
|
|
126
|
-
parser = RaccMatchParser.new( lines )
|
|
127
|
-
tree, errors = parser.parse_with_errors
|
|
128
|
-
[tree, errors]
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
### convience helper - ignore errors by default
|
|
132
|
-
def parse( lines, debug: false )
|
|
133
|
-
tree, _ = parse_with_errors( lines, debug: debug )
|
|
134
|
-
tree
|
|
135
|
-
end
|
|
136
|
-
end # class Parser
|
|
137
|
-
end # module SportDb
|
|
138
136
|
|
|
139
137
|
|
|
140
138
|
|
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.
|
|
4
|
+
version: 0.8.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Gerald Bauer
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-06
|
|
11
|
+
date: 2026-07-06 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: cocos
|
|
@@ -72,6 +72,8 @@ files:
|
|
|
72
72
|
- README.md
|
|
73
73
|
- Rakefile
|
|
74
74
|
- lib/sportdb/parser.rb
|
|
75
|
+
- lib/sportdb/parser/debuggable.rb
|
|
76
|
+
- lib/sportdb/parser/lexer-logger.rb
|
|
75
77
|
- lib/sportdb/parser/lexer-on_goal.rb
|
|
76
78
|
- lib/sportdb/parser/lexer-on_group_def.rb
|
|
77
79
|
- lib/sportdb/parser/lexer-on_prop_lineup.rb
|
|
@@ -85,10 +87,13 @@ files:
|
|
|
85
87
|
- lib/sportdb/parser/lexer.rb
|
|
86
88
|
- lib/sportdb/parser/lexer_buffer.rb
|
|
87
89
|
- lib/sportdb/parser/lexer_token.rb
|
|
90
|
+
- lib/sportdb/parser/parse_tree--core.rb
|
|
91
|
+
- lib/sportdb/parser/parse_tree-match.rb
|
|
92
|
+
- lib/sportdb/parser/parse_tree-props.rb
|
|
93
|
+
- lib/sportdb/parser/parse_tree.rb
|
|
94
|
+
- lib/sportdb/parser/parser-runtime.rb
|
|
95
|
+
- lib/sportdb/parser/parser-top.rb
|
|
88
96
|
- lib/sportdb/parser/parser.rb
|
|
89
|
-
- lib/sportdb/parser/parser_runtime.rb
|
|
90
|
-
- lib/sportdb/parser/racc_parser.rb
|
|
91
|
-
- lib/sportdb/parser/racc_tree.rb
|
|
92
97
|
- lib/sportdb/parser/token-date--helpers.rb
|
|
93
98
|
- lib/sportdb/parser/token-date--names.rb
|
|
94
99
|
- lib/sportdb/parser/token-date.rb
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
####
|
|
3
|
-
# RaccMatchParser support machinery (incl. node classes/abstract syntax tree)
|
|
4
|
-
|
|
5
|
-
class RaccMatchParser
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def initialize( txt, debug: false )
|
|
10
|
-
@tree = []
|
|
11
|
-
@errors = []
|
|
12
|
-
|
|
13
|
-
lexer = SportDb::Lexer.new( txt, debug: debug )
|
|
14
|
-
## note - use tokenize_with_errors and add/collect tokenize errors
|
|
15
|
-
@tokens, @errors = lexer.tokenize_with_errors
|
|
16
|
-
## pp @tokens
|
|
17
|
-
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def debug( value ) @debug = value; end ### fix: use setter-style e.g. debug=(value) !!!
|
|
22
|
-
def debug?() @debug == true; end
|
|
23
|
-
|
|
24
|
-
###
|
|
25
|
-
### fix-fix-fix rename to _trace
|
|
26
|
-
## check lexer - add [debug] Parser - or such!!!
|
|
27
|
-
##
|
|
28
|
-
## debug - trace / print message
|
|
29
|
-
def trace( msg )
|
|
30
|
-
puts " fix-fix-fix use _trace() in parser!!"
|
|
31
|
-
puts " [parse] " + msg
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def _trace( *args )
|
|
35
|
-
## if debug?
|
|
36
|
-
print "[DEBUG] Parser -- "
|
|
37
|
-
args.each { |arg| puts args }
|
|
38
|
-
## end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def next_token
|
|
43
|
-
tok = @tokens.shift
|
|
44
|
-
_trace( "next_token => #{tok.pretty_inspect}" )
|
|
45
|
-
|
|
46
|
-
## convert to racc format single char literal tokens e.g. '@' etc.
|
|
47
|
-
## note - literal token MUST be string (NOT symbol)
|
|
48
|
-
## note - racc expects array with to items
|
|
49
|
-
## - item[0] is the token id
|
|
50
|
-
## - item[1] is the token value
|
|
51
|
-
|
|
52
|
-
## note - returns nil for end-of-file !!!
|
|
53
|
-
tok = [tok.type, tok] if tok
|
|
54
|
-
|
|
55
|
-
tok
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
# on_error do |error_token_id, error_value, value_stack|
|
|
60
|
-
# puts "Parse error on token: #{error_token_id}, value: #{error_value}"
|
|
61
|
-
# end
|
|
62
|
-
|
|
63
|
-
def parse_with_errors
|
|
64
|
-
_trace( "start parse:" )
|
|
65
|
-
do_parse
|
|
66
|
-
[@tree, @errors]
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def parse ## convenience shortcut (ignores errors)
|
|
70
|
-
tree, _ = parse_with_errors
|
|
71
|
-
tree
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
attr_reader :errors
|
|
76
|
-
def errors?() @errors.size > 0; end
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
def on_error(error_token_id, error_value, value_stack)
|
|
80
|
-
## auto-add error_token (as string)
|
|
81
|
-
error_token = Racc_token_to_s_table[error_token_id]
|
|
82
|
-
args = [error_token, error_token_id, error_value, value_stack]
|
|
83
|
-
|
|
84
|
-
puts
|
|
85
|
-
puts "!! on parse error:"
|
|
86
|
-
puts "args=#{args.pretty_inspect}"
|
|
87
|
-
|
|
88
|
-
@errors << "parse error on token: #{error_token} >#{error_value.pretty_inspect}<, stack: #{value_stack.pretty_inspect}"
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
end # class RaccMatchParser
|