diff --git a/gdb-port/ast.py b/gdb-port/ast.py
index 59810a1682630759f7d9a98af0c9ba82bbea1fc7..e8a8d6589d3c5004d8c2b5d769671eabb62a51d4 100644
--- a/gdb-port/ast.py
+++ b/gdb-port/ast.py
@@ -85,16 +85,23 @@ class HParsedToken:
 		self.address = address
 		self.parent = parent
 		self.children = children
-		self.token_type = token_type or self.read_token_type()
+		#self.token_type = token_type or self.read_token_type()
+		self.token_type = token_type or self.read_member('token_type')
 
-		#TODO
+		# The entire HParsedToken as a gdb.Value
 		self.token = self.read_token_val()
+		# The data, either a union in the struct or a HTokenData
+		# The encapsulated value is returned in either case
 		self.data = self.read_token_data()
+		self.index = self.read_member('index')
+		self.bit_length = self.read_member('bit_length')
+		self.bit_offset = self.read_member('bit_offset')
 
 	def read_token_val(self):
 		tok = gdb.Value(self.address).cast(HParsedToken_t_p)
 		return tok
 
+	# TODO: remove
 	def read_token_type(self):
 		tok = gdb.Value(self.address).cast(HParsedToken_t_p)
 		return tok['token_type']
@@ -104,6 +111,7 @@ class HParsedToken:
 
 
 	def read_token_data(self):
+		#TODO: check for presence of token_data member and handle that branch
 		tok = gdb.Value(self.address).cast(HParsedToken_t_p)
 		if self.has_token_data(self.token_type):
 			# We default to using the 'user' field. Also covers custom token types
@@ -115,3 +123,7 @@ class HParsedToken:
 		# Token type is one of the enum values known not to have data
 		else:
 			return None
+
+	def read_member(self, member_name):
+		tok = gdb.Value(self.address).cast(HParsedToken_t_p)
+		return tok[member_name]