1 """cltoken.py: Token definition for CL parser
2
3 $Id: cltoken.py 1463 2011-06-24 22:58:30Z stsci_embray $
4 """
5 from __future__ import division
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 import string
33 from stsci.tools.irafglobals import INDEF
34
35 verbose = 0
36
38 - def __init__(self, type, attr=None, lineno=None):
39 self.type = type
40 self.attr = attr
41 self.lineno = lineno
42
43
44
45
46
47
48
49
50
51
53
54 return cmp(self.type, o)
55
57 return hash(self.type)
58
60 if self.attr:
61 return self.type + '(' + self.attr + ')'
62 else:
63 return self.type
64
66 global verbose
67 if verbose:
68 return self.verboseRepr()
69 else:
70 if self.type in ["STRING", "QSTRING"]:
71
72
73 return repr(self.attr).replace('\\\\','\\')
74 else:
75 rv = self.attr
76 if rv is None: rv = self.type
77 return rv
78
81
84
86 """Return native representation of this token"""
87 if self.type == "INTEGER":
88 return self.__int__()
89 elif self.type == "FLOAT":
90 return self.__float__()
91 elif self.type in ["STRING","QSTRING"]:
92 return self.attr
93 elif self.type == "BOOL":
94 return self.bool()
95
96
97
99 rv = self.attr
100 if rv is None: rv = self.type
101 return rv
102
104 if self.type == "INTEGER":
105 return _str2int(self.attr)
106 elif self.type == "INDEF":
107 return int(INDEF)
108 elif self.type == "FLOAT":
109
110 f = self.__float__()
111 i = int(f)
112 if float(i) == f: return i
113 elif self.type in ["STRING", "QSTRING"]:
114 try:
115 if self.attr == "":
116 return int(INDEF)
117 elif self.attr[:1] == ')':
118
119 return self.attr
120 else:
121 return _str2int(self.attr)
122 except Exception, e:
123 print 'Exception', str(e)
124 pass
125 raise ValueError("Cannot convert " +
126 self.verboseRepr() + " to int")
127
129 if self.type == "FLOAT":
130
131 value = self.attr
132 i = value.find('d')
133 if i>=0:
134 value = value[:i] + 'e' + value[i+1:]
135 else:
136 i = value.find('D')
137 if i>=0:
138 value = value[:i] + 'E' + value[i+1:]
139 return float(value)
140 elif self.type == "INTEGER":
141
142 return float(_str2int(self.attr))
143 elif self.type == "SEXAGESIMAL":
144
145 flist = self.attr.split(':')
146 flist.reverse()
147 value = float(flist[0])
148 for v in flist[1:]:
149 value = float(v) + value/60.0
150 return value
151 elif self.type == "INDEF":
152 return float(INDEF)
153 elif self.type in ["STRING", "QSTRING"]:
154 try:
155 if self.attr == "":
156 return float(INDEF)
157 elif self.attr[:1] == ')':
158
159 return self.attr
160 else:
161 return float(self.attr)
162 except (ValueError, TypeError):
163 pass
164 raise ValueError("Cannot convert " +
165 self.verboseRepr() + " to float")
166
168
169 if self.type == "BOOL":
170 return self.attr
171 elif self.type == "INDEF":
172 return INDEF
173 elif self.type in ["STRING", "QSTRING"]:
174 keyword = self.attr.lower()
175 if keyword in ["yes", "y"]:
176 return "yes"
177 elif keyword in ["no", "n"]:
178 return "no"
179 elif self.attr[:1] == ')':
180
181 return self.attr
182 elif keyword == "":
183 return INDEF
184 raise ValueError("Cannot convert " +
185 self.verboseRepr() + " to bool")
186
188
189
190 last = value[-1].lower()
191 if last == 'b':
192
193 return eval('0'+value[:-1])
194 elif last == 'x':
195
196 return eval('0x'+value[:-1])
197
198 i=0
199 for digit in value:
200 if digit != '0': break
201 i = i+1
202 else:
203
204 return 0
205 return int(value[i:])
206