package nl.bluering; /** * a Syntel is a SYNTax ELement. These objects define the shorthand notations * a parser or writer can recognize or use, like brackets, quotes and operators. */ public class Syntel { int precount;//0 or 1 String instring;//the first string, the one it is recognized by. String repeat;//the , in { , , }. can be empty, or null String end;//the last string, the closing bracket; can be empty int minpost;//minimal number of elements after the instring int maxpost;//maximal number of elements after the instring String fname;//the name the object gets. can be null if just one object inside int level;//the level of this object int leftlevel;//the maximal allowed level of objects left from instring int rightlevel;//the maximal allowed level of objects right from instring boolean isquote;//if this is a quote, the enclosed characters are not parsed Expression endexp=null;//only for quotes: quote(end) Expression notendexp=null;//only for quotes: allout(end[0]) Expression repeatexp=null; static int MAXLEVEL=1200;//the maximal level. minlevel is 0. static int MAXREP=100;//parser maximum, to avoid crashing parser private Syntel(int a,String i,String r, String e, int min,int max, String fn,int l,int ll,int rl,boolean b) {precount=a; instring=i; repeat=r; end=e; minpost=min; maxpost=max; fname=fn; level=l; leftlevel=ll; rightlevel=rl; isquote=b; } public static boolean aunderb(Syntel a,Syntel b){ return a.fitsunder(b.leftlevel); } public static boolean aoverb(Syntel a,Syntel b){ return b.fitsunder(a.rightlevel); } /** * returns whether this Syntel can be fitted under * the given level. */ public boolean fitsunder(int l) {return (level<=l);} public boolean isprefix() {return precount==0;} public int minarg() {return precount+minpost;} public int maxarg() {return precount+maxpost;} public static Syntel newsyntel(int a,String i,String rep, String e, int min,int max, String fn,int l,int ll,int rl,boolean b) {Syntel r=new Syntel(a,i,rep,e,min,max,fn,l,ll,rl,b); if(!b&&(r.minarg()<1||r.minarg()>r.maxarg()||l<0||rl<0||rl<0)) return null; if(l>MAXLEVEL||rl>MAXLEVEL||ll>MAXLEVEL||i==null||i.length()==0) return null; if((max>1&&r==null)||a<0||a>1||min<0) return null; if (r.end!=null) r.endexp=ExpParser.addws(new Expression("quote",1).add(r.end)); if(r.end!=null&&r.isquote) {r.notendexp=new Expression("allout",1).add(r.end.substring(0,1)); } if(r.repeat!=null) r.repeatexp=ExpParser.addws(new Expression("quote",1).add(r.repeat)); return r; } public static Syntel newbracket(String pre,String post,String repeat,String fname) { Syntel r=newsyntel(0,pre,repeat,post,1,1,fname,0,0,MAXLEVEL,false); if(repeat!=null) r.maxpost=MAXREP; return r; } public static Syntel newquote(String pre,String post,String fname) { Syntel r=newsyntel(0,pre,null,post,0,0,fname,0,0,0,true); return r; } /** * the asociation modes: left a+b+c = (a+b)+c * not: a+b+c not allowed * right: a+b+c is a+(b+c) * if repeat is enabled, it is only used for different operators with the same level. */ public final static int LEFT=-1,NOT=0,RIGHT=1; public static Syntel newinop(String name,String fname,int level, int asocmode,boolean repeat) { Syntel r=newsyntel(1,name,name,null,1,repeat?MAXREP:1,fname,level,level-1,level-1,false); if(asocmode==LEFT) r.leftlevel=level; if(asocmode==RIGHT) r.rightlevel=level; r.isquote=false; return r; } public static Syntel newrepeatinop(String name,String fname,int level) {return newinop(name,fname,level,NOT,true); } public static Syntel newpreop(String name,String fname,int level, int asocmode) { Syntel r=newsyntel(0,name,null,"",1,1,fname,level, (asocmode==RIGHT)?level:level-1,0,false); return r; } public static Syntel newpostop(String name,String fname,int level, int asocmode) { Syntel r=newsyntel(1,name,null,"",0,0,fname,level,0, (asocmode==LEFT)?level:level-1,false); return r; } }