https://github.com/thautwarm/fastparse.fs
fast, easy, typed, minimal
https://github.com/thautwarm/fastparse.fs
parser
Last synced: 7 months ago
JSON representation
fast, easy, typed, minimal
- Host: GitHub
- URL: https://github.com/thautwarm/fastparse.fs
- Owner: thautwarm
- Created: 2018-09-03T07:54:58.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2018-09-06T08:12:04.000Z (over 7 years ago)
- Last Synced: 2025-04-09T15:50:23.730Z (10 months ago)
- Topics: parser
- Language: F#
- Homepage:
- Size: 22.5 KB
- Stars: 8
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
```F#
open FastParse.Parser
open FastParse.Lexer
type sexpr =
| Term of string
| S of sexpr list
(** auto lexer *)
let lexer_tb = [
R "term" "[^\(\)\s]+"
R "space" "\s+"
C "unname" ["("]
C "unname" [")"]
]
let term : token parser = token_by_name "term"
let l: token parser = token_by_value "("
let r: token parser = token_by_value ")"
let rec lisp tokens =
let l =
fun tokens ->
let many: sexpr list parser =
rep lisp 0 -1 <| fun lst -> lst
let l: sexpr list parser =
both l many <| fun _ lst -> lst
let r: sexpr parser =
both l r <| fun lst _ -> S lst
r tokens
let m: sexpr parser = map term <| fun it -> Term it.value
either l m tokens
let filt = Seq.filter <| fun (it: token) -> it.name <> "space"
let tokens = filt >> Array.ofSeq
<| lex None lexer_tb
{filename = ""
text = "(add 1 (mul 1 2 3))"}
let tokens = {arr = tokens; offset = 0}
let value = parse tokens lisp
sprintf "%A" value
(**
output:
S [Term "add"; Term "1"; S [Term "mul"; Term "1"; Term "2"; Term "3"]]
*)
```