Current section
Files
Jump to
Current section
Files
src/gecko@builder.erl
-module(gecko@builder).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/gecko/builder.gleam").
-export([init/0, keywords/2, tokens/2, comment/3, ident/3, float_universal/3, float/3, number_universal/3, number/3, string/3, regexes/2, compile_safe/2, compile/2]).
-export_type([builder/1]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-opaque builder(DUA) :: {builder,
list({binary(), DUA}),
list({binary(), DUA}),
gleam@option:option({binary(), fun((binary()) -> DUA)}),
gleam@option:option({binary(), fun((binary()) -> DUA)}),
gleam@option:option({binary(), fun((binary()) -> DUA)}),
gleam@option:option({binary(), fun((binary()) -> DUA)}),
gleam@option:option({binary(), fun((binary()) -> DUA)}),
list({binary(), fun((binary()) -> DUA)})}.
-file("src/gecko/builder.gleam", 30).
?DOC(" Initialize a new empty Builder.\n").
-spec init() -> builder(any()).
init() ->
{builder, [], [], none, none, none, none, none, []}.
-file("src/gecko/builder.gleam", 46).
?DOC(
" Set the list of keyword tokens for the builder.\n"
"\n"
" Keywords are matched as literal strings.\n"
).
-spec keywords(builder(DUF), list({binary(), DUF})) -> builder(DUF).
keywords(Builder, List) ->
{builder,
List,
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder)}.
-file("src/gecko/builder.gleam", 56).
?DOC(
" Set the list of non-keyword literal tokens for the builder.\n"
"\n"
" Tokens are matched as literal strings.\n"
).
-spec tokens(builder(DUK), list({binary(), DUK})) -> builder(DUK).
tokens(Builder, List) ->
{builder,
erlang:element(2, Builder),
List,
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder)}.
-file("src/gecko/builder.gleam", 66).
?DOC(
" Set the comment regex for the builder.\n"
"\n"
" The regex is used to match comments in the input.\n"
).
-spec comment(builder(DUP), binary(), fun((binary()) -> DUP)) -> builder(DUP).
comment(Builder, Regex, Token) ->
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
{some, {Regex, Token}},
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder)}.
-file("src/gecko/builder.gleam", 77).
?DOC(
" Set the identifier regex for the builder.\n"
"\n"
" The regex is used to match identifiers in the input.\n"
).
-spec ident(builder(DUS), binary(), fun((binary()) -> DUS)) -> builder(DUS).
ident(Builder, Regex, Token) ->
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
{some, {Regex, Token}},
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder)}.
-file("src/gecko/builder.gleam", 88).
?DOC(
" Set a universal float-matching regex for the builder.\n"
"\n"
" The regex is used to match floats as strings, and the token function receives the matched string.\n"
).
-spec float_universal(builder(DUV), binary(), fun((binary()) -> DUV)) -> builder(DUV).
float_universal(Builder, Regex, Token) ->
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
{some, {Regex, Token}},
erlang:element(8, Builder),
erlang:element(9, Builder)}.
-file("src/gecko/builder.gleam", 99).
?DOC(
" Set the float regex for the builder.\n"
"\n"
" The regex is used to match floats, and the token function receives a parsed Float.\n"
).
-spec float(builder(DUY), binary(), fun((float()) -> DUY)) -> builder(DUY).
float(Builder, Regex, Float) ->
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
{some,
{Regex,
fun(S) ->
F@1 = case gleam_stdlib:parse_float(S) of
{ok, F} ->
F;
{error, _} ->
erlang:error(#{gleam_error => panic,
message => (<<"float: could not parse: "/utf8,
S/binary>>),
file => <<?FILEPATH/utf8>>,
module => <<"gecko/builder"/utf8>>,
function => <<"float"/utf8>>,
line => 110})
end,
Float(F@1)
end}},
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder)}.
-file("src/gecko/builder.gleam", 121).
?DOC(
" Set a universal number-matching regex for the builder.\n"
"\n"
" The regex is used to match numbers as strings, and the token function receives the matched string.\n"
).
-spec number_universal(builder(DVB), binary(), fun((binary()) -> DVB)) -> builder(DVB).
number_universal(Builder, Regex, Token) ->
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
{some, {Regex, Token}},
erlang:element(8, Builder),
erlang:element(9, Builder)}.
-file("src/gecko/builder.gleam", 132).
?DOC(
" Set the number regex for the builder.\n"
"\n"
" The regex is used to match numbers, and the token function receives a parsed Int.\n"
).
-spec number(builder(DVE), binary(), fun((integer()) -> DVE)) -> builder(DVE).
number(Builder, Regex, Number) ->
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
{some,
{Regex,
fun(S) ->
N = case gleam_stdlib:parse_int(S) of
{ok, F} ->
F;
{error, _} ->
erlang:error(#{gleam_error => panic,
message => (<<"number: could not parse: "/utf8,
S/binary>>),
file => <<?FILEPATH/utf8>>,
module => <<"gecko/builder"/utf8>>,
function => <<"number"/utf8>>,
line => 143})
end,
Number(N)
end}},
erlang:element(8, Builder),
erlang:element(9, Builder)}.
-file("src/gecko/builder.gleam", 154).
?DOC(
" Set the string regex for the builder.\n"
"\n"
" The regex is used to match string literals in the input.\n"
).
-spec string(builder(DVH), binary(), fun((binary()) -> DVH)) -> builder(DVH).
string(Builder, Regex, Token) ->
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
{some, {Regex, Token}},
erlang:element(9, Builder)}.
-file("src/gecko/builder.gleam", 165).
?DOC(
" Set additional regex token matchers for the builder.\n"
"\n"
" These regexes are tried after keywords and tokens.\n"
).
-spec regexes(builder(DVK), list({binary(), fun((binary()) -> DVK)})) -> builder(DVK).
regexes(Builder, Regexes) ->
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
Regexes}.
-file("src/gecko/builder.gleam", 228).
-spec compare_literal_builders({binary(), DVX}, {binary(), DVX}) -> gleam@order:order().
compare_literal_builders(L1, L2) ->
{S1, _} = L1,
{S2, _} = L2,
L1_len = string:length(S1),
L2_len = string:length(S2),
gleam@int:compare(L2_len, L1_len).
-file("src/gecko/builder.gleam", 239).
-spec lb_to_tokenfn({binary(), DWA}) -> fun((binary(), binary(), fun((binary()) -> DWA)) -> gleam@option:option({binary(),
gecko@lexer:token(DWA)})).
lb_to_tokenfn(L) ->
{S, L@1} = L,
gecko@lexer:gen_naked(S, fun(_) -> L@1 end).
-file("src/gecko/builder.gleam", 244).
-spec rb_to_token_fn({binary(), fun((binary()) -> DWD)}) -> fun((binary(), binary(), fun((binary()) -> DWD)) -> gleam@option:option({binary(),
gecko@lexer:token(DWD)})).
rb_to_token_fn(R) ->
{S, F} = R,
gecko@lexer:gen_rule(S, F).
-file("src/gecko/builder.gleam", 175).
?DOC(
" Compile the builder into a Lexer, returning a Result.\n"
"\n"
" Returns `Ok(Lexer)` on success, or `Error(String)` if there is a problem.\n"
).
-spec compile_safe(builder(DVP), DVP) -> {ok, gecko@lexer:lexer(DVP)} |
{error, binary()}.
compile_safe(Builder, Eof) ->
Keywords = begin
_pipe = erlang:element(2, Builder),
_pipe@1 = gleam@list:sort(_pipe, fun compare_literal_builders/2),
gleam@list:map(_pipe@1, fun lb_to_tokenfn/1)
end,
Tokens = begin
_pipe@2 = erlang:element(3, Builder),
_pipe@3 = gleam@list:sort(_pipe@2, fun compare_literal_builders/2),
gleam@list:map(_pipe@3, fun lb_to_tokenfn/1)
end,
Regexes = begin
_pipe@4 = erlang:element(9, Builder),
gleam@list:map(_pipe@4, fun rb_to_token_fn/1)
end,
Ident = case erlang:element(5, Builder) of
{some, I} ->
[begin
_pipe@5 = I,
rb_to_token_fn(_pipe@5)
end];
none ->
[]
end,
Float = case erlang:element(6, Builder) of
{some, I@1} ->
[begin
_pipe@6 = I@1,
rb_to_token_fn(_pipe@6)
end];
none ->
[]
end,
Number = case erlang:element(7, Builder) of
{some, I@2} ->
[begin
_pipe@7 = I@2,
rb_to_token_fn(_pipe@7)
end];
none ->
[]
end,
String = case erlang:element(8, Builder) of
{some, I@3} ->
[begin
_pipe@8 = I@3,
rb_to_token_fn(_pipe@8)
end];
none ->
[]
end,
Toks = [],
Toks@1 = lists:append(Toks, Keywords),
Toks@2 = lists:append(Toks@1, Tokens),
Toks@3 = lists:append(Toks@2, Regexes),
Toks@4 = lists:append(Toks@3, Ident),
Toks@5 = lists:append(Toks@4, Float),
Toks@6 = lists:append(Toks@5, Number),
Toks@7 = lists:append(Toks@6, String),
{ok, {lexer, Toks@7, Eof}}.
-file("src/gecko/builder.gleam", 220).
?DOC(
" Compile the builder into a Lexer, panicking on error.\n"
"\n"
" Returns a Lexer, or panics if there is a problem.\n"
).
-spec compile(builder(DVU), DVU) -> gecko@lexer:lexer(DVU).
compile(Builder, Eof) ->
case compile_safe(Builder, Eof) of
{ok, L} ->
L;
{error, E} ->
erlang:error(#{gleam_error => panic,
message => E,
file => <<?FILEPATH/utf8>>,
module => <<"gecko/builder"/utf8>>,
function => <<"compile"/utf8>>,
line => 223})
end.