aboutsummaryrefslogtreecommitdiff
path: root/def.peg
diff options
context:
space:
mode:
Diffstat (limited to 'def.peg')
-rw-r--r--def.peg34
1 files changed, 34 insertions, 0 deletions
diff --git a/def.peg b/def.peg
new file mode 100644
index 0000000..163b5a4
--- /dev/null
+++ b/def.peg
@@ -0,0 +1,34 @@
+# 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 <- MetaBlock* Block*
+
+# Block elements
+Block <- Header / List / LinkDefinition / Paragraph
+Header <- '#'+ SPACE* Words? SPACE* NEWLINE
+List <- ([-*]+ / [[:digit:]]+ [).]) (SPACE+ (List / Words))?
+ NEWLINE
+LinkDefinition <- '[' !'[]' PlainWords ']:' SPACE Uri NEWLINE
+ SPACE SPACE '"' !'"' PlainWords '"' NEWLINE
+Paragraph <- Words (SPACE? NEWLINE Words / HardBreak Words)*
+ NEWLINE NEWLINE
+
+# Inline elements
+Words <- StyledWords / LinkedWords / AnnotatedWords / PlainWords
+StyledWords <- '*' Words '*' / '**' Words '**' / '_' Words '_'
+LinkedWords <- '[' Words ']' '(' Uri ')'
+ / '[' Words ']' '[' ![\[\]] LinkDefinitionKeyphrase ']'
+ / '[' LinkDefinitionKeyphrase ']'
+AnnotatedWords <- '[' Words ']' '{' ![{}] PlainWords '}'
+PlainWords <- PRINTABLES (SPACE PRINTABLES)*
+Uri <- '<' ![<>] PRINTABLES? '>' / ![<>] PRINTABLES
+HardBreak <- SPACE SPACE NEWLINE
+
+# Terminals
+PRINTABLES <- [[:graph:]]+
+SPACE <- ' '
+NEWLINE <- '\r\n' / '\n' / '\r'