commit abb4d44d6e72f6c497b7bf4eaebed0a092b3eabb Author: Phillip Davis Date: Tue Oct 28 09:10:09 2025 -0400 initial commit diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..bfb6c237aec49b8983bfe3ab84b4416fc40be298 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,7 @@ + +root = true + +[*] +indent_style = space +tab_width = 2 +indent_size = 2 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000000000000000000000000000000000000..4a7fe22d29f318ce6bcf6c7b9f90129cf9cf74a9 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,23 @@ +name: test + +on: + push: + branches: + - master + - main + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: erlef/setup-beam@v1 + with: + otp-version: "27.1.2" + gleam-version: "1.12.0" + rebar3-version: "3" + # elixir-version: "1" + - run: gleam deps download + - run: gleam test + - run: gleam format --check src test diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..599be4eb9294fa93ae3e22fc8d4e3828b74d8dd2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.beam +*.ez +/build +erl_crash.dump diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..fd7c0f53ef0a8e53030ec3daea1ea77616554c5d --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +# ghall + +[![Package Version](https://img.shields.io/hexpm/v/ghall)](https://hex.pm/packages/ghall) +[![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/ghall/) + +```sh +gleam add ghall@1 +``` +```gleam +import ghall + +pub fn main() -> Nil { + // TODO: An example of the project in use +} +``` + +Further documentation can be found at . + +## Development + +```sh +gleam run # Run the project +gleam test # Run the tests +``` diff --git a/gleam.toml b/gleam.toml new file mode 100644 index 0000000000000000000000000000000000000000..acf68a3c1bc736f4a4912a610acbf54694c00285 --- /dev/null +++ b/gleam.toml @@ -0,0 +1,20 @@ +name = "ghall" +version = "1.0.0" + +# Fill out these fields if you intend to generate HTML documentation or publish +# your project to the Hex package manager. +# +# description = "" +# licences = ["Apache-2.0"] +# repository = { type = "github", user = "", repo = "" } +# links = [{ title = "Website", href = "" }] +# +# For a full reference of all the available options, you can have a look at +# https://gleam.run/writing-gleam/gleam-toml/. + +[dependencies] +gleam_stdlib = ">= 0.44.0 and < 2.0.0" +nibble = ">= 1.1.4 and < 2.0.0" + +[dev-dependencies] +gleeunit = ">= 1.0.0 and < 2.0.0" diff --git a/manifest.toml b/manifest.toml new file mode 100644 index 0000000000000000000000000000000000000000..c74671d87fac97f237056f26869e1e5c169a44e3 --- /dev/null +++ b/manifest.toml @@ -0,0 +1,16 @@ +# This file was generated by Gleam +# You typically do not need to edit this file + +packages = [ + { name = "gleam_regexp", version = "1.1.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "9C215C6CA84A5B35BB934A9B61A9A306EC743153BE2B0425A0D032E477B062A9" }, + { name = "gleam_stdlib", version = "0.65.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "7C69C71D8C493AE11A5184828A77110EB05A7786EBF8B25B36A72F879C3EE107" }, + { name = "gleam_yielder", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_yielder", source = "hex", outer_checksum = "8E4E4ECFA7982859F430C57F549200C7749823C106759F4A19A78AEA6687717A" }, + { name = "gleeunit", version = "1.6.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "FDC68A8C492B1E9B429249062CD9BAC9B5538C6FBF584817205D0998C42E1DAC" }, + { name = "iv", version = "1.3.2", build_tools = ["gleam"], requirements = ["gleam_stdlib", "gleam_yielder"], otp_app = "iv", source = "hex", outer_checksum = "1FE22E047705BE69EA366E3A2E73C2E1310CBCB27DDE767DE17AE3FA86499947" }, + { name = "nibble", version = "1.1.4", build_tools = ["gleam"], requirements = ["gleam_regexp", "gleam_stdlib", "iv"], otp_app = "nibble", source = "hex", outer_checksum = "06397501730FF486AE6F99299982A33F5EA9F8945B5A25920C82C8F924CEA481" }, +] + +[requirements] +gleam_stdlib = { version = ">= 0.44.0 and < 2.0.0" } +gleeunit = { version = ">= 1.0.0 and < 2.0.0" } +nibble = { version = ">= 1.1.4 and < 2.0.0" } diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000000000000000000000000000000000000..f11a20f0cd9d028230b33fc9962703a20793ea4b --- /dev/null +++ b/shell.nix @@ -0,0 +1,3 @@ +{ pkgs ? import { } }: + +pkgs.mkShell { packages = [ pkgs.gleam pkgs.erlang_28 pkgs.sqlc ]; } diff --git a/src/ghall.gleam b/src/ghall.gleam new file mode 100644 index 0000000000000000000000000000000000000000..5ef6b892ff67850639687ec70a527f46fee9fcac --- /dev/null +++ b/src/ghall.gleam @@ -0,0 +1,10 @@ +import gleam/list +import nibble/lexer.{type Token, Token} +import quasi_lexer + +pub fn main() -> Nil { + let tokens = quasi_lexer.chars() |> quasi_lexer.run(on: "let x1 = e1") + echo tokens + + Nil +} diff --git a/src/node.gleam b/src/node.gleam new file mode 100644 index 0000000000000000000000000000000000000000..a06179dd5d18109e9fca5b6d4759f0d55464d425 --- /dev/null +++ b/src/node.gleam @@ -0,0 +1 @@ +pub type Node diff --git a/src/quasi_lexer.gleam b/src/quasi_lexer.gleam new file mode 100644 index 0000000000000000000000000000000000000000..bd9b354e0ec62f231ce3ade0a1e973a0550487a0 --- /dev/null +++ b/src/quasi_lexer.gleam @@ -0,0 +1,17 @@ +import gleam/list +import nibble/lexer.{type Token, Keep} + +pub fn chars() -> lexer.Lexer(String, Nil) { + lexer.simple([lexer.custom(fn(_, lexeme, _) { Keep(lexeme, Nil) })]) +} + +pub fn run( + lexer: lexer.Lexer(String, Nil), + on input: String, +) -> List(Token(String)) { + let assert Ok(tokens) = lexer.run(input, lexer) + + // Nibble's lexer prepends an empty string to the quasi_lexer's + // otherwise acceptable output + tokens |> list.drop(1) +} diff --git a/src/state.gleam b/src/state.gleam new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/src/state.gleam @@ -0,0 +1 @@ + diff --git a/test/ghall_test.gleam b/test/ghall_test.gleam new file mode 100644 index 0000000000000000000000000000000000000000..a6ac2a693dc9d87e63f387438ffd313b9d060552 --- /dev/null +++ b/test/ghall_test.gleam @@ -0,0 +1,22 @@ +import gleam/list +import gleeunit +import nibble/lexer.{Span, Token} +import quasi_lexer + +pub fn main() -> Nil { + gleeunit.main() +} + +pub fn simple_quasi_lexer_test() { + quasi_lexer.chars() + |> quasi_lexer.run(on: "let x1 = e1") + |> list.index_map(fn(token, index) { + let Token(span, lexeme, value) = token + assert lexeme == value + + let Span(row_start, col_start, row_end, col_end) = span + assert row_start == row_end && row_start == 1 + assert col_start == index + 1 + assert col_end == col_start + 1 + }) +}