55 implicit none
56 integer, intent(out):: tokentype
57 integer, intent(out):: ivalue(5)
58 real(DP), intent(out):: dvalue
59 character(*), intent(out):: cvalue
60 integer:: iend, istr, ilen, ios
61 ivalue = 0
62 dvalue = 0.0_dp
63 cvalue = ""
64 iend = len_trim(thisline)
65 do
66 if (i > iend) exit
67
68 call match(
"^##", thisline(i:), istr, ilen)
69 if (istr > 0) then
70 i = iend + 1
71 tokentype = s_eof
72 return
73 endif
74
75 call match(
"^#s+", thisline(i:), istr, ilen)
76 if (istr > 0) then
77 i = i + ilen
78 if (i > iend) exit
79 endif
80
81 call match(
"^@", thisline(i:), istr, ilen)
82 if (istr <= 0)
call match(
"^from", thisline(i:), istr, ilen)
83 if (istr <= 0)
call match(
"^at", thisline(i:), istr, ilen)
84 if (istr > 0) then
85 i = i + ilen
86 tokentype = s_shift
87 cvalue = thisline(i: i+ilen-1)
88 return
89 endif
90
91 call match(
"^#a#w*#a", thisline(i:), istr, ilen)
92 if (istr <= 0)
call match(
"^[#a'""]", thisline(i:), istr, ilen)
93 if (istr > 0) then
94 tokentype = s_text
95 cvalue = thisline(i: i+ilen-1)
96 i = i + ilen
97 return
98 endif
99
100 call match(
"^#^", thisline(i:), istr, ilen)
101 if (istr <= 0)
call match(
"^#*#*", thisline(i:), istr, ilen)
102 if (istr > 0) then
103 tokentype = s_exponent
104 cvalue = thisline(i: i+ilen-1)
105 i = i + ilen
106 return
107 endif
108
109 call match(
"^#.[^#d]", thisline(i:), istr, ilen)
110 if (istr <= 0)
call match(
"^#*", thisline(i:), istr, ilen)
111 if (istr > 0) then
112 tokentype = s_multiply
113 cvalue = thisline(i: i+ilen-1)
114 i = i + 1
115 return
116 endif
117
118 call match(
"^[-+]?#d*#.#d*[EeDd][-+]?#d+", thisline(i:), istr, ilen)
119 if (istr <= 0)
call match(
"^[-+]?#d*#.#d*", thisline(i:), istr, ilen)
120 if (istr > 0) then
121 read(thisline(i: i+ilen-1), fmt=*, &
122 & iostat=ios) dvalue
123 if (ios /= 0) dvalue = huge(dvalue)
124 cvalue = thisline(i: i+ilen-1)
125 tokentype = s_real
126 i = i + ilen
127 return
128 endif
129
130 call match(
"^[-+]?#d+", thisline(i:), istr, ilen)
131 if (istr > 0) then
132 read(thisline(i: i+ilen-1), fmt=*, &
133 & iostat=ios) ivalue(1)
134 if (ios /= 0) ivalue(1) = huge(1)
135 cvalue = thisline(i: i+ilen-1)
136 tokentype = s_integer
137 i = i + ilen
138 return
139 endif
140
141 if (thisline(i:i) == '/') then
142 tokentype = s_divide
143 cvalue = thisline(i:i)
144 i = i + 1
145 return
146 endif
147 if (thisline(i:i) == '(') then
148 tokentype = s_openpar
149 cvalue = thisline(i:i)
150 i = i + 1
151 return
152 endif
153 if (thisline(i:i) == ')') then
154 tokentype = s_closepar
155 cvalue = thisline(i:i)
156 i = i + 1
157 return
158 endif
159
160 tokentype = ichar(thisline(i:i))
161 cvalue = thisline(i:i)
162 i = i + 1
163 return
164 enddo
165 i = iend + 1
166 tokentype = s_eof
167 cvalue = ""
シンプルな正規表現関数 'match' を提供します.
subroutine, public match(pattern, text, start, length)