fortio-namelist 1.0.0 → 1.1.0
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 +4 -4
- data/NOTE.md +29 -0
- data/README.md +105 -23
- data/fortio-namelist.gemspec +2 -2
- data/lib/fortio-namelist/fortran_namelist.rb +41 -30
- data/lib/fortio-namelist/fortran_namelist.tab.rb +229 -217
- data/lib/fortio-namelist/fortran_namelist.y +87 -60
- data/spec/array_spec.rb +160 -0
- data/spec/empty_spec.rb +65 -0
- data/spec/identifier_spec.rb +81 -0
- data/spec/scalar_spec.rb +196 -0
- data/spec/structure_spec.rb +138 -0
- metadata +10 -4
@@ -14,91 +14,98 @@
|
|
14
14
|
|
15
15
|
class FortIO::Namelist::Parser
|
16
16
|
|
17
|
-
prechigh
|
18
|
-
nonassoc COMMA
|
19
|
-
nonassoc NL
|
20
|
-
left ','
|
21
|
-
left '='
|
22
|
-
preclow
|
23
|
-
|
24
17
|
rule
|
25
18
|
|
26
|
-
namelist_all :
|
27
|
-
| namelist
|
28
|
-
| namelist namelist_all
|
29
|
-
|
30
19
|
namelist :
|
31
|
-
|
20
|
+
namelist group
|
21
|
+
| group
|
22
|
+
|
23
|
+
group :
|
24
|
+
group_header separator varlist separator group_end
|
25
|
+
{ @root[val[0]] = val[2]; @scan.in_namelist = nil }
|
26
|
+
| group_header separator group_end
|
32
27
|
{ @root[val[0]] = []; @scan.in_namelist = nil }
|
33
|
-
| header paramlist tailer
|
34
|
-
{ @root[val[0]] = val[1]; @scan.in_namelist = nil }
|
35
28
|
|
36
|
-
|
29
|
+
group_prefix :
|
30
|
+
'&'
|
37
31
|
| '$'
|
38
32
|
|
39
|
-
|
40
|
-
|
41
|
-
|
33
|
+
group_header :
|
34
|
+
group_prefix IDENT
|
35
|
+
{ result = val[1].downcase; @scan.in_namelist = val[1].downcase }
|
42
36
|
|
43
|
-
|
44
|
-
|
45
|
-
|
|
37
|
+
separator:
|
38
|
+
COMMA
|
39
|
+
| nls
|
40
|
+
| blank
|
46
41
|
|
47
|
-
|
48
|
-
|
42
|
+
nls :
|
43
|
+
NL
|
44
|
+
| nls NL
|
45
|
+
|
46
|
+
blank:
|
49
47
|
|
50
|
-
|
51
|
-
|
52
|
-
|
|
53
|
-
{
|
54
|
-
| paramlist separator
|
55
|
-
{ result = val[0] }
|
48
|
+
group_end :
|
49
|
+
'/'
|
50
|
+
| group_prefix IDENT
|
51
|
+
{ raise Racc::ParseError, "\nparse error (&)" unless val[1] =~ /\Aend\Z/i }
|
56
52
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
53
|
+
varlist:
|
54
|
+
vardef { result = [val[0]] }
|
55
|
+
| varlist separator vardef
|
56
|
+
{ result = val[0] + [val[2]] }
|
57
|
+
|
58
|
+
vardef:
|
59
|
+
IDENT '=' COMMA
|
61
60
|
{ result = ParamDef.new(val[0].downcase, nil, "") }
|
62
61
|
| IDENT '=' rvalues
|
63
62
|
{ result = ParamDef.new(val[0].downcase, nil, val[2]) }
|
63
|
+
| IDENT '=' nls rvalues
|
64
|
+
{ result = ParamDef.new(val[0].downcase, nil, val[3]) }
|
64
65
|
| IDENT '(' array_spec ')' '=' rvalues
|
65
66
|
{ result = ParamDef.new(val[0].downcase, val[2], val[5]) }
|
66
67
|
|
67
|
-
rvalues :
|
68
|
-
|
69
|
-
|
|
68
|
+
rvalues :
|
69
|
+
rlist
|
70
|
+
| ident_list
|
71
|
+
|
72
|
+
rlist :
|
73
|
+
element
|
74
|
+
| NIL { result = [nil, nil] }
|
75
|
+
| rlist element
|
70
76
|
{ result = val[0] + val[1] }
|
71
|
-
|
|
72
|
-
{ result = val[0] + val[2] }
|
73
|
-
| rvalues NL abbreb
|
77
|
+
| rlist ',' element
|
74
78
|
{ result = val[0] + val[2] }
|
75
|
-
|
|
79
|
+
| rlist NIL
|
76
80
|
{ result = val[0] + [nil] }
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
{ result = [nil] + val[1] }
|
81
|
-
| rvalues NL
|
82
|
-
{ result = val[0] }
|
83
|
-
| IDENT
|
84
|
-
{ result = val[0] }
|
85
|
-
|
86
|
-
abbreb :
|
87
|
-
constant { result = [val[0]] }
|
81
|
+
|
82
|
+
element :
|
83
|
+
constant { result = [val[0]] }
|
88
84
|
| DIGITS '*' constant
|
89
|
-
|
85
|
+
{ result = [val[2]] * val[0] }
|
90
86
|
|
91
87
|
constant :
|
92
88
|
STRING
|
93
89
|
| LOGICAL
|
94
|
-
|
|
95
|
-
| FLOAT
|
90
|
+
| real
|
96
91
|
| complex
|
97
92
|
|
98
|
-
real :
|
93
|
+
real :
|
94
|
+
DIGITS
|
99
95
|
| FLOAT
|
100
96
|
|
101
|
-
complex :
|
97
|
+
complex :
|
98
|
+
'(' real ',' real ')'
|
99
|
+
{ result = Complex(val[1],val[3]) }
|
100
|
+
|
101
|
+
ident_list :
|
102
|
+
IDENT { result = [val[0]] }
|
103
|
+
| STRINGLIKE
|
104
|
+
{ result = [val[0]] }
|
105
|
+
| ident_list ',' IDENT
|
106
|
+
{ result = val[0] + [val[2]]}
|
107
|
+
| ident_list ',' STRINGLIKE
|
108
|
+
{ result = val[0] + [val[2]]}
|
102
109
|
|
103
110
|
array_spec :
|
104
111
|
DIGITS { result = [val[0]-1] }
|
@@ -184,6 +191,21 @@ module FortIO::Namelist
|
|
184
191
|
end
|
185
192
|
else
|
186
193
|
case
|
194
|
+
when @s.scan(/\A\(/)
|
195
|
+
return [
|
196
|
+
'(',
|
197
|
+
nil
|
198
|
+
]
|
199
|
+
when @s.scan(/\A\)/)
|
200
|
+
return [
|
201
|
+
')',
|
202
|
+
nil
|
203
|
+
]
|
204
|
+
when @s.scan(/\A\:/)
|
205
|
+
return [
|
206
|
+
':',
|
207
|
+
nil
|
208
|
+
]
|
187
209
|
when @s.scan(/\A[+-]?(\d+)\.(\d+)?([ED][+-]?(\d+))?/i) ### float
|
188
210
|
return [ ### 1.2E+3, 1.E+3, 1.2E3
|
189
211
|
:FLOAT, ### 1.2, 1.
|
@@ -199,9 +221,9 @@ module FortIO::Namelist
|
|
199
221
|
:FLOAT,
|
200
222
|
@s[0].sub(/D/i,'e').to_f
|
201
223
|
]
|
202
|
-
when @s.scan(/\A\d+[a-z_]\w*/i) ### STRING
|
224
|
+
when @s.scan(/\A\d+[a-z_]\w*/i) ### STRING-Like
|
203
225
|
return [
|
204
|
-
:
|
226
|
+
:STRINGLIKE,
|
205
227
|
@s[0]
|
206
228
|
]
|
207
229
|
when @s.scan(/\A[\-\+]?\d+/) ### digits
|
@@ -229,6 +251,11 @@ module FortIO::Namelist
|
|
229
251
|
',',
|
230
252
|
nil
|
231
253
|
]
|
254
|
+
elsif @s.match?(/\A[a-z]\w*\s*,/i)
|
255
|
+
return [
|
256
|
+
',',
|
257
|
+
nil
|
258
|
+
]
|
232
259
|
elsif @s.match?(/\A[a-z]\w*/i) or @s.match?(/\A[\&\$\/\!]/)
|
233
260
|
return [
|
234
261
|
:COMMA,
|
@@ -252,9 +279,9 @@ module FortIO::Namelist
|
|
252
279
|
@s[0],
|
253
280
|
nil
|
254
281
|
]
|
255
|
-
when @s.scan(/\A_\w*/i) ### STRING
|
282
|
+
when @s.scan(/\A_\w*/i) ### STRING-Like
|
256
283
|
return [
|
257
|
-
:
|
284
|
+
:STRINGLIKE,
|
258
285
|
@s[0]
|
259
286
|
]
|
260
287
|
when @s.scan(/\A\.t.*?\./i) ### LOGICAL true
|
data/spec/array_spec.rb
ADDED
@@ -0,0 +1,160 @@
|
|
1
|
+
require "fortio-namelist"
|
2
|
+
require "rspec-power_assert"
|
3
|
+
|
4
|
+
describe FortIO::Namelist do
|
5
|
+
|
6
|
+
example "array stream" do
|
7
|
+
input = %{
|
8
|
+
&example
|
9
|
+
v1 = 1,2,3,4,5,
|
10
|
+
v2 = 6,7,8,9,10,
|
11
|
+
/
|
12
|
+
}
|
13
|
+
nml = FortIO::Namelist.read(input)
|
14
|
+
is_asserted_by { nml.has_key? "example" }
|
15
|
+
is_asserted_by { nml["example"].is_a? Hash }
|
16
|
+
is_asserted_by { nml["example"]["v1"] == [1,2,3,4,5] }
|
17
|
+
is_asserted_by { nml["example"]["v2"] == [6,7,8,9,10] }
|
18
|
+
end
|
19
|
+
|
20
|
+
example "array sequence" do
|
21
|
+
input = %{
|
22
|
+
&example v1 = 1,2,3,4,5, v2 = 6,7,8,9,10, /
|
23
|
+
}
|
24
|
+
nml = FortIO::Namelist.read(input)
|
25
|
+
is_asserted_by { nml.has_key? "example" }
|
26
|
+
is_asserted_by { nml["example"].is_a? Hash }
|
27
|
+
is_asserted_by { nml["example"]["v1"] == [1,2,3,4,5] }
|
28
|
+
is_asserted_by { nml["example"]["v2"] == [6,7,8,9,10] }
|
29
|
+
end
|
30
|
+
|
31
|
+
example "array index" do
|
32
|
+
input = %{
|
33
|
+
&example
|
34
|
+
v1(1) = 1
|
35
|
+
v1(2) = 2
|
36
|
+
v1(3) = 3
|
37
|
+
v1(4) = 4
|
38
|
+
v1(5) = 5
|
39
|
+
v2(1:2) = 6,7
|
40
|
+
v2(3:5) = 8,9,10,
|
41
|
+
/
|
42
|
+
}
|
43
|
+
nml = FortIO::Namelist.read(input)
|
44
|
+
is_asserted_by { nml.has_key? "example" }
|
45
|
+
is_asserted_by { nml["example"].is_a? Hash }
|
46
|
+
is_asserted_by { nml["example"]["v1"] == [1,2,3,4,5] }
|
47
|
+
is_asserted_by { nml["example"]["v2"] == [6,7,8,9,10] }
|
48
|
+
end
|
49
|
+
|
50
|
+
example "array partial" do
|
51
|
+
input = %{
|
52
|
+
&example
|
53
|
+
v1(2) = 2
|
54
|
+
v1(5) = 5
|
55
|
+
v2(3:5) = 8,9,10,
|
56
|
+
/
|
57
|
+
}
|
58
|
+
nml = FortIO::Namelist.read(input)
|
59
|
+
is_asserted_by { nml.has_key? "example" }
|
60
|
+
is_asserted_by { nml["example"].is_a? Hash }
|
61
|
+
is_asserted_by { nml["example"]["v1"] == [nil,2,nil,nil,5] }
|
62
|
+
is_asserted_by { nml["example"]["v2"] == [nil,nil,8,9,10] }
|
63
|
+
end
|
64
|
+
|
65
|
+
example "array extend" do
|
66
|
+
input = %{
|
67
|
+
&example
|
68
|
+
v1(2) = 2,3,4,5
|
69
|
+
/
|
70
|
+
}
|
71
|
+
nml = FortIO::Namelist.read(input)
|
72
|
+
is_asserted_by { nml.has_key? "example" }
|
73
|
+
is_asserted_by { nml["example"].is_a? Hash }
|
74
|
+
is_asserted_by { nml["example"]["v1"] == [nil,2,3,4,5] }
|
75
|
+
end
|
76
|
+
|
77
|
+
example "array reputation" do
|
78
|
+
input = %{
|
79
|
+
&example
|
80
|
+
v1(1:5) = 2,4*2
|
81
|
+
v2(2) = 4*2
|
82
|
+
v3 = 5*.true.
|
83
|
+
v4 = 5 * f
|
84
|
+
/
|
85
|
+
}
|
86
|
+
nml = FortIO::Namelist.read(input)
|
87
|
+
is_asserted_by { nml.has_key? "example" }
|
88
|
+
is_asserted_by { nml["example"].is_a? Hash }
|
89
|
+
is_asserted_by { nml["example"]["v1"] == [2,2,2,2,2] }
|
90
|
+
is_asserted_by { nml["example"]["v2"] == [nil,2,2,2,2] }
|
91
|
+
is_asserted_by { nml["example"]["v3"] == [true]*5 }
|
92
|
+
is_asserted_by { nml["example"]["v4"] == [false]*5 }
|
93
|
+
end
|
94
|
+
|
95
|
+
example "array of string" do
|
96
|
+
input = %{
|
97
|
+
&example
|
98
|
+
v1 = "a",'b',"c"
|
99
|
+
/
|
100
|
+
}
|
101
|
+
nml = FortIO::Namelist.read(input)
|
102
|
+
is_asserted_by { nml.has_key? "example" }
|
103
|
+
is_asserted_by { nml["example"].is_a? Hash }
|
104
|
+
is_asserted_by { nml["example"]["v1"] == ["a","b","c"] }
|
105
|
+
end
|
106
|
+
|
107
|
+
example "array of identifier" do
|
108
|
+
input = %{
|
109
|
+
&example
|
110
|
+
v1 = a, b, c
|
111
|
+
/
|
112
|
+
}
|
113
|
+
expect { FortIO::Namelist.read(input) }.to raise_error(RuntimeError)
|
114
|
+
end
|
115
|
+
|
116
|
+
example "array of identifier 2" do
|
117
|
+
input = %{
|
118
|
+
&example
|
119
|
+
v1 = a, 0_b, _c
|
120
|
+
/
|
121
|
+
}
|
122
|
+
nml = FortIO::Namelist.read(input)
|
123
|
+
is_asserted_by { nml.has_key? "example" }
|
124
|
+
is_asserted_by { nml["example"].is_a? Hash }
|
125
|
+
is_asserted_by { nml["example"]["v1"] == ["a","0_b","_c"] }
|
126
|
+
end
|
127
|
+
|
128
|
+
example "don't permit to mix identifier and string in array stream" do
|
129
|
+
input = %{
|
130
|
+
&example
|
131
|
+
v1 = "a", b, "c"
|
132
|
+
/
|
133
|
+
}
|
134
|
+
expect { FortIO::Namelist.read(input) }.to raise_error(RuntimeError)
|
135
|
+
end
|
136
|
+
|
137
|
+
example "don't permit to mix identifier and string in array stream 2" do
|
138
|
+
input = %{
|
139
|
+
&example
|
140
|
+
v1 = a, "b", c
|
141
|
+
/
|
142
|
+
}
|
143
|
+
expect { FortIO::Namelist.read(input) }.to raise_error(RuntimeError)
|
144
|
+
end
|
145
|
+
|
146
|
+
example "empty element" do
|
147
|
+
input = %{
|
148
|
+
&example
|
149
|
+
v1 = , , 3, , 5,
|
150
|
+
v2 = , , 3, , 5
|
151
|
+
/
|
152
|
+
}
|
153
|
+
nml = FortIO::Namelist.read(input)
|
154
|
+
is_asserted_by { nml.has_key? "example" }
|
155
|
+
is_asserted_by { nml["example"].is_a? Hash }
|
156
|
+
is_asserted_by { nml["example"]["v1"] == [nil, nil, 3, nil, 5] }
|
157
|
+
is_asserted_by { nml["example"]["v2"] == [nil, nil, 3, nil, 5] }
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|
data/spec/empty_spec.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
require "fortio-namelist"
|
2
|
+
require "rspec-power_assert"
|
3
|
+
|
4
|
+
describe FortIO::Namelist do
|
5
|
+
|
6
|
+
example "namelist prefix &" do
|
7
|
+
input = %{
|
8
|
+
&example
|
9
|
+
&end
|
10
|
+
}
|
11
|
+
nml = FortIO::Namelist.read(input)
|
12
|
+
is_asserted_by { nml.has_key? "example" }
|
13
|
+
is_asserted_by { nml["example"].is_a? Hash }
|
14
|
+
is_asserted_by { nml["example"].empty? }
|
15
|
+
end
|
16
|
+
|
17
|
+
example "namelist prefix $" do
|
18
|
+
input = %{
|
19
|
+
$example
|
20
|
+
$end
|
21
|
+
}
|
22
|
+
nml = FortIO::Namelist.read(input)
|
23
|
+
is_asserted_by { nml.has_key? "example" }
|
24
|
+
end
|
25
|
+
|
26
|
+
example "end with /" do
|
27
|
+
input = %{
|
28
|
+
&example
|
29
|
+
/
|
30
|
+
}
|
31
|
+
nml = FortIO::Namelist.read(input)
|
32
|
+
is_asserted_by { nml.has_key? "example" }
|
33
|
+
end
|
34
|
+
|
35
|
+
example "only comment" do
|
36
|
+
input = %{
|
37
|
+
&example
|
38
|
+
! this is comment
|
39
|
+
/
|
40
|
+
}
|
41
|
+
nml = FortIO::Namelist.read(input)
|
42
|
+
is_asserted_by { nml.has_key? "example" }
|
43
|
+
end
|
44
|
+
|
45
|
+
example "only newlines" do
|
46
|
+
input = %{
|
47
|
+
&example
|
48
|
+
|
49
|
+
|
50
|
+
/
|
51
|
+
}
|
52
|
+
nml = FortIO::Namelist.read(input)
|
53
|
+
is_asserted_by { nml.has_key? "example" }
|
54
|
+
end
|
55
|
+
|
56
|
+
example "one line" do
|
57
|
+
input = %{
|
58
|
+
&example /
|
59
|
+
}
|
60
|
+
nml = FortIO::Namelist.read(input)
|
61
|
+
is_asserted_by { nml.has_key? "example" }
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require "fortio-namelist"
|
2
|
+
require "rspec-power_assert"
|
3
|
+
|
4
|
+
describe FortIO::Namelist do
|
5
|
+
|
6
|
+
example "only letter" do
|
7
|
+
input = %{
|
8
|
+
&example
|
9
|
+
a = 1
|
10
|
+
ab = 1
|
11
|
+
abc = 1
|
12
|
+
/
|
13
|
+
}
|
14
|
+
nml = FortIO::Namelist.read(input)
|
15
|
+
is_asserted_by { nml.has_key? "example" }
|
16
|
+
is_asserted_by { nml["example"].is_a? Hash }
|
17
|
+
is_asserted_by { nml["example"].keys.size == 3 }
|
18
|
+
is_asserted_by { nml["example"].keys == ["a","ab","abc"] }
|
19
|
+
end
|
20
|
+
|
21
|
+
example "letter number" do
|
22
|
+
input = %{
|
23
|
+
&example
|
24
|
+
a1 = 1
|
25
|
+
ab12 = 1
|
26
|
+
abc123 = 1
|
27
|
+
/
|
28
|
+
}
|
29
|
+
nml = FortIO::Namelist.read(input)
|
30
|
+
is_asserted_by { nml.has_key? "example" }
|
31
|
+
is_asserted_by { nml["example"].is_a? Hash }
|
32
|
+
is_asserted_by { nml["example"].keys.size == 3 }
|
33
|
+
is_asserted_by { nml["example"].keys == ["a1","ab12","abc123"] }
|
34
|
+
end
|
35
|
+
|
36
|
+
example "leter number underbar" do
|
37
|
+
input = %{
|
38
|
+
&example
|
39
|
+
a_1 = 1
|
40
|
+
ab_12 = 1
|
41
|
+
abc_123 = 1
|
42
|
+
/
|
43
|
+
}
|
44
|
+
nml = FortIO::Namelist.read(input)
|
45
|
+
is_asserted_by { nml.has_key? "example" }
|
46
|
+
is_asserted_by { nml["example"].is_a? Hash }
|
47
|
+
is_asserted_by { nml["example"].keys.size == 3 }
|
48
|
+
is_asserted_by { nml["example"].keys == ["a_1","ab_12","abc_123"] }
|
49
|
+
end
|
50
|
+
|
51
|
+
example "can't start with number" do
|
52
|
+
input = %{
|
53
|
+
&example
|
54
|
+
1a = 1
|
55
|
+
/
|
56
|
+
}
|
57
|
+
expect { FortIO::Namelist.read(input) }.to raise_error(RuntimeError)
|
58
|
+
end
|
59
|
+
|
60
|
+
example "can't start with underscore" do
|
61
|
+
input = %{
|
62
|
+
&example
|
63
|
+
_a = 1
|
64
|
+
/
|
65
|
+
}
|
66
|
+
expect { FortIO::Namelist.read(input) }.to raise_error(RuntimeError)
|
67
|
+
end
|
68
|
+
|
69
|
+
example "t and f can be used as indentifier" do
|
70
|
+
input = %{
|
71
|
+
&example
|
72
|
+
t = 1
|
73
|
+
f = 2
|
74
|
+
/
|
75
|
+
}
|
76
|
+
nml = FortIO::Namelist.read(input)
|
77
|
+
is_asserted_by { nml["example"]["t"] = 1 }
|
78
|
+
is_asserted_by { nml["example"]["f"] = 2 }
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|