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.
|
|
|
|
|
|
|
|
|
|
|
2013-12-16 17:56:49 +01:00
|
|
|
# Leave this in for now to be able to play around with HParseResult in irb.
|
2013-12-11 14:37:36 +01:00
|
|
|
x = nil
|
|
|
|
|
parser = Hammer::Parser.build {
|
|
|
|
|
token 'abc'
|
|
|
|
|
x = indirect
|
|
|
|
|
end_p
|
|
|
|
|
}
|
2013-12-16 17:56:49 +01:00
|
|
|
x.bind(Hammer::Parser.token('abd'))
|
2013-12-16 17:07:50 +01:00
|
|
|
|
2013-12-16 21:00:59 +01:00
|
|
|
#$p = parser
|
2013-12-16 17:56:49 +01:00
|
|
|
$r = parser.parse 'abcabd'
|
2013-12-16 21:00:59 +01:00
|
|
|
|
2014-01-10 21:24:50 +01:00
|
|
|
#p $r[:ast][:data][:seq].elements.map {|e| e[:data][:bytes].token }
|
2013-12-16 23:30:50 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
h = Hammer::Parser
|
|
|
|
|
parser =
|
|
|
|
|
h.many(
|
|
|
|
|
h.action(h.uint8) { |r|
|
2014-01-10 21:24:50 +01:00
|
|
|
#p "TT=#{r[:ast][:token_type]}, value=#{r[:ast][:data][:uint]}"
|
2014-01-11 02:55:02 +01:00
|
|
|
r.data * 2
|
2013-12-16 23:30:50 +01:00
|
|
|
})
|
|
|
|
|
|
|
|
|
|
#parser = Hammer::Parser.build {
|
|
|
|
|
# many {
|
|
|
|
|
# uint8
|
|
|
|
|
# action { |r|
|
|
|
|
|
# p r
|
|
|
|
|
# r[:ast]
|
|
|
|
|
# }
|
|
|
|
|
# }
|
|
|
|
|
#}
|
2013-12-16 23:51:17 +01:00
|
|
|
|
2013-12-16 23:30:50 +01:00
|
|
|
$r = parser.parse 'abcdefgh'
|
2013-12-16 23:51:17 +01:00
|
|
|
|
2014-01-10 21:24:50 +01:00
|
|
|
#p $r[:ast][:data][:seq].elements.map {|e| e[:data][:uint]}
|
2013-12-16 23:51:17 +01:00
|
|
|
# or:
|
2014-01-10 21:24:50 +01:00
|
|
|
#p $r.ast.data.map(&:data)
|
2013-12-17 00:06:29 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
h = Hammer::Parser
|
|
|
|
|
parser = h.many(h.attr_bool(h.uint8) { |r| r.ast.data <= 100 })
|
2014-01-10 21:24:50 +01:00
|
|
|
#p parser.parse('abcdefgh').ast.data.map(&:data)
|