Created
October 19, 2020 18:22
-
-
Save r17x/91415db30a490d54d46d44b7beff30cb to your computer and use it in GitHub Desktop.
DSL
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // @broerjuang https://discordapp.com/channels/735469928378925156/736199426309226536/767813964285214812 | |
| // parser -> Parser Generator || Parser Combinator | |
| open ReludeParse.Parser; | |
| let input = " | |
| filterBy Category = \"'fantasy'\" | |
| orderBy Rating desc | |
| skip 5 | |
| take 10 | |
| "; | |
| module Operator = { | |
| type t = | |
| | Add | |
| | Substract | |
| | Multiply | |
| | Divide | |
| | Equals | |
| | LesserThan | |
| | LesserThanEquals | |
| | BiggerThan | |
| | BiggerThanEquals | |
| | And | |
| | Or; | |
| let parseEquals = str("=") |> map(_ => Equals); | |
| let parser = parseEquals; | |
| }; | |
| module Expression = { | |
| type t = | |
| | Int(int) | |
| | Str(string) | |
| | Identifier(string) | |
| | Binary(t, Operator.t, t); | |
| let parseIdentifier = | |
| manyUntil(str("=") <|> str(" "), anyChar) <#> Relude.List.String.join; | |
| let parseStrLiteral = | |
| str("'") *> manyUntil(str("'"), anyChar) <#> Relude.List.String.join; | |
| let parser = parseStrLiteral <|> parseIdentifier; | |
| let make = (left, op, right) => { | |
| switch (op) { | |
| | Operator.Equals => Binary(left, Operator.Equals, right) | |
| | _ => Binary(left, Add, right) | |
| }; | |
| }; | |
| }; | |
| let x: Expression.t = | |
| Binary(Identifier("Category"), Equals, Str("fantasy")); | |
| Js.log( | |
| Expression.make | |
| <$> ws | |
| *> (Expression.parser |> map(x => Expression.Identifier(x))) | |
| <*> Operator.parser | |
| <*> ws | |
| *> (Expression.parser |> map(x => Expression.Str(x))) | |
| |> runParser(" Category ='fantasy'"), | |
| ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment