pears/chars
Parsers for strings, which pears.parse_string splits into graphemes
(Chars).
- Characters:
letter,digit,alphanumeric,hex_digit,whitespace - Text:
string,case_insensitive,string_literal,line_comment - Numbers:
natural,integer,float - Whitespace:
whitespace0,whitespace1,lexeme - Errors:
format_error,line_column
import pears
import pears/combinators.{sep_by0}
let numbers = sep_by0(lexeme(integer()), lexeme(string(",")))
assert pears.parse_string_all("1, -2, 3", numbers) == Ok([1, -2, 3])
Types
Values
pub fn alphanumeric() -> pears.Parser(String, String)
Parses an ASCII letter or a digit.
import pears
assert pears.parse_string_all("7", alphanumeric()) == Ok("7")
pub fn case_insensitive(
str: String,
) -> pears.Parser(String, String)
Parses a given string, ignoring case, and returns the matched input.
import pears
assert pears.parse_string_all("Select", case_insensitive("SELECT")) == Ok("Select")
pub fn digit() -> pears.Parser(String, String)
Parses a digit in the range 0-9.
import pears
assert pears.parse_string_all("7", digit()) == Ok("7")
pub fn float() -> pears.Parser(String, Float)
Parses a number with a fractional part and an optional exponent, like
-1.5 or 2.0e10. Numbers out of range fail with a custom error.
import pears
assert pears.parse_string_all("-1.5e3", float()) == Ok(-1500.0)
pub fn format_error(
error: pears.ParseError(String),
source: String,
) -> String
Formats a parse error with the line and column in source, the parsed string,
e.g. line 2, column 4: expected "," or "]", found "x".
import pears
import pears/combinators.{many0, or}
let source = "ab\nc!"
let assert Error(error) = pears.parse_string_all(source, many0(or(letter(), whitespace())))
assert format_error(error, source) == "line 2, column 2: expected letter, whitespace or end of input, found \"!\""
pub fn hex_digit() -> pears.Parser(String, String)
Parses a hexadecimal digit, 0-9, a-f or A-F.
import pears
assert pears.parse_string_all("F", hex_digit()) == Ok("F")
pub fn integer() -> pears.Parser(String, Int)
Parses an integer with an optional leading -.
import pears
assert pears.parse_string_all("-42", integer()) == Ok(-42)
pub fn letter() -> pears.Parser(String, String)
Parses an ASCII letter, a-z or A-Z.
import pears
assert pears.parse_string_all("Q", letter()) == Ok("Q")
pub fn lexeme(
parser: pears.Parser(String, a),
) -> pears.Parser(String, a)
Runs the parser and skips any whitespace after it.
import pears
assert pears.parse_string_all("let ", lexeme(string("let"))) == Ok("let")
pub fn line_column(source: String, position: Int) -> #(Int, Int)
Returns the 1-based line and column of the character at position in source.
assert line_column("ab\ncd", 4) == #(2, 2)
pub fn line_comment(
start: String,
) -> pears.Parser(String, String)
Parses start and the rest of the line, returning the text after start.
The line break isn’t consumed.
import pears
let assert Ok(parsed) = pears.parse_string("// hi\nx", line_comment("//"))
assert parsed.value == " hi"
pub fn natural() -> pears.Parser(String, Int)
Parses a non-negative integer consisting of one or more digits. On JavaScript, integers too large to be represented exactly fail with a custom error.
import pears
assert pears.parse_string_all("042", natural()) == Ok(42)
pub fn string(str: String) -> pears.Parser(String, String)
Parses a given string. Errors point at the first character that doesn’t match.
import pears.{UnexpectedToken}
assert pears.parse_string_all("let", string("let")) == Ok("let")
assert pears.parse_string("lex", string("let")) == Error(UnexpectedToken(2, ["\"let\""], "x"))
pub fn string_literal() -> pears.Parser(String, String)
Parses a double-quoted string with JSON-style escapes (\", \\, \/,
\b, \f, \n, \r, \t and \uXXXX, including surrogate pairs) and
returns its contents.
import pears
assert pears.parse_string_all("\"a\\nb\"", string_literal()) == Ok("a\nb")
pub fn whitespace() -> pears.Parser(String, String)
Parses a character if it is whitespace according to the Unicode standard.
import pears
assert pears.parse_string_all("\t", whitespace()) == Ok("\t")
pub fn whitespace0() -> pears.Parser(String, List(String))
Parses zero or more whitespace characters. Hidden from error messages.
import pears
assert pears.parse_string_all(" ", whitespace0()) == Ok([" ", " "])
assert pears.parse_string_all("", whitespace0()) == Ok([])
pub fn whitespace1() -> pears.Parser(String, List(String))
Parses one or more whitespace characters.
import pears
assert pears.parse_string_all(" ", whitespace1()) == Ok([" ", " "])
let assert Error(_) = pears.parse_string_all("", whitespace1())