class Pars3k::Parse
- Pars3k::Parse
- Reference
- Object
Defined in:
pars3k.crClass Method Summary
- .alphabet
-
.alphabet_lower
cr Parse.one_char_of "abcdefghijklmnopqrstuvwxyz" -
.alphabet_upper
cr Parse.one_char_of "ABCDEFGHIJKLMNOPQRSTUVWXYZ" -
.char(char : Char)
cr p = Parse.char 'a' puts p.parse "abc" #=> a puts p.parse "bca" #=> expected 'a', got 'b' puts p.parse "cab" #=> expected 'a', got 'c' -
.constant(value : T) : Parser(T) forall T
cr p = Parse.constant "abc" puts p.parse "abc" #=> abc puts p.parse "123" #=> abc puts p.parse "" #=> abc -
.delimited_list(parser : Parser(A), delimiter : Parser(B)) : Parser(Array(A)) forall A, B
cr whitespace = Parse.many_of Parse.char ' ' comma = whitespace >> Parse.char(',') >> whitespace word = Parse.join Parse.one_or_more_of Parse.one_char_of "abcdefghijklmnopqrstuvwxyz01234567890" list = Parse.delimited_list word, comma puts list.parse "" #=> [] puts list.parse "hello, world" #=> ["hello", "world"] puts list.parse "par , s3k" #=> ["par", "s3k"] puts list.parse "!!!, hello" #=> [] -
.digit
cr Parse.one_char_of "0123456789" -
.float
cr do_parse({ whole <= (Parse.join Parse.one_or_more_of Parse.digit), _ <= (Parse.one_of? char '.'), decimal <= (Parse.join Parse.many_of Parse.digit), Parse.constant "#{whole}#{decimal.size == 0 ? ".0" : "." + decimal}".to_f }) -
.if_not_nil?(parser : Parser(T), value : B) : Parser(T | Nil) forall T, B
cr parser = (Parse.one_of? Parse.char 'a').sequence do |a| (Parse.if_not_nil? Parse.char('b'), char).sequence do |b| Parse.constant({a, b}) end end puts parser.parse "ab" #=> {'a', 'b'} puts parser.parse "ac" #=> expected 'b', got 'c' puts parser.parse "b" #=> {nil, nil} -
.int
cr (Parse.join Parse.one_or_more_of Parse.digit).transform &.to_i -
.join(parser : Parser(Array(Char))) : Parser(String)
cr alphabet = Parse.one_char_of "abcdefghijklmnopqrstuvwxyz" word = Parse.many_of alphabet word_joined = Parse.join word puts word.parse "hello" #=> ['h', 'e', 'l', 'l', 'o'] puts word_joined.parse "hello" #=> hello -
.many_of(parser : Parser(T)) : Parser(Array(T)) forall T
cr char_a = Parse.char 'a' many_space = Parse.many_of char_a puts p.parse "abc" #=> ['a'] puts p.parse "aabbcc" #=> ['a', 'a'] puts p.parse "aaaaaah" #=> ['a', 'a', 'a', 'a', 'a', 'a'] puts p.parse "pars3k" #=> [] -
.no_char_of(string : String) : Parser(Char)
cr p = Parse.no_char_of "abc" puts p.parse "apple" #=> expected no character of 'abc', got 'a' puts p.parse "banana" #=> expected no character of 'abc', got 'b' puts p.parse "carrot" #=> expected no character of 'abc', got 'c' puts p.parse "dragonfruit" #=> d -
.one_char_of(string : String) : Parser(Char)
cr p = Parse.one_char_of "abc" puts p.parse "apple" #=> a puts p.parse "banana" #=> b puts p.parse "carrot" #=> c puts p.parse "dragonfruit" #=> expected 'c', got 'd' -
.one_of(parser : Parser(T)) : Parser(Array(T)) forall T
cr char_a = Parse.char 'a' set = Parse.one_of char_a puts set.parse "" #=> [] puts set.parse "a" #=> ['a'] puts set.parse "aa" #=> ['a'] -
.one_of?(parser : Parser(T)) : Parser(T | Nil) forall T
cr set = Parse.one_of? Parse.char 'a' puts set.parse "" #=> nil puts set.parse "a" #=> a puts set.parse "aa" #=> a -
.one_or_more_of(parser : Parser(T)) : Parser(Array(T)) forall T
cr char_a = Parse.one_char_of "act" valid = Parse.one_or_more_of char_a puts valid.parse "cat" #=> ['c', 'a', 't'] puts valid.parse "act" #=> ['a', 'c', 't'] puts valid.parse "t" #=> ['t'] puts valid.parse "nope" #=> expected 't', got 'n' -
.some_of(parser : Parser(T), range : Range) : Parser(Array(T)) forall T
cr char_a = Parse.char 'a' set = Parse.some_of char_a, 2..4 puts set.parse "" #=> expected 'a', got end of string puts set.parse "a" #=> expected 'a', got end of string puts set.parse "aa" #=> ['a', 'a'] puts set.parse "aaa" #=> ['a', 'a', 'a'] puts set.parse "aaaa" #=> ['a', 'a', 'a', 'a'] puts set.parse "aaaaa" #=> ['a', 'a', 'a', 'a'] - .some_of(parser : Parser(T), count : Int32) : Parser(Array(T)) forall T
-
.string(string : String) : Parser(String)
cr p = Parse.string "cat" puts p.parse "cat" #=> cat puts p.parse "dog" #=> expected 'c', got 'd' puts p.parse "" #=> expected 'c', got end of string - .word
Class Method Detail
Parse.alphabet_lower | Parse.alphabet_upper
Parses a character in the alphabet regardless of case.
Parse.one_char_of "abcdefghijklmnopqrstuvwxyz"
Parses a character of the lowercase alphabet.
Parse.one_char_of "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Parses a character of the uppercase alphabet.
p = Parse.char 'a'
puts p.parse "abc" #=> a
puts p.parse "bca" #=> expected 'a', got 'b'
puts p.parse "cab" #=> expected 'a', got 'c'
Parse.char(c : Char) creates a Parser(Char) that looks at the current parse position and expects c.
p = Parse.constant "abc"
puts p.parse "abc" #=> abc
puts p.parse "123" #=> abc
puts p.parse "" #=> abc
Parse.constant(value : T) creates a Parser(T) that always succeeds with value.
This method is used to create final parse results using the do_parse macro.
whitespace = Parse.many_of Parse.char ' '
comma = whitespace >> Parse.char(',') >> whitespace
word = Parse.join Parse.one_or_more_of Parse.one_char_of "abcdefghijklmnopqrstuvwxyz01234567890"
list = Parse.delimited_list word, comma
puts list.parse "" #=> []
puts list.parse "hello, world" #=> ["hello", "world"]
puts list.parse "par , s3k" #=> ["par", "s3k"]
puts list.parse "!!!, hello" #=> []
Parse.delimited_list(p : Parser(T), d : Parser(B)) creates a Parser(Array(T)) that will continue to parse
with p delimited by d until an error with either occurs.
do_parse({
whole <= (Parse.join Parse.one_or_more_of Parse.digit),
_ <= (Parse.one_of? char '.'),
decimal <= (Parse.join Parse.many_of Parse.digit),
Parse.constant "#{whole}#{decimal.size == 0 ? ".0" : "." + decimal}".to_f
})
Parses a float as an actual Float.
parser = (Parse.one_of? Parse.char 'a').sequence do |a|
(Parse.if_not_nil? Parse.char('b'), char).sequence do |b|
Parse.constant({a, b})
end
end
puts parser.parse "ab" #=> {'a', 'b'}
puts parser.parse "ac" #=> expected 'b', got 'c'
puts parser.parse "b" #=> {nil, nil}
Parse.if_not_nil?(p : Parser(T), value : B?) creates a Parser(T | Nil) that will always return nil
if the initial value is nil. This is to be used with do_parse or Parser#sequence. It can be used to
ignore parsers if one before it yielded a nil value.
(Parse.join Parse.one_or_more_of Parse.digit).transform &.to_i
Parses an integer as an actual Int.
alphabet = Parse.one_char_of "abcdefghijklmnopqrstuvwxyz"
word = Parse.many_of alphabet
word_joined = Parse.join word
puts word.parse "hello" #=> ['h', 'e', 'l', 'l', 'o']
puts word_joined.parse "hello" #=> hello
Parse.join(p : Parser(Char)) transforms the parser p by adding all of the characters of a result
into a string.
char_a = Parse.char 'a'
many_space = Parse.many_of char_a
puts p.parse "abc" #=> ['a']
puts p.parse "aabbcc" #=> ['a', 'a']
puts p.parse "aaaaaah" #=> ['a', 'a', 'a', 'a', 'a', 'a']
puts p.parse "pars3k" #=> []
Parse.many_of(p : Parser(T)) creates a Parser(Array(T)) that continuously parses the parser p
until it fails. It succeeds with an array of the successive values.
p = Parse.no_char_of "abc"
puts p.parse "apple" #=> expected no character of 'abc', got 'a'
puts p.parse "banana" #=> expected no character of 'abc', got 'b'
puts p.parse "carrot" #=> expected no character of 'abc', got 'c'
puts p.parse "dragonfruit" #=> d
Parse.no_char_of(s : String) functions identically to Parse.one_char_of, but reverses the expected
input. If the current character is present in s, then the parse fails.
p = Parse.one_char_of "abc"
puts p.parse "apple" #=> a
puts p.parse "banana" #=> b
puts p.parse "carrot" #=> c
puts p.parse "dragonfruit" #=> expected 'c', got 'd'
Parse.one_char_of(s : String) creates a Parser(Char) that looks at the current parse position and
expects the current character to be present in the string s.
char_a = Parse.char 'a'
set = Parse.one_of char_a
puts set.parse "" #=> []
puts set.parse "a" #=> ['a']
puts set.parse "aa" #=> ['a']
Parse.one_of(p : Parser(T)) is a shortcut to Parse.some_of(p, 0..1).
set = Parse.one_of? Parse.char 'a'
puts set.parse "" #=> nil
puts set.parse "a" #=> a
puts set.parse "aa" #=> a
Parse.one_of?(p : Parser(T)) creates a Parser(T | Nil) that will return nil if no parse is found.
Otherwise, it returns the value of T. To use the result effectively, check the return type with
result.nil?.
char_a = Parse.one_char_of "act"
valid = Parse.one_or_more_of char_a
puts valid.parse "cat" #=> ['c', 'a', 't']
puts valid.parse "act" #=> ['a', 'c', 't']
puts valid.parse "t" #=> ['t']
puts valid.parse "nope" #=> expected 't', got 'n'
Parse.one_or_more_of(p : Parser(T)) creates a Parser(Array(T)) that works like Parse.many_of,
but expects at least one parse to succeed. Returns with the error of the first failure if it does
not succeed.
char_a = Parse.char 'a'
set = Parse.some_of char_a, 2..4
puts set.parse "" #=> expected 'a', got end of string
puts set.parse "a" #=> expected 'a', got end of string
puts set.parse "aa" #=> ['a', 'a']
puts set.parse "aaa" #=> ['a', 'a', 'a']
puts set.parse "aaaa" #=> ['a', 'a', 'a', 'a']
puts set.parse "aaaaa" #=> ['a', 'a', 'a', 'a']
Parse.some_of(p : Parser(T), r : Range) creates a Parser(Array(T)) that works like Parse.many_of,
but fails if the number of successful parses is below the lower bound of the range r, and stops parsing
if the number of successful parses goes over the limit. In this case, char_a is parsed between 2 and 4 times.
p = Parse.string "cat"
puts p.parse "cat" #=> cat
puts p.parse "dog" #=> expected 'c', got 'd'
puts p.parse "" #=> expected 'c', got end of string
Parse.string(s : String) creates a Parser(String) that looks at the current parse position expects
the array of characters in the string s (s.chars) to be consecutively present.
Parse.join Parse.one_or_more_of Parse.alphabet
Parses a full word of at least one character.