diff options
| -rw-r--r-- | syntax/def.peg | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/syntax/def.peg b/syntax/def.peg new file mode 100644 index 0000000..e40610f --- /dev/null +++ b/syntax/def.peg @@ -0,0 +1,56 @@ +# Subsets of Markdown syntax structure +# expressed in parsing expression grammar (PEG) notation. +# +# Copyright 2025, Jonas Smedegaard <dr@jones.dk> +# SPDX-License-Identifier: GPL-3+ + +# Document +Markdown <- ('---' NEWLINE MetaBlock* '---' NEWLINE)? Block* + +# Block elements +Block <- Header + / List + / LinkDefinition + / Paragraph +Header <- '#'+ SPACE* !NEWLINE Words? SPACE* NEWLINE +List <- ([-*]+ / [[:digit:]]+ [).]) (_ (List / Words))? NEWLINE +LinkDefinition <- LinkLabel ':' _? Uri (_ LinkTitle)? NEWLINE +Paragraph <- Words (HardBreak Words)* NEWLINE+ + +# Inline elements +Words <- StyledWords + / LinkedWords + / AnnotatedWords + / PlainWords +StyledWords <- '**' Words '**' + / '*' Words '*' + / '_' Words '_' +LinkedWords <- '[' Words ']' '(' ((Uri _)? LinkTitle / Uri) ')' + / '[' Words ']' LinkLabel + / LinkLabel +AnnotatedWords <- '[' Words ']' '{' ![{}] PlainWords '}' +LinkLabel <- '[' _? ![\[\]] PlainWords _? ']' +LinkTitle <- '"' _? !'"' _? PlainWords _? '"' + / "'" _? !"'" PlainWords _? "'" + / "(" _? ![()] PlainWords _? ")" +PlainWords <- PRINTABLES (_ PRINTABLES)* +Uri <- '<' ![<>] PRINTABLES? '>' + / ![<>] PRINTABLES +HardBreak <- SPACE SPACE+ NEWLINE +_ <- SPACE+ + / SPACE? NEWLINE SPACE? SPACE? SPACE? + +# Terminals +PRINTABLES <- [[:graph:]]+ +SPACE <- ' ' +NEWLINE <- '\r\n' + / '\n' + / '\r' + +# Semantic Markdown +AnnotatedWordsX <- '[' Words ']' + ('{' (SemWords / ![{}] PlainWords) '}') +SemWords <- SEMPREFIX '<' ![<>] PRINTABLES '>' + / SEMPREFIX Curie +Curie <- NAME? ':' NAME? +SEMPREFIX <- [.#] |
