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.
@@ -126,7 +126,7 @@ GEO_RE = Regexp.union(
126
126
  SPACES_RE,
127
127
  GEO_END_RE,
128
128
  GEO_TEXT_RE,
129
- / (?<sym> [,›>\[] ) /x,
129
+ / (?<sym> [,›>\[] ) /x,
130
130
  ANY_RE,
131
131
  )
132
132
 
@@ -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
@@ -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)
@@ -3,8 +3,8 @@ module SportDb
3
3
  module Module
4
4
  module Parser
5
5
  MAJOR = 0 ## todo: namespace inside version or something - why? why not??
6
- MINOR = 7
7
- PATCH = 2
6
+ MINOR = 8
7
+ PATCH = 0
8
8
  VERSION = [MAJOR,MINOR,PATCH].join('.')
9
9
 
10
10
  def self.version
@@ -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/lexer_token'
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/parser_runtime'
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/racc_parser'
86
- require_relative 'parser/racc_tree'
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
- =begin
94
- module SportDb
95
- def self.parser() @@parser ||= Parser.new; end
96
- def self.parse( ... )
97
- end
98
- def self.tokenize( ... )
99
- end
100
- end # module SportDb
101
- =end
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.7.2
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-08 00:00:00.000000000 Z
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