function get_token,s
COMPILE_OPT idl2
tok = {type:'',name:'',value:'',index:0}
if strlen(s) eq 0 then begin
tok.type = 'endline'
tok.name = '<cr>'
tok.value = tok.name
endif else if stregex(s,'(^&$|^&[^&])',/boolean) then begin
tok.type = 'termination'
tok.name = '&'
tok.value = tok.name
endif else if stregex(s,'^\$.*[^[:blank:]]+.*',length=l) ne -1 then begin
tok.type = 'syscall'
tok.name = strmid(s,0,l)
tok.value = tok.name
endif else if stregex(s,'^\$[[:blank:]]*',/boolean) then begin
tok.type = 'continuation'
tok.name = '$'
tok.value = tok.name
endif else if stregex(s,'^[[:blank:]]',/boolean) then begin
tok.type = 'whitespace'
tok.name = ' '
tok.value = tok.name
endif else if stregex(s,'^;.*',length=l) ne -1 then begin
tok.type = 'comment'
tok.name = strtrim(strmid(s,0,l))
tok.value = tok.name
endif else if stregex(s,"^'.*'",length=l) ne -1 then begin
tok.type = 'string'
st = strmid(s,1,l-1)
n = stregex(st,"^'.*'")
if n ne -1 then begin
tok.name = strmid(s,0,2)
endif else begin
n = stregex(st,"[^\\]'.*'")
if n eq -1 then begin
tok.name = strmid(s,0,l)
endif else begin
tok.name = strmid(s,0,n+3)
endelse
endelse
tok.value = tok.name
endif else if stregex(s,'^".*"',length=l) ne -1 then begin
tok.type = 'string'
st = strmid(s,1,l-1)
n = stregex(st,'^".*"')
if n ne -1 then begin
tok.name = strmid(s,0,2)
endif else begin
n = stregex(st,'[^\\]".*"')
if n eq -1 then begin
tok.name = strmid(s,0,l)
endif else begin
tok.name = strmid(s,0,n+3)
endelse
endelse
tok.value = tok.name
endif else if $
stregex(s,'^[[:digit:]]+[Bb]',length=l) ne -1 || $
stregex(s,'^[[:digit:]]+[Uu]*([Ss]|[Ll]{1,2})',length=l) ne -1 || $
stregex(s,'^[[:digit:]]+[Uu]',length=l) ne -1 || $
stregex(s,'^\.+[[:digit:]]+[eEdD][+-]+[[:digit:]]+',length=l) ne -1 ||$
stregex(s,'^\.+[[:digit:]]+[eEdD][[:digit:]]*',length=l) ne -1 ||$
stregex(s,'^\.+[[:digit:]]+',length=l) ne -1 || $
stregex(s,'^[[:digit:]]+\.*[[:digit:]]*[eEdD][+-]+[[:digit:]]+',length=l) ne -1 ||$
stregex(s,'^[[:digit:]]+\.*[[:digit:]]*[eEdD][[:digit:]]*',length=l) ne -1 ||$
stregex(s,'^[[:digit:]]+\.*[[:digit:]]*',length=l) ne -1 $
then begin
tok.type = 'number'
tok.name = strlowcase(strmid(s,0,l))
tok.value = tok.name
endif else if stregex(s,'^([(),])',length=l) ne -1 then begin
tok.type = 'punctuation'
tok.name = strmid(s,0,l)
tok.value = tok.name
endif else if stregex(s,'^([#]{1,2}|\*|\+|-|/|\<|\>|[Aa][Nn][Dd]|[Ee][Qq]|[Gg][Ee]|[Gg][Tt]|[Ll][Ee]|[Ll][Tt]|[Mm][Oo][Dd]|[Nn][Ee]|[Oo][Rr]|[Xx][Oo][Rr]|\^)?=',length=l) ne -1 then begin
tok.type = 'assignment'
tok.name = 'asm'
tok.value = strlowcase(strmid(s,0,l))
endif else if stregex(s,'^([*^/<>~]|&&|\|\||[#]{1,2}|[+]{1,2}|[-]{1,2}|[Aa][Nn][Dd]|[Ee][Qq]|[Gg][Ee]|[Gg][Tt]|[Ll][Ee]|[Ll][Tt]|[Mm][Oo][Dd]|[Nn][Ee]|[Oo][Rr]|[Xx][Oo][Rr]|[Nn][Oo][Tt])',length=l) ne -1 then begin
tok.type = 'operator'
tok.name = strlowcase(strmid(s,0,l))
tok.value = tok.name
end else if stregex(s,'^[@!]?[[:alnum:]$_]+',length=l) ne -1 then begin
tok.type = 'identifier'
tok.name = strlowcase(strmid(s,0,l))
tok.value = tok.name
endif else begin
tok.type = 'error'
tok.name = 'lexical error'
tok.value = s
endelse
return, tok
end