program = _{SOI ~ statement* ~ EOI}
TextMode = _{SOI ~ (TextElement|TextRest)* ~ EOI}
statement = _{
SPACE_SEPARATOR* ~ Header
| SPACE_SEPARATOR* ~ HorizontalRule
| SPACE_SEPARATOR* ~ Code
| SPACE_SEPARATOR* ~ Table
| SPACE_SEPARATOR* ~ List
| SPACE_SEPARATOR* ~ Command
| EmptyLine{1,}
| TextBlock
}
EmptyLine = _{SPACE_SEPARATOR* ~ NEWLINE}
/*====================================================================================================================*/
//!#E06C75: Header
Header = ${Sharp{1, 6} ~ RestOfLine}
/*====================================================================================================================*/
TextBlock = {TextHeaderCharacter ~ TextBlockLine*}
TextHeaderCharacter = _{!NEWLINE ~ ANY}
TextBlockLine = _{!(EmptyLine{2,}|Sharp) ~ ANY}
TextElement = _{StyleStatement|LineStatement|MathStatement|RawStatement|NEWLINE|Escaped|Command}
TextRest = {(!(NEWLINE|Escape|Tilde|Asterisk|Dollar|Accent) ~ ANY)+}
/*====================================================================================================================*/
//!#61AFEF: Code
//!#E06C75: CodeText
Code = {CodeLevel ~ CodeAction? ~SYMBOL? ~ arguments? ~SPACE_SEPARATOR*~ CodeText ~ POP ~ CodeMark{3}}
CodeAction = {At|Asterisk|Sharp}
CodeLevel = {CodeMark{3}~PUSH(CodeMark*)}
CodeText = {(!(CodeMark ~ PEEK) ~ ANY)*}
CodeMark = @{Accent}
/*====================================================================================================================*/
//!Orange: TableMark
Table = {TableMark ~ (!TableEnd~ANY)* ~ TableEnd}
TableEnd = {EmptyLine{2}|EmptyLine~EOI|EOI}
TableMode = _{SOI ~ TableLine* ~ EOI}
TableLine = _{TableEscape |TableMark |TextElement| TableRest}
TableEscape = @{Escape ~ TableMark}
TableText = {(TextElement)+}
TableRest = {(!(TableMark|Escape) ~ ANY)+}
TableMark = @{Vertical}
/*====================================================================================================================*/
//!Green: ListMark
List = {ListMark ~ (!ListEnd~ANY)* ~ ListEnd}
ListEnd = {EmptyLine{2}|EmptyLine~EOI|EOI}
program_list = _{SOI ~ ListStatement+ ~ EOI}
ListStatement = {NEWLINE~ListHeadLevel~ListMark~ ListRest}
ListHeadLevel = {SPACE_SEPARATOR*}
ListRest = {(!ListStatement~ANY)*}
ListMark = @{Plus|Minus|Vertical|QuoteMark|Integer~Dot}
/*====================================================================================================================*/
///Red
HorizontalRule = @{Set{3,}|Minus{3,}}
/*====================================================================================================================*/
MathStatement = _{Math|MathRest}
///#E06C75
Math = {MathLevel ~ MathText ~ POP ~ Dollar}
MathLevel = {Dollar~PUSH (Dollar*)}
MathText = {(Escape~Dollar|!(Dollar ~ PEEK) ~ ANY)*}
///Gray
MathRest = {Dollar+}
/*====================================================================================================================*/
RawStatement = _{Raw|RawRest}
///#98C379
Raw = {RawLevel ~ RawText ~ POP ~ Accent}
RawLevel = {Accent~PUSH (Accent*)}
RawText = {(Escape~Accent|!(Accent ~ PEEK) ~ ANY)*}
///Gray
RawRest = {Accent+}
/*====================================================================================================================*/
StyleStatement = _{Style|StyleRest}
///#D19A66
Style = {StyleLevel ~ StyleText ~ POP ~ Asterisk}
StyleLevel = {Asterisk~PUSH (Asterisk*)}
StyleText = {(Escape~Asterisk|!(Asterisk ~ PEEK) ~ ANY)*}
///Gray
StyleRest = {Asterisk+}
/*====================================================================================================================*/
LineStatement = _{Line|LineRest}
///#61AFEF
Line = {LineLevel ~ LineText ~ POP ~ Tilde}
LineLevel = {Tilde~PUSH (Tilde*)}
LineText = {(Escape~Tilde|!(Tilde ~ PEEK) ~ ANY)*}
///Gray
LineRest = {Tilde+}
/*====================================================================================================================*/
Command = _{CommandLine| CommandBlock}
//!#56B6C2: Set
//!#E06C75: key
CommandBlock = !{command ~ arguments*}
arguments = _{
"{" ~SPACE_SEPARATOR*~ (key_value|argument)* ~SPACE_SEPARATOR*~ "}"
| "[" ~ argument_literal ~ "]"
}
argument_literal = {(Escape ~ (Escape|"]")|!"]" ~ ANY)*}
argument = {value ~SPACE_SEPARATOR*~ Comma? ~ SPACE_SEPARATOR*}
key_value = {key ~SPACE_SEPARATOR*~ Set ~SPACE_SEPARATOR*~ value ~SPACE_SEPARATOR*~ Comma? ~ SPACE_SEPARATOR*}
key = {Integer|String|SYMBOL}
value = {Integer|String|expression|Keywords|SYMBOL}
expression = {SYMBOL~(Dot~ function)+}
function = {
SYMBOL ~ ("("~SPACE_SEPARATOR*~ (key_value|argument)* ~SPACE_SEPARATOR*~ ")")?
}
//!#61AFEF: CommandBlock
CommandLine = {command ~ Colon ~ RestOfLine}
command = @{Escape ~ SYMBOL}
RestOfLine = !{(!NEWLINE ~ ANY)*}
/*====================================================================================================================*/
//!#D19A66: Integer|Decimal|DecimalBad|Exponent|ComplexHandler
Number = ${Decimal|DecimalBad|Integer}
Decimal = ${Integer ~ Dot ~ ASCII_DIGIT+}
DecimalBad = ${Integer ~ Dot | Dot ~ ASCII_DIGIT+}
Integer = @{Zero|ASCII_DIGIT ~ (Underline? ~ ASCII_NONZERO_DIGIT)* }
Zero = @{"0"}
/*====================================================================================================================*/
///#98C379
String = ${
S1 ~ (Escape ~ (Escape|S1)|!S1 ~ ANY)* ~ S1
| S2 ~ (Escape ~ (Escape|S2)|!S2 ~ ANY)* ~ S2
}
S1 = _{"'"}
S2 = _{"\""}
/*====================================================================================================================*/
SYMBOL = @{
XID_START ~ XID_CONTINUE*
| Underline~XID_CONTINUE+
}
Escaped = @{Escape~(Escape|Tilde|Asterisk|Dollar|Accent)}
Keywords = @{"true"|"false"|"null"}
// = _{!SPACE_SEPARATOR ~ ANY}
/*====================================================================================================================*/
//!Gray:BlockComment|LineComment
COMMENT = ${BlockComment|LineComment }
LineComment = ${Comment ~ SPACE_SEPARATOR* ~ Colon ~ RestOfLine}
BlockComment = ${Comment ~ SPACE_SEPARATOR* ~ "{" ~ MultiLineComment ~ "}"}
MultiLineComment = ${(BlockComment | !"}" ~ ANY)*}
Comment = @{Escape ~ "comment"}
/*====================================================================================================================*/
NEWLINE = @{CR ~ LF|CR|LF}
SPACE_SEPARATOR = {" "|"\t"}
TAB = @{"\t"}
CR = @{"\r"}
LF = @{"\n"}
/*====================================================================================================================*/
Escape = @{"\\"}
At = @{"@"}
Sharp = @{"#"}
Underline = @{"_"}
Asterisk = @{"*"}
Comma = @{","}
Dot = @{"."}
Set = @{"="}
Colon = @{":"}
Vertical = @{"|"}
Plus = @{"+"}
Minus = @{"-"}
QuoteMark = @{">"}
Accent = @{"`"}
Dollar = @{"$"}
Tilde = @{"~"}