package nl.bluering; import java.util.*; /** * a Syntelset holds a set of Syntel's, and is used in parsing, * to recognize the special constructions, and during writing. */ public class Syntelset { Hashtable pre=new Hashtable(); Hashtable other=new Hashtable(); private static Syntelset defaultset; Hashtable fname=new Hashtable(); public static Syntelset getdefaultset() {if(defaultset==null) defaultset=new Syntelset(); return defaultset; } public void add(Syntel o) { if(o.isprefix()) pre.put(o.instring,o); else other.put(o.instring,o); if(o.fname!=null) fnameput(o); } void fnameput(Syntel o) {if(o.maxarg()>1) fname.put(functionpointer.makeprototype(o.fname,2),o); else fname.put(functionpointer.makeprototype(o.fname,1),o); } Syntel fnamefind(String fname,int childs) { Syntel r; String key=functionpointer.makeprototype(fname,(childs>1)?2:1); r=(Syntel)this.fname.get(key); System.out.println(fname+((r!=null)?" found":" missing")); if(r!=null&&!r.isquote&&childs>=r.minarg()&&childs<=r.maxarg()) return r; return null; } /** *@param p if true it looks for a prefix operator (with no pre argument) */ Syntel getsyntel(String name,boolean pre) { if(pre) return (Syntel)this.pre.get(name); return (Syntel)other.get(name); } int subget(String s,boolean pre) { for(int i=s.length();i>0;i--) if(getsyntel(s.substring(0,i),pre)!=null) return i; return -1; } public Syntelset() { //high operators add(Syntel.newinop("=","let",1000,Syntel.RIGHT,false)); //math operators add(Syntel.newsyntel(1,"[",null,"]",1,1,"array",0,1,Syntel.MAXLEVEL,false)); add(Syntel.newrepeatinop("+","add",450)); add(Syntel.newrepeatinop("*","mul",400)); add(Syntel.newinop("**","exp",350,Syntel.RIGHT,false)); add(Syntel.newinop("-","sub",450,Syntel.LEFT,false)); add(Syntel.newinop("/","div",400,Syntel.NOT,false)); add(Syntel.newinop("%","mod",400,Syntel.NOT,false)); add(Syntel.newpreop("-","neg",380,Syntel.NOT)); //bitwise operators add(Syntel.newinop("&","andb",300,Syntel.NOT,false)); add(Syntel.newinop("|","orb",300,Syntel.NOT,false)); add(Syntel.newinop("^","xor",300,Syntel.NOT,false)); add(Syntel.newinop("<<","lshift",300,Syntel.NOT,false)); add(Syntel.newinop(">>","rshift",300,Syntel.NOT,false)); //boolean operators add(Syntel.newrepeatinop("&&","and",800)); add(Syntel.newrepeatinop("||","or",800)); add(Syntel.newpreop("!","not",750,Syntel.NOT)); //comparisons operators add(Syntel.newinop(">","gt",700,Syntel.NOT,false)); add(Syntel.newinop("<","lt",700,Syntel.NOT,false)); add(Syntel.newinop(">=","gte",700,Syntel.NOT,false)); add(Syntel.newinop("<=","lte",700,Syntel.NOT,false)); add(Syntel.newinop("!=","neq",700,Syntel.NOT,false)); add(Syntel.newinop("==","eq",700,Syntel.NOT,false)); //postfix operators add(Syntel.newpostop("++","nxt",200,Syntel.NOT)); add(Syntel.newpostop("--","nxt",200,Syntel.NOT)); //brackets: add(Syntel.newbracket("{","}",";","codeblock")); add(Syntel.newbracket("(",")",null,null)); //quotes: add(Syntel.newquote("`","`","systemcall")); add(Syntel.newquote("'","'",null)); add(Syntel.newquote("\"","\"","quote")); } }