import sys,re,string
syntax_desc=re.compile("(\S+)\s+(\d+)\s*([^,]*)\s*,\s*(.*?)\s*$")
class atom:
def __init__(self, word, sib, lexlink, synlink):
self.word=word
self.sib=int(sib)
self.lexlink_type=lexlink
self.synlink_type=synlink
self.lexlink=self.synlink=None
self.right=self.left=self.down=self.up=None
self.id=0
def id_str(self): return self.word+"#"+`self.id`
def str_link(self,lnk):
l=getattr(self,lnk)
if l: return lnk+"="+l.word
return ""
def __str__(self):
s=self.word+" "+`self.sib`+" "+self.lexlink_type+", "+self.synlink_type
for l in ["lexlink","synlink","right","left","up","down"]:
res=self.str_link(l)
if res: s=s+", "+res
return s
def __repr__(self): return `[self.word,self.sib,self.lexlink_type,
self.synlink_type]`
class screen:
def __init__(self):
self.s={}
self.xmax=0
self.ymax=0
def print_xy(self,x,y,txt):
if not txt: return
if y>=self.ymax: self.ymax=y+1
if x+len(txt)-1>=self.xmax: self.xmax=x+len(txt)
for i in range(len(txt)):
if not self.s.has_key(x+i): self.s[x+i]={}
self.s[x+i][y]=txt[i]
def dsp_syn(self,x,y,a):
self.print_xy(x,y,a.word)
if a.down:
self.print_xy(x,y+1,"^")
self.print_xy(x,y+2,"|"+a.down.synlink_type)
self.print_xy(x,y+3,"|")
self.dsp_syn(x,y+4,a.down)
if a.right:
x=x+len(a.word)+1
self.print_xy(x,y,"<-----------")
self.print_xy(x,y-1,a.right.synlink_type)
self.dsp_syn(x+11+2,y,a.right)
def dsp_simple_syn(self,x,y,a):
self.print_xy(x,y,"O")
if a.down:
self.print_xy(x,y+1,"|")
self.print_xy(x,y+2,"v")
self.dsp_simple_syn(x,y+3,a.down)
if a.right:
x=x+1
self.print_xy(x,y,"->")
self.dsp_simple_syn(x+3,y,a.right)
def __str__(self):
s=[]
for y in range(self.ymax):
for x in range(self.xmax):
try:
s.append(self.s[x][y])
except KeyError:
s.append(' ')
s.append('\n')
return string.join(s,'')
def build_syn_tree(arr):
if not arr: return None
a=arr[0]
a.down=build_syn_tree(arr[1:a.sib])
if a.down: a.down.up=a
a.right=build_syn_tree(arr[a.sib:])
if a.right: a.right.left=a
return a
def list_syntax(syn_arr):
for a in syn_arr:
print a.id_str(),"sib("+`a.sib`+"),",\
"lexlink("+a.lexlink_type+"),"
if a.up: l="up to "+a.up.id_str()
elif a.left: l="left to "+a.left.id_str()
else: l=""
print "\tsynlink("+a.synlink_type+")",l
def display_syntax(syn_tree):
scr=screen()
scr.dsp_syn(0,1,syn_tree)
print scr
def display_simple_syntax(syn_tree):
scr=screen()
scr.dsp_simple_syn(0,0,syn_tree)
print scr
def get_tree(atom):
if not atom: return None
down=get_tree(atom.down)
right=get_tree(atom.right)
return (atom.word,atom.lexlink_type,atom.synlink_type,down,right)
def read_syntax_description(file_name):
fp=open(file_name)
line=fp.readline()
arr=[]
id=0
while line:
if line[0]!='#':
res=syntax_desc.match(line)
a=atom(res.group(1),res.group(2),res.group(3),res.group(4))
id=id+1
a.id=id
arr.append(a)
line=fp.readline()
fp.close()
build_syn_tree(arr)
return arr
def deb(): import pdb; pdb.pm()
def a(string):
global syn_arr
syn_arr=read_syntax_description(string)
list_syntax(syn_arr)
display_syntax(syn_arr[0])
display_simple_syntax(syn_arr[0])
if __name__=="__main__":
if len(sys.argv)<2:
sys.argv.append("syntax_input.txt")
a(sys.argv[1])
syntax highlighted by Code2HTML, v. 0.9.1