citrus 2.3.7 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +9 -0
- data/Rakefile +1 -1
- data/citrus.gemspec +0 -1
- data/lib/citrus.rb +13 -0
- data/lib/citrus/file.rb +12 -11
- data/lib/citrus/grammars.rb +11 -0
- data/lib/citrus/version.rb +1 -1
- data/test/_files/rule4.citrus +5 -0
- data/test/grammar_test.rb +2 -1
- data/{examples → test/grammars}/calc_test.rb +3 -4
- data/{examples → test/grammars}/calc_test.rbc +0 -0
- data/{examples → test/grammars}/email_test.rb +3 -5
- data/{examples → test/grammars}/ipaddress_test.rb +2 -7
- data/{examples → test/grammars}/ipaddress_test.rbc +0 -0
- data/{examples → test/grammars}/ipv4address_test.rb +2 -7
- data/{examples → test/grammars}/ipv4address_test.rbc +0 -0
- data/{examples → test/grammars}/ipv6address_test.rb +2 -7
- data/{examples → test/grammars}/ipv6address_test.rbc +0 -0
- data/test/grammars/uri_test.rb +53 -0
- data/test/memoized_input_test.rbc +488 -5
- metadata +160 -161
- data/examples/calc.citrus +0 -82
- data/examples/email.citrus +0 -161
- data/examples/ipaddress.citrus +0 -16
- data/examples/ipv4address.citrus +0 -26
- data/examples/ipv6address.citrus +0 -43
metadata
CHANGED
@@ -1,34 +1,27 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: citrus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
segments:
|
6
|
-
- 2
|
7
|
-
- 3
|
8
|
-
- 7
|
9
|
-
version: 2.3.7
|
4
|
+
version: 2.4.0
|
10
5
|
platform: ruby
|
11
6
|
authors:
|
12
|
-
|
7
|
+
- Michael Jackson
|
13
8
|
autorequire:
|
14
9
|
bindir: bin
|
15
10
|
cert_chain: []
|
16
11
|
|
17
|
-
date: 2011-
|
12
|
+
date: 2011-05-11 00:00:00 -07:00
|
18
13
|
default_executable:
|
19
14
|
dependencies:
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
type: :development
|
31
|
-
version_requirements: *id001
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rake
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
32
25
|
description: Parsing Expressions for Ruby
|
33
26
|
email: mjijackson@gmail.com
|
34
27
|
executables: []
|
@@ -36,163 +29,169 @@ executables: []
|
|
36
29
|
extensions: []
|
37
30
|
|
38
31
|
extra_rdoc_files:
|
39
|
-
|
40
|
-
|
32
|
+
- README
|
33
|
+
- CHANGES
|
41
34
|
files:
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
- README
|
124
|
-
- CHANGES
|
35
|
+
- benchmark/after.dat
|
36
|
+
- benchmark/before.dat
|
37
|
+
- benchmark/seqpar.citrus
|
38
|
+
- benchmark/seqpar.gnuplot
|
39
|
+
- benchmark/seqpar.rb
|
40
|
+
- doc/background.markdown
|
41
|
+
- doc/example.markdown
|
42
|
+
- doc/extras.markdown
|
43
|
+
- doc/index.markdown
|
44
|
+
- doc/license.markdown
|
45
|
+
- doc/links.markdown
|
46
|
+
- doc/syntax.markdown
|
47
|
+
- doc/testing.markdown
|
48
|
+
- lib/citrus/file.rb
|
49
|
+
- lib/citrus/grammars.rb
|
50
|
+
- lib/citrus/version.rb
|
51
|
+
- lib/citrus.rb
|
52
|
+
- test/_files/alias.citrus
|
53
|
+
- test/_files/grammar1.citrus
|
54
|
+
- test/_files/grammar2.citrus
|
55
|
+
- test/_files/grammar3.citrus
|
56
|
+
- test/_files/rule1.citrus
|
57
|
+
- test/_files/rule2.citrus
|
58
|
+
- test/_files/rule3.citrus
|
59
|
+
- test/_files/rule4.citrus
|
60
|
+
- test/_files/super.citrus
|
61
|
+
- test/_files/super2.citrus
|
62
|
+
- test/alias_test.rb
|
63
|
+
- test/alias_test.rbc
|
64
|
+
- test/and_predicate_test.rb
|
65
|
+
- test/and_predicate_test.rbc
|
66
|
+
- test/but_predicate_test.rb
|
67
|
+
- test/but_predicate_test.rbc
|
68
|
+
- test/choice_test.rb
|
69
|
+
- test/choice_test.rbc
|
70
|
+
- test/extension_test.rb
|
71
|
+
- test/extension_test.rbc
|
72
|
+
- test/file_test.rb
|
73
|
+
- test/file_test.rbc
|
74
|
+
- test/grammar_test.rb
|
75
|
+
- test/grammar_test.rbc
|
76
|
+
- test/grammars/calc_test.rb
|
77
|
+
- test/grammars/calc_test.rbc
|
78
|
+
- test/grammars/email_test.rb
|
79
|
+
- test/grammars/ipaddress_test.rb
|
80
|
+
- test/grammars/ipaddress_test.rbc
|
81
|
+
- test/grammars/ipv4address_test.rb
|
82
|
+
- test/grammars/ipv4address_test.rbc
|
83
|
+
- test/grammars/ipv6address_test.rb
|
84
|
+
- test/grammars/ipv6address_test.rbc
|
85
|
+
- test/grammars/uri_test.rb
|
86
|
+
- test/helper.rb
|
87
|
+
- test/helper.rbc
|
88
|
+
- test/input_test.rb
|
89
|
+
- test/input_test.rbc
|
90
|
+
- test/label_test.rb
|
91
|
+
- test/label_test.rbc
|
92
|
+
- test/match_test.rb
|
93
|
+
- test/match_test.rbc
|
94
|
+
- test/memoized_input_test.rb
|
95
|
+
- test/memoized_input_test.rbc
|
96
|
+
- test/multibyte_test.rb
|
97
|
+
- test/multibyte_test.rbc
|
98
|
+
- test/not_predicate_test.rb
|
99
|
+
- test/not_predicate_test.rbc
|
100
|
+
- test/parse_error_test.rb
|
101
|
+
- test/parse_error_test.rbc
|
102
|
+
- test/repeat_test.rb
|
103
|
+
- test/repeat_test.rbc
|
104
|
+
- test/sequence_test.rb
|
105
|
+
- test/sequence_test.rbc
|
106
|
+
- test/string_terminal_test.rb
|
107
|
+
- test/string_terminal_test.rbc
|
108
|
+
- test/super_test.rb
|
109
|
+
- test/super_test.rbc
|
110
|
+
- test/terminal_test.rb
|
111
|
+
- test/terminal_test.rbc
|
112
|
+
- citrus.gemspec
|
113
|
+
- Rakefile
|
114
|
+
- README
|
115
|
+
- CHANGES
|
125
116
|
has_rdoc: true
|
126
117
|
homepage: http://mjijackson.com/citrus
|
127
118
|
licenses: []
|
128
119
|
|
129
120
|
post_install_message:
|
130
121
|
rdoc_options:
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
122
|
+
- --line-numbers
|
123
|
+
- --inline-source
|
124
|
+
- --title
|
125
|
+
- Citrus
|
126
|
+
- --main
|
127
|
+
- Citrus
|
137
128
|
require_paths:
|
138
|
-
|
129
|
+
- lib
|
139
130
|
required_ruby_version: !ruby/object:Gem::Requirement
|
140
131
|
requirements:
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
version: "0"
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: "0"
|
135
|
+
version:
|
146
136
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
137
|
requirements:
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
version: "0"
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: "0"
|
141
|
+
version:
|
153
142
|
requirements: []
|
154
143
|
|
155
144
|
rubyforge_project:
|
156
|
-
rubygems_version: 1.3.
|
145
|
+
rubygems_version: 1.3.5
|
157
146
|
signing_key:
|
158
147
|
specification_version: 3
|
159
148
|
summary: Parsing Expressions for Ruby
|
160
149
|
test_files:
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
150
|
+
- test/alias_test.rb
|
151
|
+
- test/alias_test.rbc
|
152
|
+
- test/and_predicate_test.rb
|
153
|
+
- test/and_predicate_test.rbc
|
154
|
+
- test/but_predicate_test.rb
|
155
|
+
- test/but_predicate_test.rbc
|
156
|
+
- test/choice_test.rb
|
157
|
+
- test/choice_test.rbc
|
158
|
+
- test/extension_test.rb
|
159
|
+
- test/extension_test.rbc
|
160
|
+
- test/file_test.rb
|
161
|
+
- test/file_test.rbc
|
162
|
+
- test/grammar_test.rb
|
163
|
+
- test/grammar_test.rbc
|
164
|
+
- test/grammars/calc_test.rb
|
165
|
+
- test/grammars/calc_test.rbc
|
166
|
+
- test/grammars/email_test.rb
|
167
|
+
- test/grammars/ipaddress_test.rb
|
168
|
+
- test/grammars/ipaddress_test.rbc
|
169
|
+
- test/grammars/ipv4address_test.rb
|
170
|
+
- test/grammars/ipv4address_test.rbc
|
171
|
+
- test/grammars/ipv6address_test.rb
|
172
|
+
- test/grammars/ipv6address_test.rbc
|
173
|
+
- test/grammars/uri_test.rb
|
174
|
+
- test/input_test.rb
|
175
|
+
- test/input_test.rbc
|
176
|
+
- test/label_test.rb
|
177
|
+
- test/label_test.rbc
|
178
|
+
- test/match_test.rb
|
179
|
+
- test/match_test.rbc
|
180
|
+
- test/memoized_input_test.rb
|
181
|
+
- test/memoized_input_test.rbc
|
182
|
+
- test/multibyte_test.rb
|
183
|
+
- test/multibyte_test.rbc
|
184
|
+
- test/not_predicate_test.rb
|
185
|
+
- test/not_predicate_test.rbc
|
186
|
+
- test/parse_error_test.rb
|
187
|
+
- test/parse_error_test.rbc
|
188
|
+
- test/repeat_test.rb
|
189
|
+
- test/repeat_test.rbc
|
190
|
+
- test/sequence_test.rb
|
191
|
+
- test/sequence_test.rbc
|
192
|
+
- test/string_terminal_test.rb
|
193
|
+
- test/string_terminal_test.rbc
|
194
|
+
- test/super_test.rb
|
195
|
+
- test/super_test.rbc
|
196
|
+
- test/terminal_test.rb
|
197
|
+
- test/terminal_test.rbc
|
data/examples/calc.citrus
DELETED
@@ -1,82 +0,0 @@
|
|
1
|
-
# A grammar for mathematical formulas that apply basic mathematical operations
|
2
|
-
# to all numbers, respecting operator precedence and grouping of expressions
|
3
|
-
# while ignoring whitespace. This grammar should provide the same interpretation
|
4
|
-
# as Ruby for all mathematical expressions.
|
5
|
-
grammar Calc
|
6
|
-
|
7
|
-
## Hierarchical syntax
|
8
|
-
|
9
|
-
rule term
|
10
|
-
additive | factor
|
11
|
-
end
|
12
|
-
|
13
|
-
rule additive
|
14
|
-
(factor operator:('+' | '-') space* term) {
|
15
|
-
factor.value.send(operator.to_s, term.value)
|
16
|
-
}
|
17
|
-
end
|
18
|
-
|
19
|
-
rule factor
|
20
|
-
multiplicative | prefix
|
21
|
-
end
|
22
|
-
|
23
|
-
rule multiplicative
|
24
|
-
(prefix operator:('*' | '/' | '%') space* factor) {
|
25
|
-
prefix.value.send(operator.to_s, factor.value)
|
26
|
-
}
|
27
|
-
end
|
28
|
-
|
29
|
-
rule prefix
|
30
|
-
prefixed | exponent
|
31
|
-
end
|
32
|
-
|
33
|
-
rule prefixed
|
34
|
-
(operator:('-' | '+' | '~') space* prefix) {
|
35
|
-
s = operator.to_s
|
36
|
-
s += '@' unless s == '~' # Unary + and - require an @.
|
37
|
-
prefix.value.send(s)
|
38
|
-
}
|
39
|
-
end
|
40
|
-
|
41
|
-
rule exponent
|
42
|
-
exponential | primary
|
43
|
-
end
|
44
|
-
|
45
|
-
rule exponential
|
46
|
-
(primary operator:'**' space* prefix) {
|
47
|
-
primary.value.send(operator.to_s, prefix.value)
|
48
|
-
}
|
49
|
-
end
|
50
|
-
|
51
|
-
rule primary
|
52
|
-
group | number
|
53
|
-
end
|
54
|
-
|
55
|
-
rule group
|
56
|
-
(lparen term rparen) {
|
57
|
-
term.value
|
58
|
-
}
|
59
|
-
end
|
60
|
-
|
61
|
-
## Lexical syntax
|
62
|
-
|
63
|
-
rule number
|
64
|
-
float | integer
|
65
|
-
end
|
66
|
-
|
67
|
-
rule float
|
68
|
-
(digits '.' digits space*) { to_f }
|
69
|
-
end
|
70
|
-
|
71
|
-
rule integer
|
72
|
-
(digits space*) { to_i }
|
73
|
-
end
|
74
|
-
|
75
|
-
rule digits
|
76
|
-
[0-9]+ ('_' [0-9]+)* # Numbers may contain underscores.
|
77
|
-
end
|
78
|
-
|
79
|
-
rule lparen '(' space* end
|
80
|
-
rule rparen ')' space* end
|
81
|
-
rule space [ \t\n\r] end
|
82
|
-
end
|
data/examples/email.citrus
DELETED
@@ -1,161 +0,0 @@
|
|
1
|
-
# A grammar for email addresses that closely conforms to RFC 5322, with the
|
2
|
-
# notable exception that this grammar does not allow for folding white space
|
3
|
-
# or comments within atoms.
|
4
|
-
grammar EmailAddress
|
5
|
-
root addr-spec
|
6
|
-
|
7
|
-
# ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
|
8
|
-
rule ALPHA
|
9
|
-
[A-Za-z]
|
10
|
-
end
|
11
|
-
|
12
|
-
# DIGIT = %x30-39
|
13
|
-
# ; 0-9
|
14
|
-
rule DIGIT
|
15
|
-
[0-9]
|
16
|
-
end
|
17
|
-
|
18
|
-
# DQUOTE = %x22
|
19
|
-
# ; " (Double Quote)
|
20
|
-
rule DQUOTE
|
21
|
-
'"'
|
22
|
-
end
|
23
|
-
|
24
|
-
# NO-WS-CTL = %d1-8 / ; US-ASCII control characters
|
25
|
-
# %d11 / ; that do not include the
|
26
|
-
# %d12 / ; carriage return, line feed,
|
27
|
-
# %d14-31 / ; and white space characters
|
28
|
-
# %d127
|
29
|
-
rule NO-WS-CTL
|
30
|
-
[\x01-\x08\x0B\x0C\x0E-\x1F\x7F]
|
31
|
-
end
|
32
|
-
|
33
|
-
# quoted-pair = ("\" text) / obs-qp
|
34
|
-
rule quoted-pair
|
35
|
-
("\\" text) | obs-qp
|
36
|
-
end
|
37
|
-
|
38
|
-
# atext = ALPHA / DIGIT / ; Printable US-ASCII
|
39
|
-
# "!" / "#" / ; characters not including
|
40
|
-
# "$" / "%" / ; specials. Used for atoms.
|
41
|
-
# "&" / "'" /
|
42
|
-
# "*" / "+" /
|
43
|
-
# "-" / "/" /
|
44
|
-
# "=" / "?" /
|
45
|
-
# "^" / "_" /
|
46
|
-
# "`" / "{" /
|
47
|
-
# "|" / "}" /
|
48
|
-
# "~"
|
49
|
-
rule atext
|
50
|
-
ALPHA | DIGIT | [!\#$\%&'*+-/=?^_`{|}~]
|
51
|
-
end
|
52
|
-
|
53
|
-
# atom = [CFWS] 1*atext [CFWS]
|
54
|
-
rule atom
|
55
|
-
atext 1*
|
56
|
-
end
|
57
|
-
|
58
|
-
# dot-atom-text = 1*atext *("." 1*atext)
|
59
|
-
rule dot-atom-text
|
60
|
-
atext 1* ("." atext 1*)*
|
61
|
-
end
|
62
|
-
|
63
|
-
# dot-atom = [CFWS] dot-atom-text [CFWS]
|
64
|
-
rule dot-atom
|
65
|
-
dot-atom-text
|
66
|
-
end
|
67
|
-
|
68
|
-
# qtext = %d33 / ; Printable US-ASCII
|
69
|
-
# %d35-91 / ; characters not including
|
70
|
-
# %d93-126 / ; "\" or the quote character
|
71
|
-
# obs-qtext
|
72
|
-
rule qtext
|
73
|
-
[\x21\x23-\x5B\x5D-\x7E] | obs-qtext
|
74
|
-
end
|
75
|
-
|
76
|
-
# qcontent = qtext / quoted-pair
|
77
|
-
rule qcontent
|
78
|
-
qtext | quoted-pair
|
79
|
-
end
|
80
|
-
|
81
|
-
# quoted-string = [CFWS]
|
82
|
-
# DQUOTE *([FWS] qcontent) [FWS] DQUOTE
|
83
|
-
# [CFWS]
|
84
|
-
rule quoted-string
|
85
|
-
'"' qcontent* '"'
|
86
|
-
end
|
87
|
-
|
88
|
-
# word = atom / quoted-string
|
89
|
-
rule word
|
90
|
-
atom | quoted-string
|
91
|
-
end
|
92
|
-
|
93
|
-
# addr-spec = local-part "@" domain
|
94
|
-
rule addr-spec
|
95
|
-
local-part "@" domain
|
96
|
-
end
|
97
|
-
|
98
|
-
# local-part = dot-atom / quoted-string / obs-local-part
|
99
|
-
rule local-part
|
100
|
-
dot-atom | quoted-string | obs-local-part
|
101
|
-
end
|
102
|
-
|
103
|
-
# domain = dot-atom / domain-literal / obs-domain
|
104
|
-
rule domain
|
105
|
-
dot-atom | domain-literal | obs-domain
|
106
|
-
end
|
107
|
-
|
108
|
-
# domain-literal = [CFWS] "[" *([FWS] dcontent) [FWS] "]" [CFWS]
|
109
|
-
rule domain-literal
|
110
|
-
"[" dtext* "]"
|
111
|
-
end
|
112
|
-
|
113
|
-
# dtext = %d33-90 / ; Printable US-ASCII
|
114
|
-
# %d94-126 / ; characters not including
|
115
|
-
# obs-dtext ; "[", "]", or "\"
|
116
|
-
rule dtext
|
117
|
-
[\x21-\x5A\x5E-\x7E] | obs-dtext
|
118
|
-
end
|
119
|
-
|
120
|
-
# text = %d1-9 / ; Characters excluding CR
|
121
|
-
# %d11 / ; and LF
|
122
|
-
# %d12 /
|
123
|
-
# %d14-127
|
124
|
-
rule text
|
125
|
-
[\x01-\x09\x0B\x0C\x0E-\x7F]
|
126
|
-
end
|
127
|
-
|
128
|
-
# obs-NO-WS-CTL = %d1-8 / ; US-ASCII control
|
129
|
-
# %d11 / ; characters that do not
|
130
|
-
# %d12 / ; include the carriage
|
131
|
-
# %d14-31 / ; return, line feed, and
|
132
|
-
# %d127 ; white space characters
|
133
|
-
rule obs-NO-WS-CTL
|
134
|
-
[\x01-\x08\x0B\x0C\x0E-\x1F\x7F]
|
135
|
-
end
|
136
|
-
|
137
|
-
# obs-qtext = obs-NO-WS-CTL
|
138
|
-
rule obs-qtext
|
139
|
-
obs-NO-WS-CTL
|
140
|
-
end
|
141
|
-
|
142
|
-
# obs-qp = "\" (%d0 / obs-NO-WS-CTL / LF / CR)
|
143
|
-
rule obs-qp
|
144
|
-
"\\" ("\x00" | obs-NO-WS-CTL | "\n" | "\r")
|
145
|
-
end
|
146
|
-
|
147
|
-
# obs-local-part = word *("." word)
|
148
|
-
rule obs-local-part
|
149
|
-
word ("." word)*
|
150
|
-
end
|
151
|
-
|
152
|
-
# obs-domain = atom *("." atom)
|
153
|
-
rule obs-domain
|
154
|
-
atom ("." atom)*
|
155
|
-
end
|
156
|
-
|
157
|
-
# obs-dtext = obs-NO-WS-CTL / quoted-pair
|
158
|
-
rule obs-dtext
|
159
|
-
obs-NO-WS-CTL | quoted-pair
|
160
|
-
end
|
161
|
-
end
|