Skip to content

Instantly share code, notes, and snippets.

@dominictarr
Last active April 20, 2020 08:14
Show Gist options
  • Save dominictarr/2ca7a42a0425db68ab4398e808c5143a to your computer and use it in GitHub Desktop.
Save dominictarr/2ca7a42a0425db68ab4398e808c5143a to your computer and use it in GitHub Desktop.

parse the things HELLO WORLD or HELLO THERE with any number of ! at the end. returns the number of characters matched, if it was a match, or zero.

how to run (clone https://github.com/dominictarr/acidlisp)

> node load.js parse.al > parse.wat
> wat2wasm parse.wat #outputs parse.wasm
> node run.js parse.wasm "HELLO WORLD"
11
> node run.js parse.wasm "HELLO THERE"
11
> node run.js parse.wasm "HELLO THAR"
-1
> node run.js parse.wasm "HELLO THERE!!!"
14
(module
(def strings (import "./strings"))
(def _match (mac R (str i) (block
(def len (strings.length str))
(if (eq i (sub len 1))
&(if (eq (strings.at input (add start $i)) $(strings.at str i)) len -1)
&(if (eq (strings.at input (add start $i)) $(strings.at str i))
(R $str $(add 1 i)) -1)
)
)))
(def Match (mac (str) (list _match str 0)))
(def Or (mac (a b)
&(if (neq -1 (def m $a)) m (if (neq -1 (def m $b)) m -1))
))
(def And [mac (a b)
&{block
(def _start start) ;;_start will be made hygenic
(if
(neq -1 (def m1 $a))
[block
(set start (add _start m1))
(if
(neq -1 (def m2 $b))
(add m1 m2)
(block (set start _start) -1)
)
]
(block (set start _start) -1)
)
}
])
(def Many [mac (a) &{block
(def m2 0)
(loop (neq -1 (def m $a))
(block
(set start (add start m))
(set m2 (add m2 m))
)
)
}])
(def More [mac (a) &{block (And $a (Many $a)) }])
;;returns the number of characters matched.
;;HELLO THERE => 11
;;HELLO WORLD => 11
;;HELLO WORLD! => 12
;;HELLO WORLD!! => 13
;;HELLO WORL => -1
(def hello_world (fun (input start)
(And
(Match "HELLO ")
(Or (Match "THERE") (Match "WORLD"))
(Many (Match "!")))))
;; if i could automatically convert strings,
;; and supported variable args somehow...
;; (And "HELLO " (Or "THERE" "WORLD") (Many "!"))
)
(def hello_world (fun (input start)
(And
(Match "HELLO ")
(Or (Match "THERE") (Match "WORLD"))
(Many (Match "!")))))
(And "HELLO " (Or "THERE" "WORLD") (Many "!"))
)
(export hello_world)
)
(module (memory (export "memory")
1)
(global $FREE (mut i32) (i32.const 0))
(data 0
(offset (i32.const 0))
"\t\00\00\00./strings\06\00\00\00HELLO \05\00\00\00THERE\05\00\00\00WORLD\01\00\00\00!\08\00\00\00./memory")
(func $fun__0
(param $input i32) (param $start i32) (result i32)
(local $_start__3 i32)
(local $1 i32)
(local $5 i32)
(local $3 i32)
(local $m1__4 i32)
(local $_start__6 i32)
(local $9 i32)
(local $7 i32)
(local $m__9 i32)
(local $m__10 i32)
(local $m1__7 i32)
(local $m2__11 i32)
(local $m__12 i32)
(local $2 i32)
(local $m2__8 i32)
(local $m2__5 i32)
(local.set $_start__3 (local.get $start))
(if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 0)))))
(i32.const 72))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 1)))))
(i32.const 69))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 2)))))
(i32.const 76))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 3)))))
(i32.const 76))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 4)))))
(i32.const 79))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 5)))))
(i32.const 32))
(then (local.set $1 (i32.const 6)))
(else (local.set $1 (i32.const -1)))))
(else (local.set $1 (i32.const -1)))))
(else (local.set $1 (i32.const -1)))))
(else (local.set $1 (i32.const -1)))
)
)
(else (local.set $1 (i32.const -1)))
)
(local.set $5 (local.get $1))
)
(else (local.set $5 (i32.const -1)))
)
(local.set $3 (local.tee $m1__4 (local.get $5)))
(if
(i32.ne (i32.const -1) (local.get $3))
(then (local.set
$start (i32.add (local.get $_start__3) (local.get $m1__4)))
(local.set $_start__6 (local.get $start))
(if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 0)))))
(i32.const 84))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 1)))))
(i32.const 72))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 2)))))
(i32.const 69))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 3)))))
(i32.const 82))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 4)))))
(i32.const 69))
(then (local.set $1 (i32.const 5)))
(else (local.set $1 (i32.const -1)))))
(else (local.set $1 (i32.const -1)))))
(else (local.set $1 (i32.const -1)))))
(else (local.set $1 (i32.const -1)))
)
(local.set $9 (local.get $1))
)
(else (local.set $9 (i32.const -1)))
)
(local.set $7 (local.tee $m__9 (local.get $9)))
(if
(i32.ne (i32.const -1) (local.get $7))
(then (local.set $5 (local.get $m__9)))
(else (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 0)))))
(i32.const 87))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 1)))))
(i32.const 79))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 2)))))
(i32.const 82))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 3)))))
(i32.const 76))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 4)))))
(i32.const 68))
(then (local.set $1 (i32.const 5)))
(else (local.set $1 (i32.const -1)))))
(else (local.set $1 (i32.const -1)))))
(else (local.set $1 (i32.const -1)))))
(else (local.set $1 (i32.const -1)))
)
(local.set $5 (local.get $1))
)
(else (local.set $5 (i32.const -1)))
)
(local.set $3 (local.tee $m__10 (local.get $5)))
(if
(i32.ne (i32.const -1) (local.get $3))
(then (local.set $1 (local.get $m__10)))
(else (local.set $1 (i32.const -1))))
(local.set $5 (local.get $1))
)
)
(local.set $3 (local.tee $m1__7 (local.get $5)))
(if
(i32.ne (i32.const -1) (local.get $3))
(then (local.set
$start (i32.add (local.get $_start__6) (local.get $m1__7)))
(local.set $m2__11 (i32.const 0))
(loop
(if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 0)))))
(i32.const 33))
(then (local.set $5 (i32.const 1)))
(else (local.set $5 (i32.const -1))))
(local.set $3 (local.tee $m__12 (local.get $5)))
(if (i32.ne (i32.const -1) (local.get $3))(then
(local.set
$start (i32.add (local.get $start) (local.get $m__12)))
(local.tee $2
(local.tee
$m2__11 (i32.add (local.get $m2__11) (local.get $m__12)))) (br 1))))
(local.set $3 (local.tee $m2__8 (local.get $2)))
(if
(i32.ne (i32.const -1) (local.get $3))
(then
(local.set $1 (i32.add (local.get $m1__7) (local.get $m2__8))))
(else
(local.set $start (local.get $_start__6))
(local.set $1 (i32.const -1))))
)
(else
(local.set $start (local.get $_start__6))
(local.set $1 (i32.const -1)))
)
(local.set $3 (local.tee $m2__5 (local.get $1)))
(if
(i32.ne (i32.const -1) (local.get $3))
(then
(local.set $1 (i32.add (local.get $m1__4) (local.get $m2__5))))
(else
(local.set $start (local.get $_start__3))
(local.set $1 (i32.const -1))))
)
(else
(local.set $start (local.get $_start__3))
(local.set $1 (i32.const -1)))
)
(local.get $1)
)
(export "main" (func $fun__0))
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment