Ergo.Terminals (ergo v0.1.1)
Link to this section Summary
Link to this section Functions
Link to this function
alpha()
The alpha/0
parser accepts a single character in the range a..z or A..Z.
Examples
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("Hello World")
iex> parser = alpha()
iex> parser.(context)
%Context{status: :ok, input: "ello World", char: ?H, ast: ?H, index: 1, line: 1, col: 2}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("ello World")
iex> parser = alpha()
iex> parser.(context)
%Context{status: :ok, input: "llo World", char: ?e, ast: ?e, index: 1, line: 1, col: 2}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new(" World")
iex> parser = alpha()
iex> parser.(context)
%Context{status: {:error, :unexpected_char}, message: "Expected: [a..z, A..Z] Actual: ", input: " World"}
Link to this function
char(c)
The char/1
parser is a terminal parser that matches a specific character.
Examples
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("Hello World")
iex> parser = char(?H)
iex> parser.(context)
%Context{status: :ok, char: ?H, ast: ?H, input: "ello World", index: 1, line: 1, col: 2}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("Hello World")
iex> parser = char(?h)
iex> parser.(context)
%Context{status: {:error, :unexpected_char}, message: "Expected: h Actual: H", input: "Hello World"}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new()
iex> parser = char(?H)
iex> parser.(context)
%Context{status: {:error, :unexpected_eoi}, message: "Unexpected end of input"}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("Hello World")
iex> parser = char(?A..?Z)
iex> parser.(context)
%Context{status: :ok, char: ?H, ast: ?H, input: "ello World", index: 1, line: 1, col: 2}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("Hello World")
iex> parser = char(?a..?z)
iex> parser.(context)
%Context{status: {:error, :unexpected_char}, message: "Expected: a..z Actual: H", input: "Hello World"}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new()
iex> parser = char(?A..?Z)
iex> parser.(context)
%Context{status: {:error, :unexpected_eoi}, message: "Unexpected end of input"}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("Hello World")
iex> parser = char([?a..?z, ?A..?Z])
iex> parser.(context)
%Context{status: :ok, char: ?H, ast: ?H, input: "ello World", index: 1, line: 1, col: 2}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("0000")
iex> parser = char([?a..?z, ?A..?Z])
iex> parser.(context)
%Context{status: {:error, :unexpected_char}, message: "Expected: [a..z, A..Z] Actual: 0", input: "0000"}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("0000")
iex> parser = char(-?0)
iex> parser.(context)
%Context{status: {:error, :unexpected_char}, message: "Should not have matched 0", input: "0000"}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("0000")
iex> parser = char(-?a)
iex> parser.(context)
%Context{status: :ok, input: "000", ast: ?0, char: ?0, index: 1, col: 2}
Link to this function
digit()
The digit/0
parser accepts a character in the range of 0..9
Examples
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("0000")
iex> parser = digit()
iex> parser.(context)
%Context{status: :ok, char: ?0, ast: ?0, input: "000", index: 1, line: 1, col: 2}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("AAAA")
iex> import Ergo.Terminals
iex> parser = digit()
iex> parser.(context)
%Context{status: {:error, :unexpected_char}, message: "Expected: 0..9 Actual: A", char: 0, input: "AAAA", index: 0, line: 1, col: 1}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new()
iex> parser = digit()
iex> parser.(context)
%Context{status: {:error, :unexpected_eoi}, message: "Unexpected end of input", char: 0, input: "", index: 0, line: 1, col: 1}
Link to this function
eoi()
The eoi parser is a terminal parser that checks whether the input has been fully consumed. If there is input remaining to be parsed the return context status is set to :error.
Examples
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new()
iex> parser = eoi()
iex> parser.(context)
%Context{status: :ok}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("Hello World")
iex> parser = eoi()
iex> parser.(context)
%Context{status: {:error, :not_eoi}, message: "Input not empty: Hello World…", input: "Hello World"}
Link to this function
literal(s, opts \\ [])
The literal/1
parser matches the specified string character by character.
Examples
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("Hello World")
iex> parser = literal("Hello")
iex> parser.(context)
%Context{status: :ok, input: " World", ast: "Hello", char: ?o, index: 5, line: 1, col: 6}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("Hello World")
iex> parser = literal("Hellx")
iex> parser.(context)
%Context{status: {:error, :unexpected_char}, message: "Expected: x Actual: o", input: "o World", ast: [?l, ?l, ?e, ?H], char: ?l, index: 4, line: 1, col: 5}
The wc/0
parser parses a word character and is analagous to the \w regular expression.
Examples
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("Hello World")
iex> parser = wc()
iex> parser.(context)
%Context{status: :ok, char: ?H, ast: ?H, input: "ello World", index: 1, col: 2}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("0 World")
iex> parser = wc()
iex> parser.(context)
%Context{status: :ok, char: ?0, ast: ?0, input: " World", index: 1, col: 2}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("_Hello")
iex> parser = wc()
iex> parser.(context)
%Context{status: :ok, char: ?_, ast: ?_, input: "Hello", index: 1, col: 2}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new(" Hello")
iex> parser = wc()
iex> parser.(context)
%Context{status: {:error, :unexpected_char}, message: "Expected: [0..9, a..z, A..Z, _] Actual: ", input: " Hello"}
The ws/0
parser accepts a white space character and is equivalent to the \s regular expression.
Examples
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new(" World")
iex> parser = ws()
iex> parser.(context)
%Context{status: :ok, char: ?\s, ast: ?\s, input: "World", index: 1, line: 1, col: 2}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("\tWorld")
iex> parser = ws()
iex> parser.(context)
%Context{status: :ok, char: ?\t, ast: ?\t, input: "World", index: 1, line: 1, col: 2}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("\nWorld")
iex> parser = ws()
iex> parser.(context)
%Context{status: :ok, char: ?\n, ast: ?\n, input: "World", index: 1, line: 2, col: 1}
iex> alias Ergo.Context
iex> import Ergo.Terminals
iex> context = Context.new("Hello World")
iex> parser = ws()
iex> parser.(context)
%Context{status: {:error, :unexpected_char}, message: "Expected: [\s, \t, \r, \n, \v] Actual: H", input: "Hello World"}