aboutsummaryrefslogtreecommitdiff
path: root/nomsu.peg
diff options
context:
space:
mode:
authorBruce Hill <bitbucket@bruce-hill.com>2018-07-12 16:14:29 -0700
committerBruce Hill <bitbucket@bruce-hill.com>2018-07-12 16:14:44 -0700
commitf908bb49b30dcead0c5123a513a1ee9e70dac412 (patch)
tree7751c773bc6847a8dfab6cc0859d50c57c5e76a0 /nomsu.peg
parentba2b83d5669f9fcf6f49fcd2adac5997eb07f7d8 (diff)
Initial version of new pegfile. works (ish)
Diffstat (limited to 'nomsu.peg')
-rw-r--r--nomsu.peg163
1 files changed, 79 insertions, 84 deletions
diff --git a/nomsu.peg b/nomsu.peg
index 4598598..62f1900 100644
--- a/nomsu.peg
+++ b/nomsu.peg
@@ -1,24 +1,37 @@
--- Nomsu version 1
-file:
- shebang?
- (ignored_line %nl)*
- (file_chunks / block / action / expression)?
- (%nl ignored_line)*
- (!. / (({} (.* -> "Parse error") %userdata) => error))
-
-shebang:
- ("#!" (!"nomsu" !%nl .)* "nomsu" ((%ws* "-V" %ws* {[0-9]+ ("." [0-9]+)*}) / {''}) %ws* (%nl / !.) %userdata) => Version
-
-file_chunks (FileChunks):
- {| (block/action/expression) (nodent chunk_delimeter nodent (block/action/expression))+ |}
-chunk_delimeter: "~~~" (("~")*)
+-- Nomsu version 2
+file (File):
+ {:curr_indent: '' :}
+ blank_line*
+ (chunk (nl_nodent chunk_delimeter nl_nodent chunk)*)?
+ blank_line*
+ (!. / (!! .* -> "Parse error" !!))
+
+nodent: =curr_indent !(" ")
+indent: =curr_indent " " !(" ")
+dedent: !(=curr_indent) (" ")*
+eol: %ws* (!. / &%nl)
+
+comment (Comment):
+ "#" {~ [^%nl]* (%nl+ ({:curr_indent: indent :} -> '') [^%nl]* (%nl+ (=curr_indent -> '') [^%nl]*)* (!. / nl_dedent))? ~}
+inline_comment (Comment):
+ "(#" {~ (inline_comment / [^%nl])* ~} "#)"
+
+blank_line: %nl eol
+nl_nodent: blank_line* %nl nodent
+nl_indent: blank_line* %nl {:curr_indent: indent :}
+nl_dedent: blank_line* %nl &dedent
+
+chunk: !chunk_delimeter (block/action/expression)
+chunk_delimeter: ("~")^+3
inline_block (Block):
- {| inline_statement (%ws* ";" %ws* inline_statement)+ |}
+ (inline_comment / inline_statement) (%ws* ";" %ws* (inline_comment / inline_statement))+
block (Block):
- {| statement (nodent !("~") (statement / (({} ([^%nl]* -> "Unexpected character while parsing block line") %userdata) => error)))+ |}
+ block_line (nl_nodent block_line)+
+block_line:
+ comment / inline_comment / statement / (!! [^%nl]* -> "Unexpected character while parsing block line" !!)
-statement: (action / expression) (eol / (({} ([^%nl]* -> "Unexpected character while parsing line") %userdata) => error))
+statement: (action / expression) (eol / (!! [^%nl]* -> "Unexpected character while parsing line" !!))
inline_statement: inline_action / inline_expression
noindex_inline_expression:
@@ -27,64 +40,56 @@ noindex_inline_expression:
%ws* (inline_block / inline_action / inline_expression) %ws*
(%ws* ',' %ws* (inline_block / inline_action / inline_expression) %ws*)*
(")"
- / (({} ((!. / &%nl) -> 'Line ended without finding a closing )-parenthesis') %userdata) => error)
- / (({} ([^%nl]* -> 'Unexpected character while parsing subexpression') %userdata) => error)
+ / (!! eol -> 'Line ended without finding a closing )-parenthesis' !!)
+ / (!! [^%nl]+ -> 'Unexpected character while parsing subexpression' !!)
)
)
-inline_expression:
- index_chain / noindex_inline_expression
+inline_expression: index_chain / noindex_inline_expression
indented_expression:
indented_text / indented_nomsu / indented_list / indented_dict
- / ("(..)"? indent
+ / (("(..)" / ":")? nl_indent
(block / action / expression)
- (dedent / (({} (non_dedent_error -> "Unexpected character while parsing indented expression") %userdata) => error))
+ (!. / &nl_dedent / (!! (!nl_dedent .)* -> "Unexpected character while parsing indented expression" !!))
)
expression:
inline_expression
/ (":" %ws* ((inline_block / inline_action / inline_expression) eol
- / (({} (eol -> "Missing expression after the ':'") %userdata) => error)))
+ / (!! eol -> "Missing expression after the ':'" !!)))
/ indented_expression
-inline_nomsu (EscapedNomsu): "\" {| inline_expression |}
+inline_nomsu (EscapedNomsu): "\" inline_expression
indented_nomsu (EscapedNomsu):
- "\" {|
+ "\" (
noindex_inline_expression
/ (":" %ws* ((inline_block / inline_action / inline_expression) eol
- / (({} (eol -> "Missing expression after the ':'") %userdata) => error)))
- / indented_expression |}
+ / (!! eol -> "Missing expression after the ':'" !!)))
+ / indented_expression)
index_chain (IndexChain):
- {| noindex_inline_expression ("." (text_word / noindex_inline_expression))+ |}
+ noindex_inline_expression ("." (text_word / noindex_inline_expression))+
-- Actions need either at least 1 word, or at least 2 tokens
inline_action (Action):
- !chunk_delimeter
- {|
( (inline_expression (%ws* (inline_expression / word))+)
/ (word (%ws* (inline_expression / word))*))
(%ws* ":" %ws* (inline_block / inline_action / inline_expression
- / (({} ('' -> "Missing expression after the ':'") %userdata) => error)))?
- |}
+ / (!! '' -> "Missing expression after the ':'" !!)))?
action (Action):
- !chunk_delimeter
- {|
- (expression ((nodent "..")? %ws* (expression / word))+)
- / (word ((nodent "..")? %ws* (expression / word))*)
- |}
+ (expression ((nl_nodent "..")? %ws* (expression / word))+)
+ / (word ((nl_nodent "..")? %ws* (expression / word))*)
-word: !number { %operator_char+ / %ident_char+ }
+word: !number ( %operator_char+ / %ident_char+ )
-text_word (Text): {| word |}
+text_word (Text): word
inline_text (Text):
!('".."' eol)
- '"' {|
+ '"'
({~ (('\"' -> '"') / ('\\' -> '\') / %escaped_char / [^%nl\"])+ ~}
/ inline_text_interpolation)*
- |} ('"' / (
- (({} (eol->'Line ended before finding a closing double quotation mark') %userdata) => error)
- /(({} ([^%nl]*->'Unexpected character while parsing Text') %userdata) => error)
- ))
+ ('"'
+ / (!! eol -> 'Line ended before finding a closing double quotation mark' !!)
+ / (!! [^%nl]* -> 'Unexpected character while parsing Text' !!))
inline_text_interpolation:
"\" (
variable / inline_list / inline_dict / inline_text
@@ -92,73 +97,63 @@ inline_text_interpolation:
%ws* (inline_block / inline_action / inline_expression) %ws*
(%ws* ',' %ws* (inline_block / inline_action / inline_expression) %ws*)*
(")"
- / (({} (&%nl -> 'Line ended without finding a closing )-parenthesis') %userdata) => error)
- / (({} ([^%nl]* -> 'Unexpected character while parsing Text interpolation') %userdata) => error))
- )
+ / (!! &%nl -> 'Line ended without finding a closing )-parenthesis' !!)
+ / (!! [^%nl]* -> 'Unexpected character while parsing Text interpolation' !!)))
)
-- Have to use "%indent" instead of "indent" etc. to avoid messing up text lines that start with "#"
indented_text (Text):
- '".."' eol %nl {|
- {~ (%nl*) (%indent -> "") ~}
- (indented_plain_text / text_interpolation / {~ %nl+ (%nodent -> "") ~})*
- |} (((!.) %dedent) / (&(%nl %dedent)) / (({} (non_dedent_error -> "Unexpected character while parsing Text") %userdata) => error))
+ '".."' eol %nl
+ {~ (%nl*) ({:curr_indent: indent :} -> "") ~}
+ (indented_plain_text / text_interpolation / {~ %nl+ (nodent -> "") ~})*
+ (!. / &nl_dedent / (!! (!nl_dedent .)* -> "Unexpected character while parsing Text" !!))
indented_plain_text (Text):
- {| {~ (("\\" -> "\") / (("\" nodent "..") -> "") / (!text_interpolation "\") / [^%nl\]+)+
- (%nl+ (%nodent -> ""))* ~} |}
+ {~ (("\\" -> "\") / (("\" nl_nodent "..") -> "") / (!text_interpolation "\") / [^%nl\]+)+
+ (%nl+ (nodent -> ""))* ~}
text_interpolation:
- inline_text_interpolation / ("\" indented_expression nodent "..")
+ inline_text_interpolation / ("\" indented_expression nl_nodent "..")
-number (Number): {| (("-"? (([0-9]+ "." [0-9]+) / ("." [0-9]+) / ([0-9]+)))-> tonumber) |}
+number (Number): (("-"? (([0-9]+ "." [0-9]+) / ("." [0-9]+) / ([0-9]+)))-> tonumber)
-- Variables can be nameless (i.e. just %) and can't contain operators like apostrophe
-- which is a hack to allow %'s to parse as "%" and "' s" separately
-variable (Var): "%" {| {(%ident_char+ ((!"'" %operator_char+) / %ident_char+)*)?} |}
+variable (Var): "%" {(%ident_char+ ((!"'" %operator_char+) / %ident_char+)*)?}
inline_list (List):
!('[..]')
"[" %ws*
- {| (inline_list_item (%ws* ',' %ws* inline_list_item)* (%ws* ',')?)? |} %ws*
+ (inline_list_item (%ws* ',' %ws* inline_list_item)* (%ws* ',')?)? %ws*
("]" / (","? (
- (({} (eol->"Line ended before finding a closing ]-bracket") %userdata) => error)
- /(({} ([^%nl]*->"Unexpected character while parsing List") %userdata) => error)
+ (!! eol -> "Line ended before finding a closing ]-bracket" !!)
+ /(!! [^%nl]* -> "Unexpected character while parsing List" !!)
)))
indented_list (List):
- "[..]" indent
- {| list_line (nodent list_line)* |}
- (dedent / ((","? {} (non_dedent_error -> "Unexpected character while parsing List") %userdata) => error))
+ "[..]" nl_indent
+ list_line (nl_nodent list_line)*
+ (&nl_dedent / (","? (!! (!nl_dedent .)* -> "Unexpected character while parsing List" !!)))
list_line:
- ((action / expression) !(%ws* ','))
- / (inline_list_item ((%ws* ',' %ws*) list_line?)?)
+ (inline_list_item %ws* "," %ws*)+ eol
+ / (inline_list_item %ws* "," %ws*)* (action / expression)
inline_list_item: inline_block / inline_action / inline_expression
inline_dict (Dict):
!('{..}')
"{" %ws*
- {| (inline_dict_entry (%ws* ',' %ws* inline_dict_entry)*)? |} %ws*
+ (inline_dict_entry (%ws* ',' %ws* inline_dict_entry)*)? %ws*
("}" / (","? (
- (({} (%ws* eol->"Line ended before finding a closing }-brace") %userdata) => error)
- / (({} ([^%nl]*->"Unexpected character while parsing Dictionary") %userdata) => error)
+ (!! %ws* eol -> "Line ended before finding a closing }-brace" !!)
+ / (!! [^%nl]* -> "Unexpected character while parsing Dictionary" !!)
)))
indented_dict (Dict):
- "{..}" indent
- {| dict_line (nodent dict_line)* |}
- (dedent / ((","? {} (non_dedent_error -> "Unexpected character while parsing Dictionary") %userdata) => error))
+ "{..}" nl_indent
+ dict_line (nl_nodent dict_line)*
+ (&nl_dedent / (","? (!! (!nl_dedent .)* -> "Unexpected character while parsing Dictionary" !!)))
dict_line:
- (dict_entry !(%ws* ',')) / (inline_dict_entry (%ws* ',' %ws dict_line?)?)
+ (inline_dict_entry %ws* "," %ws*)+ eol
+ / (inline_dict_entry %ws* "," %ws*)* dict_entry
dict_entry(DictEntry):
- {| dict_key (%ws* ":" %ws* (action / expression))? |}
+ dict_key (%ws* ":" %ws* (action / expression))?
inline_dict_entry(DictEntry):
- {| dict_key (%ws* ":" %ws* (inline_block / inline_action / inline_expression)?)? |}
+ dict_key (%ws* ":" %ws* (inline_block / inline_action / inline_expression)?)?
dict_key:
text_word / inline_expression
-
-comment: ("#" {} {~[^%nl]* (%nl+ (%indent -> '') [^%nl]* (%nl+ (%nodent -> '') [^%nl]*)* %dedent)?~} %userdata) => Comment
-eol_comment: ("#" {} {[^%nl]*} %userdata) => Comment
-
-eol: %ws* eol_comment? (!. / &%nl)
-ignored_line: (%nodent comment) / (%ws* (!. / &%nl))
-indent: eol (%nl ignored_line)* %nl %indent (comment (%nl ignored_line)* nodent)?
-nodent: eol (%nl ignored_line)* %nl %nodent
-dedent: eol (%nl ignored_line)* (((!.) %dedent) / (&(%nl %dedent)))
-non_dedent_error: (!dedent .)* eol (%nl ignored_line)* (!. / &%nl)