structure Parser = struct structure T = Tokens fun parseItems (tokens, grid) = case tokens of T.L_BRACE :: T.INT x :: T.INT y :: T.INT ex :: T.INT ey :: T.INT r :: T.INT g :: T.INT b :: T.INT a :: T.R_BRACE :: tl => let val colour = {r = r, g = g, b = b, a = a} val grid = ParseGrid.applyItem (grid, x, y, ex, ey, colour) in parseItems (tl, grid) end | _ => SOME (tokens, grid) fun parse string = case Lexer.scan string of SOME tokens => (case tokens of T.INT canvasWidth :: T.INT canvasHeight :: T.L_BRACE :: tl => let val grid = ParseGrid.make (canvasWidth, canvasHeight) in case parseItems (tl, grid) of SOME (tokens, grid) => (case tokens of [T.R_BRACE] => SOME (canvasWidth, canvasHeight, grid) | _ => NONE) | NONE => NONE end | _ => NONE) | NONE => NONE end