hammer-parser 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +101 -0
- data/lib/hammer-parser.rb +47 -0
- data/lib/hammer/internal.rb +346 -0
- data/lib/hammer/parser.rb +224 -0
- data/lib/hammer/parser_builder.rb +124 -0
- data/lib/minitest/hamer-parser_plugin.rb +31 -0
- data/test/autogen_test.rb +755 -0
- data/test/parser_test.rb +132 -0
- metadata +83 -0
data/test/parser_test.rb
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'hammer-parser'
|
4
|
+
require 'minitest/autorun'
|
5
|
+
|
6
|
+
class ParserTest < Minitest::Test
|
7
|
+
def test_builder_1
|
8
|
+
parser = Hammer::Parser.build {
|
9
|
+
token 'blah'
|
10
|
+
ch 'a'.ord
|
11
|
+
choice {
|
12
|
+
sequence {
|
13
|
+
token 'abc'
|
14
|
+
}
|
15
|
+
token 'def'
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
refute_nil parser
|
20
|
+
|
21
|
+
refute_nil parser.parse('blahaabcd')
|
22
|
+
refute_nil parser.parse('blahadefd')
|
23
|
+
assert_nil parser.parse('blahablad')
|
24
|
+
assert_nil parser.parse('blaha')
|
25
|
+
assert_nil parser.parse('blah')
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_builder_2
|
29
|
+
parser = Hammer::ParserBuilder.new
|
30
|
+
.token('Hello ')
|
31
|
+
.choice(Hammer::Parser.token('Mom'), Hammer::Parser.token('Dad'))
|
32
|
+
.token('!')
|
33
|
+
.build
|
34
|
+
|
35
|
+
refute_nil parser
|
36
|
+
refute_nil parser.parse('Hello Mom!')
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_builder_3
|
40
|
+
h = Hammer::Parser
|
41
|
+
parser = h.sequence(h.token('Hello '), h.choice(h.token('Mom'), h.token('Dad')), h.token('!'))
|
42
|
+
|
43
|
+
refute_nil parser
|
44
|
+
refute_nil parser.parse('Hello Mom!')
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_string_copied
|
48
|
+
s = 'blah'
|
49
|
+
parser = Hammer::Parser.token(s)
|
50
|
+
|
51
|
+
refute_equal s, 'BLAH'
|
52
|
+
assert_nil parser.parse('BLAH')
|
53
|
+
|
54
|
+
# parser still shouldn't match, even if we modify the string in-place
|
55
|
+
s.upcase!
|
56
|
+
assert_equal s, 'BLAH'
|
57
|
+
assert_nil parser.parse('BLAH')
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_indirect
|
61
|
+
x = nil
|
62
|
+
parser = Hammer::Parser.build {
|
63
|
+
token 'abc'
|
64
|
+
x = indirect
|
65
|
+
end_p
|
66
|
+
}
|
67
|
+
x.bind(Hammer::Parser.token('abd'))
|
68
|
+
|
69
|
+
assert_nil parser.parse('abcabdabd')
|
70
|
+
refute_nil parser.parse('abcabd')
|
71
|
+
assert_nil parser.parse('abdabd')
|
72
|
+
assert_nil parser.parse('abc')
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_multibyte_token
|
76
|
+
parser = Hammer::Parser.build {
|
77
|
+
token '今日'
|
78
|
+
token 'a'
|
79
|
+
end_p
|
80
|
+
}
|
81
|
+
|
82
|
+
refute_nil parser.parse('今日a')
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_token_encoding(encoding='UTF-8')
|
86
|
+
string = '今日'.encode(encoding)
|
87
|
+
parser = Hammer::Parser.token(string)
|
88
|
+
assert_equal string, parser.parse(string).ast.unmarshal
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_token_encoding_2
|
92
|
+
test_token_encoding('EUC-JP')
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
class AttrBoolTest < Minitest::Test
|
97
|
+
def setup
|
98
|
+
h = Hammer::Parser
|
99
|
+
@parser = h.attr_bool(h.many1(h.choice(h.ch('a'), h.ch('b')))) {|x|
|
100
|
+
data = x.unmarshal
|
101
|
+
data.length > 1 && data[0] == data[1]
|
102
|
+
}
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_1
|
106
|
+
assert_parse_ok @parser, "aa", ['a','a']
|
107
|
+
end
|
108
|
+
def test_2
|
109
|
+
assert_parse_ok @parser, "bb", ['b','b']
|
110
|
+
end
|
111
|
+
def test_3
|
112
|
+
refute_parse_ok @parser, "ab"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
class ActionTest < Minitest::Test
|
117
|
+
def setup
|
118
|
+
h = Hammer::Parser
|
119
|
+
@parser = h.action(h.sequence(h.choice(h.ch('a'), h.ch('A')),
|
120
|
+
h.choice(h.ch('b'), h.ch('B')))) {|x|
|
121
|
+
x.unmarshal.join(",")}
|
122
|
+
end
|
123
|
+
def test_1
|
124
|
+
assert_parse_ok @parser, "ab", "a,b"
|
125
|
+
end
|
126
|
+
def test_2
|
127
|
+
assert_parse_ok @parser, "AB", "A,B"
|
128
|
+
end
|
129
|
+
def test_3
|
130
|
+
refute_parse_ok @parser, "XX"
|
131
|
+
end
|
132
|
+
end
|
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hammer-parser
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Meredith L. Patterson
|
8
|
+
- TQ Hirsch
|
9
|
+
- Jakob Rath
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2016-11-06 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: ffi
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - "~>"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.9'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - "~>"
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '1.9'
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: docile
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - "~>"
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '1.1'
|
36
|
+
type: :runtime
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - "~>"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '1.1'
|
43
|
+
description: Ruby bindings to the hammer parsing library.
|
44
|
+
email: hammer@upstandinghackers.com
|
45
|
+
executables: []
|
46
|
+
extensions: []
|
47
|
+
extra_rdoc_files: []
|
48
|
+
files:
|
49
|
+
- README.md
|
50
|
+
- lib/hammer-parser.rb
|
51
|
+
- lib/hammer/internal.rb
|
52
|
+
- lib/hammer/parser.rb
|
53
|
+
- lib/hammer/parser_builder.rb
|
54
|
+
- lib/minitest/hamer-parser_plugin.rb
|
55
|
+
- test/autogen_test.rb
|
56
|
+
- test/parser_test.rb
|
57
|
+
homepage: https://github.com/UpstandingHackers/hammer
|
58
|
+
licenses:
|
59
|
+
- GPL-2.0
|
60
|
+
metadata: {}
|
61
|
+
post_install_message:
|
62
|
+
rdoc_options: []
|
63
|
+
require_paths:
|
64
|
+
- lib
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
requirements: []
|
76
|
+
rubyforge_project:
|
77
|
+
rubygems_version: 2.5.1
|
78
|
+
signing_key:
|
79
|
+
specification_version: 4
|
80
|
+
summary: Ruby bindings to the hammer parsing library.
|
81
|
+
test_files:
|
82
|
+
- test/autogen_test.rb
|
83
|
+
- test/parser_test.rb
|