hammer/src/bindings/ruby/lib/hammer.rb

86 lines
1.4 KiB
Ruby
Raw Normal View History

2013-11-10 15:13:15 +01:00
require 'hammer/internal'
require 'hammer/parser'
require 'hammer/parser_builder'
# TODO:
# Probably need to rename this file to 'hammer-parser.rb', so
# people can use "require 'hammer-parser'" in their code.
# TODO: Put tests in test/ directory.
parser = Hammer::Parser.build do
token 'blah'
ch 'a'.ord
2013-11-10 15:13:15 +01:00
choice {
sequence {
token 'abc'
}
token 'def'
}
end
p parser
if parser
p parser.parse 'blahaabcd'
p parser.parse 'blahadefd'
p parser.parse 'blahablad'
p parser.parse 'blaha'
p parser.parse 'blah'
end
parser = Hammer::Parser.build {
token 'Hello '
choice {
token 'Mom'
token 'Dad'
}
token '!'
}
p parser.parse 'Hello Mom!'
parser = Hammer::ParserBuilder.new
.token('Hello ')
2013-11-15 14:21:20 +01:00
.choice(Hammer::Parser.token('Mom'), Hammer::Parser.token('Dad'))
2013-11-10 15:13:15 +01:00
.token('!')
.build
p parser.parse 'Hello Mom!'
2013-11-15 14:21:20 +01:00
h = Hammer::Parser
parser = h.sequence(h.token('Hello '), h.choice(h.token('Mom'), h.token('Dad')), h.token('!'))
p parser.parse 'Hello Mom!'
s = 'blah'
parser = h.token(s)
p parser.parse 'BLAH' # => false
s.upcase!
p parser.parse 'BLAH' # => false
x = nil
parser = Hammer::Parser.build {
token 'abc'
x = indirect
end_p
}
x.bind(h.token('abd'))
p parser.parse 'abcabdabd'
p parser.parse 'abcabd'
p parser.parse 'abdabd'
p parser.parse 'abd'
#$r = parser.parse 'abcabd'
# Test multibyte characters
parser = Hammer::Parser.build {
token '今日'
end_p
}
p ($r = parser.parse('今日')) # should succeed