Loading...
Searching...
No Matches
dcunits_com Module Reference

Functions/Subroutines

subroutine, public dcunitssetline (line)
subroutine, public dcunitsgettoken (tokentype, ivalue, dvalue, cvalue)

Variables

integer, parameter, public s_eof = -128
integer, parameter, public s_shift = 300
integer, parameter, public s_text = 301
integer, parameter, public s_multiply = 302
integer, parameter, public s_divide = 303
integer, parameter, public s_exponent = 304
integer, parameter, public s_openpar = 305
integer, parameter, public s_closepar = 306
integer, parameter, public s_real = 307
integer, parameter, public s_integer = 308

Function/Subroutine Documentation

◆ dcunitsgettoken()

subroutine, public dcunits_com::dcunitsgettoken ( integer, intent(out) tokentype,
integer, dimension(5), intent(out) ivalue,
real(dp), intent(out) dvalue,
character(*), intent(out) cvalue )

Definition at line 53 of file dcunits_com.f90.

54 use dc_regex, only: match
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 ! '#' 文字が現われれば EOF シンボルを返す
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 ! 実数にならない小数点は S_MULTIPLY
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 ! ほかの1字トークンチェック
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 = ""
Provide simple regular expression subroutine: 'match' .
Definition dc_regex.f90:16
subroutine, public match(pattern, text, start, length)
Definition dc_regex.f90:267

References dc_regex::match(), s_closepar, s_divide, s_eof, s_exponent, s_integer, s_multiply, s_openpar, s_real, s_shift, and s_text.

Here is the call graph for this function:

◆ dcunitssetline()

subroutine, public dcunits_com::dcunitssetline ( character(*), intent(in) line)

Definition at line 46 of file dcunits_com.f90.

47 implicit none
48 character(*), intent(in):: line
49 thisline = line
50 i = 1

Variable Documentation

◆ s_closepar

integer, parameter, public dcunits_com::s_closepar = 306

Definition at line 36 of file dcunits_com.f90.

36 integer, parameter:: S_CLOSEPAR = 306

◆ s_divide

integer, parameter, public dcunits_com::s_divide = 303

Definition at line 33 of file dcunits_com.f90.

33 integer, parameter:: S_DIVIDE = 303

◆ s_eof

integer, parameter, public dcunits_com::s_eof = -128

Definition at line 29 of file dcunits_com.f90.

29 integer, parameter:: S_EOF = -128

◆ s_exponent

integer, parameter, public dcunits_com::s_exponent = 304

Definition at line 34 of file dcunits_com.f90.

34 integer, parameter:: S_EXPONENT = 304

◆ s_integer

integer, parameter, public dcunits_com::s_integer = 308

Definition at line 38 of file dcunits_com.f90.

38 integer, parameter:: S_INTEGER = 308

◆ s_multiply

integer, parameter, public dcunits_com::s_multiply = 302

Definition at line 32 of file dcunits_com.f90.

32 integer, parameter:: S_MULTIPLY = 302

◆ s_openpar

integer, parameter, public dcunits_com::s_openpar = 305

Definition at line 35 of file dcunits_com.f90.

35 integer, parameter:: S_OPENPAR = 305

◆ s_real

integer, parameter, public dcunits_com::s_real = 307

Definition at line 37 of file dcunits_com.f90.

37 integer, parameter:: S_REAL = 307

◆ s_shift

integer, parameter, public dcunits_com::s_shift = 300

Definition at line 30 of file dcunits_com.f90.

30 integer, parameter:: S_SHIFT = 300

◆ s_text

integer, parameter, public dcunits_com::s_text = 301

Definition at line 31 of file dcunits_com.f90.

31 integer, parameter:: S_TEXT = 301