Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
JosephTLyons committed Nov 11, 2024
1 parent c49136b commit dde280c
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 10 deletions.
4 changes: 2 additions & 2 deletions src/lenient_parse.gleam
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import gleam/bool
import lenient_parse/internal/base_constants.{base_10}
import lenient_parse/internal/base_constants.{base_0, base_10}
import lenient_parse/internal/parser
import lenient_parse/internal/tokenizer
import parse_error.{type ParseError, InvalidBaseValue}
Expand All @@ -26,7 +26,7 @@ pub fn to_int_with_base(
text text: String,
base base: Int,
) -> Result(Int, ParseError) {
let is_valid_base = base == 0 || { base >= 2 && base <= 36 }
let is_valid_base = base == base_0 || { base >= 2 && base <= 36 }
use <- bool.guard(!is_valid_base, Error(InvalidBaseValue(base)))
let tokens = text |> tokenizer.tokenize_int(base: base)
tokens |> parser.parse_int(base: base)
Expand Down
2 changes: 2 additions & 0 deletions src/lenient_parse/internal/base_constants.gleam
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
pub const base_0 = 0

pub const base_2 = 2

pub const base_8 = 8
Expand Down
12 changes: 8 additions & 4 deletions src/lenient_parse/internal/parser.gleam
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import gleam/option.{type Option, None, Some}
import gleam/order
import gleam/queue.{type Queue}
import gleam/result
import lenient_parse/internal/base_constants.{base_10}
import lenient_parse/internal/base_constants.{
base_0, base_10, base_16, base_2, base_8,
}
import lenient_parse/internal/scale
import lenient_parse/internal/token.{
type Token, BasePrefix, DecimalPoint, Digit, ExponentSymbol, Sign, Underscore,
Expand Down Expand Up @@ -122,7 +124,9 @@ pub fn parse_int(
use ParseData(is_positive, next_index, tokens) <- result.try(parse_data)

let parse_data = case base {
a if a == 0 || a == 2 || a == 8 || a == 16 -> {
base
if base == base_0 || base == base_2 || base == base_8 || base == base_16
-> {
let parse_data = parse_base_prefix(tokens, next_index)
use ParseData(base_data, next_index, tokens) <- result.try(parse_data)

Expand All @@ -132,9 +136,9 @@ pub fn parse_int(
Some(#(index_range, prefix)),
)
None -> {
let default_base = case a {
let default_base = case base {
0 -> base_10
_ -> a
_ -> base
}

#(default_base, None)
Expand Down
10 changes: 6 additions & 4 deletions src/lenient_parse/internal/tokenizer.gleam
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import gleam/list
import gleam/option.{type Option, None, Some}
import gleam/string
import lenient_parse/internal/base_constants.{base_10, base_16, base_2, base_8}
import lenient_parse/internal/base_constants.{
base_0, base_10, base_16, base_2, base_8,
}
import lenient_parse/internal/token.{
type Token, BasePrefix, DecimalPoint, Digit, ExponentSymbol, Sign, Underscore,
Unknown, Whitespace,
Expand Down Expand Up @@ -60,15 +62,15 @@ fn do_tokenize_int(
lookahead
{
False, "0", Ok(specifier)
if { base == 0 || base == 2 }
if { base == base_0 || base == base_2 }
&& { specifier == "b" || specifier == "B" }
-> create_base_prefix(index, specifier, base_2, rest)
False, "0", Ok(specifier)
if { base == 0 || base == 8 }
if { base == base_0 || base == base_8 }
&& { specifier == "o" || specifier == "O" }
-> create_base_prefix(index, specifier, base_8, rest)
False, "0", Ok(specifier)
if { base == 0 || base == 16 }
if { base == base_0 || base == base_16 }
&& { specifier == "x" || specifier == "X" }
-> create_base_prefix(index, specifier, base_16, rest)
_, _, _ -> {
Expand Down

0 comments on commit dde280c

Please sign in to comment.