264     type(
units), 
intent(out):: u
   265     character(*), 
intent(in):: cunits
   270       character(TOKEN):: name
   271       real(DP):: power, factor
   273     type(elem_units), 
target:: ustack(100)
   284     type(paren_t):: pstack(50)
   288     integer, 
parameter:: y_init = 1, y_number = 2, y_name = 3, &
   289       & y_nx = 4, y_ni = 5, y_mul = 6, y_shift = 7
   290     integer:: yparse_status = y_init
   296     character(TOKEN):: cvalue
   302     if (
associated(u%name)) 
deallocate(u%name)
   303     if (
associated(u%power)) 
deallocate(u%power)
   307     if (cunits == 
"") 
return   311     yparse_status = y_init
   317         select case(yparse_status)
   319           pstack(pi)%factor = pstack(pi)%factor * ivalue(1)
   320           yparse_status = y_number
   322           i = pstack(pi)%power_exp
   323           ustack(
i:ui)%power = ustack(
i:ui)%power * ivalue(1) 
   332         select case(yparse_status)
   334           pstack(pi)%factor = pstack(pi)%factor * dvalue
   335           yparse_status = y_number
   337           i = pstack(pi)%power_exp
   338           ustack(
i:ui)%power = ustack(
i:ui)%power * dvalue
   347         select case(yparse_status)
   348         case (y_init, y_number, y_mul)
   349           ustack(ui)%name = cvalue
   350           yparse_status = y_name
   354           ustack(ui)%name = cvalue
   355           yparse_status = y_name
   362         select case(yparse_status)
   369         select case(yparse_status)
   370         case (y_number, y_name)
   372           yparse_status = y_mul
   377         select case(yparse_status)
   378         case (y_number, y_name)
   380           pstack(pi)%factor_inv = .true.
   381           yparse_status = y_mul
   388         yparse_status = y_shift
   405     u%factor = product(ustack(1:ui)%factor)
   406     call units_simplify(u, ustack(1:ui)%name, ustack(1:ui)%power)
   411       print *, 
operator"DCUnitsBuild: syntax error, (**) ignored"   415       print *, 
"DCUnitsBuild: unexpected token <", &
   416         & trim(cvalue), 
"> ignored"   422       pstack(pi)%power_exp = ui
   428       i = pstack(pi)%factor_exp
   429       factor = product(ustack(
i:ui)%factor) * pstack(pi)%factor
   430       if (pstack(pi)%factor_inv) 
then   431         ustack(
i:ui)%power = -ustack(
i:ui)%power
   432         factor = 1.0_dp / factor
   434       ustack(
i)%factor = factor
   435       ustack(
i+1:ui)%factor = 1.0_dp
   437       pstack(pi)%factor = 1.0_dp
   438       pstack(pi)%factor_exp = ui
   451       if (ui >= 
size(ustack)) stop 
'DCUnitsBuild: too many elements'   454       ustack(ui)%factor = 1.0_dp
   455       ustack(ui)%power = 1.0_dp
   464       if (pi >= 
size(pstack)) stop 
'DCUnitsBuild: too many parens'   467       pstack(pi)%factor_exp = ui
   468       pstack(pi)%factor = 1.0_dp
   469       pstack(pi)%factor_inv = .false.
   470       pstack(pi)%power_exp = ui
   471       pstack(pi)%paren_exp = ui
 
integer, parameter, public s_exponent
 
integer, parameter, public s_eof
 
integer, parameter, public s_openpar
 
integer, parameter, public s_shift
 
integer, parameter, public s_real
 
integer, parameter, public s_divide
 
integer, parameter, public s_multiply
 
integer, parameter, public s_closepar
 
integer, parameter, public s_text
 
subroutine, public dcunitsgettoken(tokentype, ivalue, dvalue, cvalue)
 
subroutine, public dcunitssetline(line)
 
integer, parameter, public s_integer
 
subroutine units_finalize