PML Syntax EBNF
The following table specifies PML's syntax, expressed in Extended Backus–Naur form (EBNF).
Nodes
| Name | Rule | Examples | |
|---|---|---|---|
| node | = | empty_node | non_empty_node |
|
| empty_node | = | "[" name "]" | [nl] |
| non_empty_node | = | "[" name separator attributes ? child_node * "]" Note: The separator is optional if the name is immediately followed by [ or (. |
[i huge] [image(source=strawberries.jpg)] [image ( source = strawberries.jpg ) ] [div A [i[b nice]] dog] |
| separator | = | whitespace_char | |
| child_node | = | node | node_text | comment |
[i huge] All is well! [- comment -] |
| node_text | = | node_text_char + | Bob 3.14 We want simplicity. root\\config\["port"\] |
| node_text_char | = | any Unicode character, except "[", "]", and "\" | escaped_char | "\(" |
a é \[ \( |
Attributes
| Name | Rule | Examples | |
|---|---|---|---|
| attributes | = | "(" commented_attribute * ")" | (height=200) ( title = "A planet" [- size in mm -] width = 400 height = 248 ) () |
| commented_attribute | = | ( whitespace | comment ) * attribute ( whitespace | comment ) * | [- degrees celsius -] temperature = 30 |
| attribute | = | name whitespace ? "=" whitespace ? attribute_value | color=orange title = "More Benefits" |
| attribute_value | = | quoted_value | unquoted_value |
"yes" yes |
| quoted_value | = | '"' quoted_value_char * '"' | "yellow" "light yellow" "/root/foo/bar" "C:\\config.txt" "list[3]" "list\[3\]" "He said\n\"That's ok\"" "Tim Tom Tam" "" |
| quoted_value_char | = | any Unicode character, except " | '\"' | escaped_char |
a é \" \n |
| unquoted_value | = | unquoted_value_char + | yellow /root/foo/bar C:\config.txt |
| unquoted_value_char | = | Any Unicode character, except whitespace_char, [, ], (, ), ", ' Remak: Escape characters are not allowed. |
a / \ |
Common Elements
| Name | Rule | Examples | |
|---|---|---|---|
| name | = | name_start_char name_char * Regex: [a-zA-Z_][a-zA-Z0-9_\.-]* |
height border-color _default |
| name_start_char | = | "a" .. "z" | "A" .. "Z" | "_" |
a Z _ |
| name_char | = | "a" .. "z" | "A" .. "Z" | "0" .. "9" | "_" | "-" | "." |
a Z 9 _ - . |
| comment | = | "[-" ( node_text | comment ) * "-]" | [- TODO: improve text -] [- comment [- nested comment -] -] |
| whitespace | = | whitespace_char + | |
| whitespace_char | = | " " | \t | \n | \r\n |
|
| escaped_char | = | "\\" | "\[" | "\]" | "\t" | "\r" | "\n" | Unicode_escape_sequence |
\\ (\) \[ ([) \] (]) \t (tab) \r (carriage return) \n (line feed) \u002A (*) |
| Unicode_escape_sequence | = | "\u" hex_char hex_char hex_char hex_char | \u002A (*) |
| hex_char | = | "0" .. "9" | "a" .. "f" | "A" .. "F" |
1 a F |