2025-07-12 03:08:05 +01:00
|
|
|
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)
|
|
|
|
|
|
2025-07-12 07:03:09 +01:00
|
|
|
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
|
2025-07-12 03:08:05 +01:00
|
|
|
end
|