###Ruby, 641 651651 543 characters###
H=Hash.new{|h,k|[k]}
D=[[0d=[[i=0,0,[]]]
O=['o=[?(']]
L=->{e2=D.pop;e1=DL="t,u,v=d.pop
Opop;q,r,s=d.pop=='pop;o.'&&pop<?|&&(H[e1[1]]|=[e2[0]]H[r]<<=t)||(H[e1[0]]|=[e2[0]];H[e1[1]]|=[e2[1]]H[q]<<=t;H[r]<<=u)
D.push [e1[0];d<<[q,e2[1]u,[(e1[2]+e2[2])*"||"]]}s+v]"
i=0;getsgets.chop.chars.map{|c|c=='*'&&|c|c==?*&&(e=D.pop;H[e[1]]|=[e[0]];H[e[1]]|=[i+=1];Dq,r,s=d.push [e[1]pop;H[r]|=[q,i+=1];d<<=[r,i,e[2]];nexts];next)
L[]whileeval(L)while/[|)]/=~c ?O[o[-1]!='1]>?(':O[o[-1]=='1]==?.'
/[|(]/=~c&&(O.push c;D.push [i+=1=~c&&d<<[i+=1,i,[]])||c==')'&&(O.pop;O.push'.'o<<c&&[]]||c!=?)||(D.push [i+=1&&d<<[i+=1,i+1,["s==#{io<<?.;i}&&c=='#{c}'&&#{i+=1}"]];O.push'"]]||o[-1]=?.')}
L[]whileeval(L)while Oo.size>1
H.map{H.map{|k,v|v.map{|v|H[k]|=H[v]}}}
d=D[0]t,u,v=d[0]
$><<"s=#{H[d[0]]H[t]};gets.chop.chars.map{|c|s=s.map{|s|#{d[2][0]v*'||'}}-[!0];#{H.map{|k,v|"s&[#{k}]!=[]&&s|=#{v}"}*";"*?;}};p s&[#{d[1]u}]!=[]"