Skip to content

Instantly share code, notes, and snippets.

@r17x
Created October 19, 2020 18:22
Show Gist options
  • Select an option

  • Save r17x/91415db30a490d54d46d44b7beff30cb to your computer and use it in GitHub Desktop.

Select an option

Save r17x/91415db30a490d54d46d44b7beff30cb to your computer and use it in GitHub Desktop.
DSL
// @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