aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xnomic.moon10
-rw-r--r--utils.moon4
2 files changed, 9 insertions, 5 deletions
diff --git a/nomic.moon b/nomic.moon
index cc3f7a6..e9a232c 100755
--- a/nomic.moon
+++ b/nomic.moon
@@ -50,7 +50,7 @@ make_parser = (lingo, extra_definitions)->
defs =
:wordchar, :nl, ws:whitespace, :comment
eol: #nl + (P("")-P(1))
- word_boundary: S(" \t")^1 + B(P("..")) + B(S("\";)]")) + #S("\":([") + #P("..")
+ word_boundary: whitespace + B(P("..")) + B(S("\";)]")) + #S("\":([") + #((whitespace + nl)^0 * P(".."))
indent: #(nl * blank_line^0 * Cmt(whitespace^-1, check_indent))
dedent: #(nl * blank_line^0 * Cmt(whitespace^-1, check_dedent))
new_line: nl * blank_line^0 * Cmt(whitespace^-1, check_nodent)
@@ -152,7 +152,7 @@ class Game
if @debug
print("PARSING:\n#{str}")
lingo = [=[
- file <- ({ {| %new_line? {:body: block :} %new_line? (errors)? |} }) -> File
+ file <- ({ {| %ws? %new_line? {:body: block :} %new_line? %ws? (errors)? |} }) -> File
errors <- (({.+}) => error_handler)
block <- ({ {| statement (%new_line statement)* |} }) -> Block
statement <- ({ (functioncall / expression) }) -> Statement
@@ -169,7 +169,7 @@ class Game
fn_bit <- (expression / word)
fn_bits <-
((".." %ws? (%indent %new_line indented_fn_bits %dedent) (%new_line ".." %ws? fn_bits)?)
- / (%new_line ".." fn_bit fn_bits)
+ / (%new_line ".." fn_bit (%word_boundary fn_bits)?)
/ (fn_bit (%word_boundary fn_bits)?))
indented_fn_bits <-
fn_bit ((%new_line / %word_boundary) indented_fn_bits)?
@@ -195,10 +195,10 @@ class Game
("[..]" %ws? %indent %new_line indented_list ","? ((%dedent (%new_line "..")?) / errors))
/ ("[" %ws? (list_items ","?)? %ws?"]")
|} }) -> List
- list_items <- (expression (list_sep list_items)?)
+ list_items <- ((functioncall / expression) (list_sep list_items)?)
list_sep <- %ws? "," %ws?
indented_list <-
- expression (((list_sep %new_line?) / %new_line) indented_list)?
+ (functioncall / expression) (((list_sep %new_line?) / %new_line) indented_list)?
]=]
lingo = make_parser lingo
diff --git a/utils.moon b/utils.moon
index 7ba39bb..1f6d0d7 100644
--- a/utils.moon
+++ b/utils.moon
@@ -64,6 +64,10 @@ utils = {
with tot = 0
for _,x in pairs(t) do tot += x
+ product: (t)->
+ with prod = 1
+ for _,x in pairs(t) do prod *= x
+
all: (t)->
for _,x in pairs t
if not x then return false