The LRCX format is a structured lyric format defined by a grammar that supports ID tags, lyric lines with timestamps, and lyric attachments.
Key components include:
<id tag>: Metadata tags in the format [key] or [key:value].<lyric line>: A timestamp followed by text: [mm:ss.SSS] lyric text.<lyric attachment>: Timestamps paired with attachment tags and bodies (plain text, index-based, or range-based).
Full EBNF grammar:
<lrcx> ::= <line> (NEWLINE <line>)*
<line> ::= <id tag>
| <lyric line>
| <lyric attachment>
| ""
<id tag> ::= <tag>
<tag> ::= "[" <tag content> "]"
<tag content> ::= <tag key>
| <tag key> ":" <tag value>
<tag key> ::= [0-9a-zA-Z_-]+
<tag value> ::= <character except NEWLINE or "]"+>
<lyric line> ::= <time tag> <character except NEWLINE>*
<lyric attachment> ::= <time tag> <attachment tag> <attachment body>
<time tag> ::= "[" (<minute> ":")* <second> ("." <millisecond>)* "]"
<attachment tag> ::= <tag>
<attachment body> ::= <plain text attachment>
| <index based attachment>
| <range based attachment>
<plain text attachment> ::= <character except NEWLINE>+
<index based attachment> ::= <index based segment>+
<range based attachment> ::= <range based segment>+
<index based segment> ::= "<" <segment value> "," <segment index> ">
<range based segment> ::= "<" <segment value> "," <segment range> ">
<segment value> ::= <characters except NEWLINE, "," or ">">
<segment index> ::= <number>
<segment range> ::= <lowerBound> "," <upperBound>
<lrcx> ::= <line> (NEWLINE <line>)*
<line> ::= <id tag>
| <lyric line>
| <lyric attachment>
| ""
<id tag> ::= <tag>
<tag> ::= "[" <tag content> "]"
<tag content> ::= <tag key>
| <tag key> ":" <tag value>
<tag key> ::= [0-9a-zA-Z_-]+
<tag value> ::= <character except NEWLINE or "]"+>
<lyric line> ::= <time tag> <character except NEWLINE>*
<lyric attachment> ::= <time tag> <attachment tag> <attachment body>
<time tag> ::= "[" (<minute> ":")* <second> ("." <millisecond>)* "]"
<attachment tag> ::= <tag>
<attachment body> ::= <plain text attachment>
| <index based attachment>
| <range based attachment>
<plain text attachment> ::= <character except NEWLINE>+
<index based attachment> ::= <index based segment>+
<range based attachment> ::= <range based segment>+
<index based segment> ::= "<" <segment value> "," <segment index> ">
<range based segment> ::= "<" <segment value> "," <segment range> ">
<segment value> ::= <characters except NEWLINE, "," or ">">
<segment index> ::= <number>
<segment range> ::= <lowerBound> "," <upperBound>