mirror of
https://github.com/Ed94/metadesk.git
synced 2026-08-04 06:38:45 +00:00
[examples] sets, separators, & tags example (first pass)
This commit is contained in:
@@ -1,18 +1,16 @@
|
|||||||
/* the hello world file */
|
////////////////////////////////
|
||||||
|
// The Hello World file
|
||||||
|
|
||||||
hello world!
|
hello world!
|
||||||
"hello world!"
|
"hello world!"
|
||||||
|
|
||||||
// sets
|
|
||||||
(hello world!)
|
(hello world!)
|
||||||
[hello world!]
|
[hello world!]
|
||||||
{hello world!}
|
{hello world!}
|
||||||
|
|
||||||
// sets with labels
|
|
||||||
hello: world!
|
hello: world!
|
||||||
hello: (world!)
|
hello: (world!)
|
||||||
|
|
||||||
// tags
|
|
||||||
@exclaim "hello world"
|
@exclaim "hello world"
|
||||||
@message
|
@message
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,204 @@
|
|||||||
|
////////////////////////////////
|
||||||
|
// Unlabeled Sets
|
||||||
|
|
||||||
|
//(MD_NodeFlag_HasParenLeft|MD_NodeFlag_HasParenRight)
|
||||||
|
(foo bar)
|
||||||
|
(
|
||||||
|
foo
|
||||||
|
bar
|
||||||
|
)
|
||||||
|
()
|
||||||
|
|
||||||
|
//(MD_NodeFlag_HasBracketLeft|MD_NodeFlag_HasBracketRight)
|
||||||
|
[foo bar]
|
||||||
|
|
||||||
|
//(MD_NodeFlag_HasBracketLeft|MD_NodeFlag_HasParenRight)
|
||||||
|
[foo bar)
|
||||||
|
|
||||||
|
//(MD_NodeFlag_HasParenLeft|MD_NodeFlag_HasBracketRight)
|
||||||
|
(foo bar]
|
||||||
|
|
||||||
|
//(MD_NodeFlag_HasBraceLeft|MD_NodeFlag_HasBraceRight)
|
||||||
|
{foo bar}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Mixing { with ) or ] generates an error.
|
||||||
|
** Same with ( or [ with }.
|
||||||
|
** This is itended to make {} a useful way to delimit a set when extra help
|
||||||
|
** via errors from the parser is preferable to flexibility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
// Labeled Sets
|
||||||
|
|
||||||
|
foo: (bar baz) 123: (foo bar)
|
||||||
|
"foo": (bar baz) +++: (foo bar)
|
||||||
|
foo: ()
|
||||||
|
|
||||||
|
"""
|
||||||
|
foo
|
||||||
|
""": (bar baz)
|
||||||
|
|
||||||
|
foo: [bar]
|
||||||
|
foo: [foo)
|
||||||
|
foo: (bar]
|
||||||
|
foo: {bar}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** When a set has a label, it's node will have the label as it's string
|
||||||
|
** contents, and the children as it's set contnts. The node will have flags
|
||||||
|
** for both it's label and it's set properties. For instance the root node
|
||||||
|
** parsed from
|
||||||
|
** +++: (foo bar)
|
||||||
|
** has the flags:
|
||||||
|
** MD_NodeFlag_HasParenLeft|MD_NodeFlag_HasParenRight|MD_NodeFlag_Symbol
|
||||||
|
*/
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
// Nested Sets
|
||||||
|
|
||||||
|
{
|
||||||
|
(foo bar)
|
||||||
|
foo: (bar)
|
||||||
|
[a b c]
|
||||||
|
[({})]
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
// Undelimited Sets (<no left/right flags>)
|
||||||
|
|
||||||
|
// delimited by newline
|
||||||
|
foo: bar baz
|
||||||
|
|
||||||
|
// starts on the next line, delimited by new line
|
||||||
|
foo:
|
||||||
|
bar baz
|
||||||
|
|
||||||
|
// starts on the next line, consumes entire multi-line string
|
||||||
|
foo:
|
||||||
|
"""
|
||||||
|
bar
|
||||||
|
"""
|
||||||
|
|
||||||
|
// kind of weird, but you can chain things on so long as a newline
|
||||||
|
// never appears outside of a multi-line string to end the set
|
||||||
|
foo: """
|
||||||
|
bar
|
||||||
|
""" baz """
|
||||||
|
and-back-to-foo-again
|
||||||
|
"""
|
||||||
|
|
||||||
|
// nesting undelimited sets
|
||||||
|
foo: bar:
|
||||||
|
baz: foo_again
|
||||||
|
|
||||||
|
// undelimited sets may not contain unlabeled delimited sets
|
||||||
|
// the following forms one undelimited set followed by a delimited set
|
||||||
|
// the delimited set is a sibling to foo, not a child to foo.
|
||||||
|
foo: bar (baz)
|
||||||
|
|
||||||
|
// undelimited sets *may* however contain labeled delimited sets
|
||||||
|
// now foo is an undelimited set that contains bar, and bar is a
|
||||||
|
// delimited set that contains baz
|
||||||
|
foo: bar: (baz)
|
||||||
|
|
||||||
|
// again things can get weird. Here bar and baz are both delimited
|
||||||
|
// sets contained in foo, because at there are no newlines at the
|
||||||
|
// level of the foo node until after the baz set.
|
||||||
|
foo:
|
||||||
|
bar: (
|
||||||
|
a
|
||||||
|
b
|
||||||
|
c
|
||||||
|
) baz: (
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
)
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
// Seperators
|
||||||
|
|
||||||
|
// A separator can be placed after any member of delimited sets.
|
||||||
|
// The separator does not effect the shape of the tree but it does
|
||||||
|
// attach flags to the nodes before and after it.
|
||||||
|
|
||||||
|
(
|
||||||
|
word1
|
||||||
|
//(MD_NodeFlag_IsBeforeComma)
|
||||||
|
word2,
|
||||||
|
//(MD_NodeFlag_IsBeforeComma|MD_NodeFlag_IsAfterComma)
|
||||||
|
word3,
|
||||||
|
//(MD_NodeFlag_IsAfterComma)
|
||||||
|
word4
|
||||||
|
)
|
||||||
|
|
||||||
|
(
|
||||||
|
word1
|
||||||
|
//(MD_NodeFlag_IsBeforeSemicolon)
|
||||||
|
word2;
|
||||||
|
//(MD_NodeFlag_IsBeforeSemicolon|MD_NodeFlag_IsAfterSemicolon)
|
||||||
|
word3;
|
||||||
|
//(MD_NodeFlag_IsAfterSemicolon)
|
||||||
|
word4
|
||||||
|
)
|
||||||
|
|
||||||
|
(
|
||||||
|
word1
|
||||||
|
//(MD_NodeFlag_IsBeforeComma)
|
||||||
|
word2,
|
||||||
|
//(MD_NodeFlag_IsBeforeSemicolon|MD_NodeFlag_IsAfterComma)
|
||||||
|
word3;
|
||||||
|
//(MD_NodeFlag_IsAfterSemicolon|MD_NodeFlag_IsBeforeComma)
|
||||||
|
word4,
|
||||||
|
)
|
||||||
|
|
||||||
|
// A separator ends an undelimited set early. Here the commas and semi-colon
|
||||||
|
// split this line into three undelimited sets. The "before" flag goes on the
|
||||||
|
// undelimited set, not the child. For instance, here the set foo gets the flag
|
||||||
|
// (MD_NodeFlag_IsBeforeComma)
|
||||||
|
foo: bar, baz: foo_again; foo: bar
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
// Tags
|
||||||
|
|
||||||
|
// tags are made with an @ before identifier
|
||||||
|
@foo bar
|
||||||
|
|
||||||
|
// tags can be attached to any node
|
||||||
|
@foo "string"
|
||||||
|
|
||||||
|
// any number of tags can be attached to a node
|
||||||
|
@foo @bar @foo @bar baz
|
||||||
|
|
||||||
|
// tags can be attached to sets
|
||||||
|
@foo (bar baz)
|
||||||
|
@foo [bar baz]
|
||||||
|
@foo bar: {baz}
|
||||||
|
@foo bar: baz
|
||||||
|
|
||||||
|
// tags can be attached to nodes inside sets
|
||||||
|
@foo (@bar baz)
|
||||||
|
@foo bar: @baz foo_again
|
||||||
|
|
||||||
|
// tags can have children of their own
|
||||||
|
// set with () and no space after the identifier
|
||||||
|
@foo(bar) baz
|
||||||
|
@foo(bar) (baz baz)
|
||||||
|
@foo(bar bar) foo
|
||||||
|
@foo(bar baz) @bar fooz
|
||||||
|
|
||||||
|
// the children of a tag can be sets
|
||||||
|
@foo({bar baz} [biz boo]) far
|
||||||
|
@foo(bar: baz: 123) xyz
|
||||||
|
|
||||||
|
// the children of a tag are actually just a set delimited with ()
|
||||||
|
@tag(tag_child, 123;
|
||||||
|
"strings etc") node
|
||||||
|
|
||||||
|
// the children of a tag can even be tagged
|
||||||
|
@tag(tag_child, @number 123) node
|
||||||
|
@tag(tag_child, @number(integer) 123) node
|
||||||
|
|
||||||
|
|
||||||
+1
-1
@@ -20,7 +20,7 @@ Example Programs:
|
|||||||
Example Metadesk Files:
|
Example Metadesk Files:
|
||||||
[x] Hello world
|
[x] Hello world
|
||||||
[x] identifiers, numbers, strings, and symbols
|
[x] identifiers, numbers, strings, and symbols
|
||||||
[ ] sets, seperators, labels, and tags
|
[x] sets, seperators, and tags
|
||||||
|
|
||||||
|
|
||||||
Allen's Final Tweak Notes (September 10th 2021):
|
Allen's Final Tweak Notes (September 10th 2021):
|
||||||
|
|||||||
Reference in New Issue
Block a user