diff --git a/dotscape b/dotscape index 887472f..1ce6a99 100755 Binary files a/dotscape and b/dotscape differ diff --git a/fcore/app-init.sml b/fcore/app-init.sml index ed23c86..a722d9e 100644 --- a/fcore/app-init.sml +++ b/fcore/app-init.sml @@ -45,7 +45,7 @@ struct , g = 0 , b = 0 , a = 1 - , layer = 0 + , layer = LayerTree.minKey , layerTree = layerTree , modalNum = 0 } diff --git a/fcore/app-with.sml b/fcore/app-with.sml index 51fef4c..78c88d0 100644 --- a/fcore/app-with.sml +++ b/fcore/app-with.sml @@ -746,7 +746,7 @@ struct , modalNum } = app - val layer = modalNum + val layer = Int.max (modalNum, 1) in { mode = mode , mouseX = mouseX @@ -770,7 +770,7 @@ struct , a = a , layer = layer , layerTree = layerTree - , modalNum = modalNum + , modalNum = 0 } end diff --git a/fcore/layer-tree.sml b/fcore/layer-tree.sml index 8e85345..132543a 100644 --- a/fcore/layer-tree.sml +++ b/fcore/layer-tree.sml @@ -2,9 +2,11 @@ structure LayerTree = struct datatype t = NODE of {key: int, value: Grid.t, left: t, right: t} | LEAF + val minKey = 1 + fun init maxSide = let val grid = Grid.makeEmpty maxSide - in NODE {key = 0, value = grid, left = LEAF, right = LEAF} + in NODE {key = minKey, value = grid, left = LEAF, right = LEAF} end fun insert (newKey, newValue, tree) = diff --git a/fcore/parser/brace-dfa.sml b/fcore/parser/brace-dfa.sml index 898da35..674aab1 100644 --- a/fcore/parser/brace-dfa.sml +++ b/fcore/parser/brace-dfa.sml @@ -5,8 +5,13 @@ struct val final = 2 fun makeStart i = - let val chr = Char.chr i - in if chr = #"{" orelse chr = #"}" then final else dead + let + val chr = Char.chr i + in + if chr = #"{" orelse chr = #"}" orelse chr = #"[" orelse chr = #"]" then + final + else + dead end val deadTable = SpaceDfa.deadTable diff --git a/fcore/parser/lexer.sml b/fcore/parser/lexer.sml index 9c23714..ae88c72 100644 --- a/fcore/parser/lexer.sml +++ b/fcore/parser/lexer.sml @@ -26,6 +26,8 @@ struct else if min = lastBrace then if str = "{" then SOME (lastBrace, T.L_BRACE :: acc) else if str = "}" then SOME (lastBrace, T.R_BRACE :: acc) + else if str = "[" then SOME (lastBrace, T.L_BRACKET :: acc) + else if str = "]" then SOME (lastBrace, T.R_BRACKET :: acc) else NONE else NONE diff --git a/fcore/parser/parser.md b/fcore/parser/parser.md index 9b121e3..9b18895 100644 --- a/fcore/parser/parser.md +++ b/fcore/parser/parser.md @@ -4,14 +4,16 @@ The parsing functionality is for saving and loading from a custom file format. The BNF for the custom file format is below. -Terminals are surrounded by `**` to the left and right. (rule)+ means "1 o more". +Terminals are surrounded by `**` to the left and right. (rule)+ means "1 or more". ``` int ::= (0-9)+ item ::= **{** int int int int int int int int **}** -grid ::= int int **{** (item)+ **}** +grid ::= **[** item **]** + +grid_list ::= int int **{** (grid)+ **}** ``` The first two `int`s in the grid `int int **{** (item)+ **}**` always follow the order: `canvasWidth canvasHeight`. diff --git a/fcore/parser/tokens.sml b/fcore/parser/tokens.sml index 965ef34..3a643c8 100644 --- a/fcore/parser/tokens.sml +++ b/fcore/parser/tokens.sml @@ -1,7 +1,2 @@ structure Tokens = -struct - datatype t = - L_BRACE - | R_BRACE - | INT of int -end +struct datatype t = L_BRACE | R_BRACE | L_BRACKET | R_BRACKET | INT of int end