From 39554c85a7d31c28470d232f871fa3f7911207ad Mon Sep 17 00:00:00 2001 From: Jordan Orelli Date: Sun, 24 May 2015 15:05:15 -0400 Subject: [PATCH] documentation --- README.md | 68 +++++++++++++++++++++++++++++++++++- grammar.ebnf | 4 +-- grammar/diagram/Comment.png | Bin 2566 -> 2609 bytes grammar/diagram/Integer.png | Bin 4462 -> 6488 bytes 4 files changed, 69 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cdcd019..deb3801 100644 --- a/README.md +++ b/README.md @@ -16,13 +16,79 @@ compatibility at this time. # Design A Moon file is a human-readable description of an unordered collection of -key-value pairs. Parsing a Moon document always yields either a Moon Document +key-value pairs. Parsing a Moon file always yields either a Moon Document or an error. The top level of a Moon document contains a series of key-value pairs separated with a colon: ![Assignment Diagram](grammar/diagram/Assign.png) +E.g.: + +``` +name: Jordan +age: 29 +``` + +# Terminal characters + +![Terminal Characters Diagram](grammar/diagram/Terminal.png) + +The following characters are defined as being terminal characters: `[`, `]`, +`{`, `}`, `:`, `;`, `#` and `\n`. Unless escaped or quoted, terminal characters +terminate any value that precedes them. + +# Printable characters + +![Printable Characters Diagram](grammar/diagram/PrintChar.png) + +A printable character is defined as being any Unicode character in the +categories L (letters), N (numbers), M (marks), S (symbols), and P +(punctuation), with the exception of previously mentioned terminal characters. + +# Graphic characters + +![Graphic Characters Diagram](grammar/diagram/GraphicChar.png) + +A Graphic character is defined as being a Printable character or whitespace +character. This includes all of the characters in the unicode category Z, with +the exception of the newline character, which is considered a terminal +character. + +# Identifiers + +![Identifier Diagram](grammar/diagram/Identifier.png) + +Any run of printable characters may describe an identifier. That is, any +sequence of letters and numbers may describe an identifier. Identifiers may not contain spaces. Identifiers may +contain characters outside of the ASCII range without needing any special +escaping. This includes accented letters, marks, and emoji. The following are +valid identifiers: + +``` +hello +halló +您好 +🐼🔫🎁 +``` + +# Values + +![Value Diagram](grammar/diagram/Value.png) + +A Value may represent a variety of types. Moon defines the following value +types: strings, numbers, durations, variables, objects, and lists. + +# Strings + +Strings come in two flavors: bare strings and quoted strings. + +A bare string is defined as being any run of graphic characters. + +![Bare String Diagram](grammar/diagram/Bare_String.png) + +Since the newline character is excluded from the graphic characters, a bare string is terminated at the first unescaped newline. + # Types Moon defines the following types: diff --git a/grammar.ebnf b/grammar.ebnf index 099f4b2..028f5e4 100644 --- a/grammar.ebnf +++ b/grammar.ebnf @@ -5,9 +5,9 @@ Variable ::= "@" Identifier Bare_String ::= (GraphicChar | ("\" Char)) + Quoted_String ::= '"' ([^"\] | "\" Char) * '"' | "'" ([^'\] | "\" Char) * "'" -Comment ::= '#' PrintChar + +Comment ::= '#' GraphicChar + -Integer ::= [+-] ? Digit + +Integer ::= [+-] ? ([1-9] Digit + | [0]) Hex ::= [+-] ? "0" [xX] (Digit | [a-fA-F]) + Octal ::= [+-] ? "0" [0-7] + Float ::= [+-]? Digit+ ("." Digit +)? ([eE] [+-] ? Digit +)? diff --git a/grammar/diagram/Comment.png b/grammar/diagram/Comment.png index b7b057b843671256a5ff6c3bc4161c31237f1b2a..40e40e167affb9bca5dd125c098660e1dc98e422 100755 GIT binary patch delta 2607 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 delta 2563 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 Z@PA)AKr+BdJ0}1D002ovPDHLkV1f_H)t>+W diff --git a/grammar/diagram/Integer.png b/grammar/diagram/Integer.png index 0db9b7081ffe97882bdcb1039a68189aa50abafe..3b9791be47f0003dbb0b5288fa7cac7c5050d540 100755 GIT binary patch literal 6488 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 Bw>qhEot5T5OBLx5e6lyP&^>A?)H{6Md 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