///Space or tab
WHITESPACE = _{ " " | "\t" }
/// Score or mark in format: 4:1, 45', 90+3', live, or -
score_or_mark = {
ASCII_DIGIT{1,2} ~ ":" ~ ASCII_DIGIT{1,2}
| ASCII_DIGIT{1,3} ~ ("+" ~ ASCII_DIGIT{1,2})? ~ "'"
| ^"live"
| "-"
}
///Date in format YYYY-MM-DD(For example: 2025-11-05)
date = @{
ASCII_DIGIT{4} ~ "-" ~
( "0" ~ ('1'..'9') | "1" ~ ('0'..'2') ) ~ "-" ~
( "0" ~ ('1'..'9') | ('1'..'2') ~ ASCII_DIGIT | "3" ~ ('0'..'1') )
}
///Time in format HH:MM, hours can be from 00 to 23, minnutes can be from 00 to 59(For example: 17:45)
time = @{
( "0" ~ ASCII_DIGIT
| "1" ~ ASCII_DIGIT
| "2" ~ ('0'..'3') )
~ ":"
~ ( "0" ~ ASCII_DIGIT
| ('1'..'5') ~ ASCII_DIGIT )
}
///One space
SP = @{ " " }
///Letters, numbers or simple symbols in names(for teams' names and stadiums' names
name_char = { ('a'..'z' | 'A'..'Z' | '0'..'9') | "'" | "." | "(" | ")" | "&" }
///One word in team name(For example: PSG), can have a hyphen(For example: Dnipro-1, Saint-Germain)
team_word = @{ name_char+ ~ ( "-" ~ name_char+ )* }
///Full team name, which can consists of few words(For example: Real Madrid, St. Pauli)
team_name = @{team_word ~ (SP ~ team_word )* ~ &( SP | ( "-" ~ WHITESPACE ) | ";" | !ANY )}
///Two teams, that have a match, in format: team1 - team2
teams = {team_name ~ WHITESPACE* ~ "-" ~ WHITESPACE* ~ team_name}
///Stadium name, which can consists of few words(For example: St. Mary's Stadium, Dnipro Arena)
stadium_name = { name_char+ ~ (SP ~ name_char+)* ~ &( ";" | !ANY ) }
///Status, that can be written in any case, in format: played, scheduled, or ongoing
status = {^"played" | ^"scheduled" | ^"ongoing"}
///Full match line in format: date; time; teams; score; stadium(optional); status(optional)
match_line = {date ~ ";" ~ time ~ ";" ~ teams ~ ";" ~ score_or_mark
~ (";" ~ stadium_name ~ (";" ~ status)? | ";" ~ status)?
~ !";"
}