#!/usr/bin/python
import sys,os,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 Files: ", db[synt.MD_RFILE])
	print()
	print("Notarian Reduction Rules Files: ", db[synt.MD_NREDFILE])
#	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()

	print("Defined Parts of Speech:")
	kys = list(db[synt.MD_PSPEECH].keys())
	nums = [x for x in kys if type(x) is int]
	nums.sort()
	for x in kys:
		if type(x) is str:
			print(x, db[synt.MD_PSPEECH][x])
	for x in nums:
		print(x, db[synt.MD_PSPEECH][x])
	print()


if __name__ == '__main__':

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

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

	lsdfs(mathdb)


