入力行をスキャンし, 次のトークンを返します. トークンの種類には演算子, 数値, テキストがあります.
174 implicit none
175 integer, intent(out):: tokentype
176 integer, intent(out):: ivalue(5)
177 real(DP), intent(out):: dvalue
178 character(*), intent(out):: cvalue
179 integer:: iend, istr, ilen, ios
180 ivalue = 0
181 dvalue = 0.0_dp
182 cvalue = ""
183 iend = len_trim(thisline)
184 do
185 if (i > iend) exit
186
187 call match(
"^##", thisline(i:), istr, ilen)
188 if (istr > 0) then
189 i = iend + 1
190 tokentype = s_eof
191 return
192 endif
193
194 call match(
"^#s+", thisline(i:), istr, ilen)
195 if (istr > 0) then
196 i = i + ilen
197 if (i > iend) exit
198 endif
199
200 call match(
"^@", thisline(i:), istr, ilen)
201 if (istr <= 0)
call match(
"^from", thisline(i:), istr, ilen)
202 if (istr <= 0)
call match(
"^at", thisline(i:), istr, ilen)
203 if (istr > 0) then
204 i = i + ilen
205 tokentype = s_shift
206 cvalue = thisline(i: i+ilen-1)
207 return
208 endif
209
210 call match(
"^#a#w*#a", thisline(i:), istr, ilen)
211 if (istr <= 0)
call match(
"^[#a'""]", thisline(i:), istr, ilen)
212 if (istr > 0) then
213 tokentype = s_text
214 cvalue = thisline(i: i+ilen-1)
215 i = i + ilen
216 return
217 endif
218
219 call match(
"^#^", thisline(i:), istr, ilen)
220 if (istr <= 0)
call match(
"^#*#*", thisline(i:), istr, ilen)
221 if (istr > 0) then
222 tokentype = s_exponent
223 cvalue = thisline(i: i+ilen-1)
224 i = i + ilen
225 return
226 endif
227
228 call match(
"^#.[^#d]", thisline(i:), istr, ilen)
229 if (istr <= 0)
call match(
"^#*", thisline(i:), istr, ilen)
230 if (istr > 0) then
231 tokentype = s_multiply
232 cvalue = thisline(i: i+ilen-1)
233 i = i + 1
234 return
235 endif
236
237 call match(
"^[-+]?#d*#.#d*[EeDd][-+]?#d+", thisline(i:), istr, ilen)
238 if (istr <= 0)
call match(
"^[-+]?#d*#.#d*", thisline(i:), istr, ilen)
239 if (istr > 0) then
240 read(thisline(i: i+ilen-1), fmt=*, &
241 & iostat=ios) dvalue
242 if (ios /= 0) dvalue = huge(dvalue)
243 cvalue = thisline(i: i+ilen-1)
244 tokentype = s_real
245 i = i + ilen
246 return
247 endif
248
249 call match(
"^[-+]?#d+", thisline(i:), istr, ilen)
250 if (istr > 0) then
251 read(thisline(i: i+ilen-1), fmt=*, &
252 & iostat=ios) ivalue(1)
253 if (ios /= 0) ivalue(1) = huge(1)
254 cvalue = thisline(i: i+ilen-1)
255 tokentype = s_integer
256 i = i + ilen
257 return
258 endif
259
260 if (thisline(i:i) == '/') then
261 tokentype = s_divide
262 cvalue = thisline(i:i)
263 i = i + 1
264 return
265 endif
266 if (thisline(i:i) == '(') then
267 tokentype = s_openpar
268 cvalue = thisline(i:i)
269 i = i + 1
270 return
271 endif
272 if (thisline(i:i) == ')') then
273 tokentype = s_closepar
274 cvalue = thisline(i:i)
275 i = i + 1
276 return
277 endif
278
279 tokentype = ichar(thisline(i:i))
280 cvalue = thisline(i:i)
281 i = i + 1
282 return
283 enddo
284 i = iend + 1
285 tokentype = s_eof
286 cvalue = ""
シンプルな正規表現関数 'match' を提供します.
subroutine, public match(pattern, text, start, length)