#!/usr/bin/python
import sys,re,pickle
import synt
#
#
#

def lsdfs(db):
	if len(db)	< synt.MD_LEN: 
		print("Number of Entries only: ", len(db)	)
		raise SystemExit
	print("Symbol Types:")
	vals = set(db[synt.MD_SYMTYPE].values())
	for n in vals: 
		print("Symbols of Type ",n)
		for x in db[synt.MD_SYMTYPE]:
			if  db[synt.MD_SYMTYPE][x] == n:
				print(x, end = ' ')
		print()
	print()
	print( "Operator Properties:")
	for op in db[synt.MD_PROPGET]:
		for p in db[synt.MD_PROPGET][op]:
			print(op,"has the",p,"property",end = ' ')
			n= db[synt.MD_PROPGET][op][p]
			if type(n) is int: 
				print('starting at', n)
			else:
				print()
	print()
	print( "Precedence:")
	precvals = set(db[synt.MD_PRECED].values())
	for n in precvals:
		print("Infix operators of Precedence ",n)
		for x in db[synt.MD_PRECED]:
			if  db[synt.MD_PRECED][x] == n:
				print("'"+x+"'",end= ',')
		print()
	print()
	print("Definienda:")
	for x in db[synt.MD_DEFS]:
		for y in db[synt.MD_DEFS][x]:
			print(x,y)
	print("Arity:")
	for n in range(10): 
		if n not in db[synt.MD_ARITY].values():
			continue
		print("Schemators of Arity ",n)
		for x in db[synt.MD_ARITY]:
			if  db[synt.MD_ARITY][x] == n:
				print(x, end=' ')
		print()

	print("Identity Operators: ", db[synt.MD_IDOPS])
	print("Transitive Precedences: ", db[synt.MD_TRPRS])
	print("Transitive Combinations: ", db[synt.MD_TRMUL])
	print()
	print(len(db[synt.MD_TRFILE]),"Transitive Rules Files")
	for  x in db[synt.MD_TRFILE]:
		print(x)
	print()
	print(len(db[synt.MD_REDFILE]),"Reduction Rules Files")
	for  x in db[synt.MD_REDFILE]:
		print(x)
	print()
	print("External Reference Abbreviations")
	for x in db[synt.MD_REFD]:
		print(x, db[synt.MD_REFD][x])
	print("User Symbol Definitions")
	print()
	for x in db[synt.MD_MACR]:
		print(x, '=', db[synt.MD_MACR][x])
	print()
	print("Rules of Inference File: ", db[synt.MD_RFILE])
	print()
#	print("Property Flags:")
#	for x in db[synt.MD_NRYPROP]:
#		y =  db[synt.MD_NRYPROP][x]
#		print(x,y)
#	print()
	print("Delimiter Matches:")
	for x in db[synt.MD_DLMATCH]:
		y = db[synt.MD_DLMATCH][x]
		print(x,y)
	print()
	print("Connector Definienda:")
	for x in db[synt.MD_CTDEFS]:
		for y in db[synt.MD_CTDEFS][x]:
			print(x,y)
	print()

	print("Parsing by Precedence:")
	nums = list(db[synt.MD_CTCHK].keys())
	nums.sort()
	for x in nums:
		print(x,db[synt.MD_CTCHK][x])
	print()

	print("Expansion by Precedence:")
	nums = list(db[synt.MD_CTHNDL].keys())
	nums.sort()
	for x in nums:
		print(x, db[synt.MD_CTHNDL][x])
	print()


if __name__ == '__main__':

	if len(sys.argv) == 1:
		print("Usage: lsdfs <file>")
		raise SystemExit

	if sys.argv[1][-4:] == ".dfs":
		try:
			f = open(sys.argv[1] , "rb")
			mathdb = pickle.load(f)	
			f.close()
		except:
			print("Error reading file: ",sys.argv[1])
			raise SystemExit
	else:
		try:
			f = open(sys.argv[1] + ".dfs" ,"rb")
			mathdb = pickle.load(f)	
			f.close()
		except:
			print("Error reading file: ",sys.argv[1] + ".dfs" )
			raise SystemExit

	lsdfs(mathdb)


