diff --git a/lib/javascript/editor.html b/lib/javascript/editor.html new file mode 100644 index 000000000..21bc5c7a5 --- /dev/null +++ b/lib/javascript/editor.html @@ -0,0 +1,17 @@ + + + + + + + + + + + Web-based Syntax Editor + + +
+
+ + diff --git a/lib/javascript/editorGrammar.js b/lib/javascript/editorGrammar.js new file mode 100644 index 000000000..f27ddd884 --- /dev/null +++ b/lib/javascript/editorGrammar.js @@ -0,0 +1 @@ +var Editor = new GFGrammar(new GFAbstract("Sentence",{Available: new Type([], "Adjective"), Bulgarian: new Type([], "Noun"), Command: new Type(["Verb", "Determiner", "Noun"], "Sentence"), CommandAdj: new Type(["Verb", "Determiner", "Adjective", "Noun"], "Sentence"), Copy: new Type([], "Verb"), Cut: new Type([], "Verb"), Danish: new Type([], "Noun"), DefPlDet: new Type([], "Determiner"), DefSgDet: new Type([], "Determiner"), Delete: new Type([], "Verb"), English: new Type([], "Noun"), Enter: new Type([], "Verb"), ErrorMessage: new Type(["Adjective", "Noun"], "Sentence"), Finnish: new Type([], "Noun"), Float_N: new Type([], "Noun"), French: new Type([], "Noun"), German: new Type([], "Noun"), IndefPlDet: new Type([], "Determiner"), IndefSgDet: new Type([], "Determiner"), Integer_N: new Type([], "Noun"), Italian: new Type([], "Noun"), Label: new Type(["Noun"], "Sentence"), Language: new Type([], "Noun"), Next: new Type([], "Adjective"), Node: new Type([], "Noun"), Norwegian: new Type([], "Noun"), Page: new Type([], "Noun"), Parse: new Type([], "Verb"), Paste: new Type([], "Verb"), Previous: new Type([], "Adjective"), RandomlyCommand: new Type(["Verb", "Determiner", "Noun"], "Sentence"), Redo: new Type([], "Verb"), Refine: new Type([], "Verb"), Refinement: new Type([], "Noun"), Replace: new Type([], "Verb"), Russian: new Type([], "Noun"), Select: new Type([], "Verb"), Show: new Type([], "Verb"), SingleWordCommand: new Type(["Verb"], "Sentence"), Spanish: new Type([], "Noun"), String_N: new Type([], "Noun"), Swedish: new Type([], "Noun"), This: new Type([], "Determiner"), Tree: new Type([], "Noun"), Undo: new Type([], "Verb"), Wrap: new Type([], "Verb"), Wrapper: new Type([], "Noun")}),{EditorEng: new GFConcrete({Available: function(cs){return new Arr(new Suffix("available", new Arr(new Str(""), new Str("r"), new Str("st"), new Str("ly"))));}, Bulgarian: function(cs){return new Arr(new Arr(Editor.concretes["EditorEng"].rule("_4", cs), Editor.concretes["EditorEng"].rule("_4", cs)));}, Command: function(cs){return new Arr(new Seq(Editor.concretes["EditorEng"].rule("_8", cs),(new Arr(new Arr(new Seq(Editor.concretes["EditorEng"].rule("_12", cs), Editor.concretes["EditorEng"].rule("_13", cs), Editor.concretes["EditorEng"].rule("_17", cs)), new Seq(Editor.concretes["EditorEng"].rule("_20", cs), Editor.concretes["EditorEng"].rule("_13", cs), Editor.concretes["EditorEng"].rule("_17", cs)), new Seq(Editor.concretes["EditorEng"].rule("_23", cs), Editor.concretes["EditorEng"].rule("_13", cs), Editor.concretes["EditorEng"].rule("_17", cs))), new Arr(new Seq(Editor.concretes["EditorEng"].rule("_27", cs), Editor.concretes["EditorEng"].rule("_13", cs), Editor.concretes["EditorEng"].rule("_17", cs)), new Seq(Editor.concretes["EditorEng"].rule("_30", cs), Editor.concretes["EditorEng"].rule("_13", cs), Editor.concretes["EditorEng"].rule("_17", cs)), new Seq(Editor.concretes["EditorEng"].rule("_33", cs), Editor.concretes["EditorEng"].rule("_13", cs), Editor.concretes["EditorEng"].rule("_17", cs))))).sel(Editor.concretes["EditorEng"].rule("_38", cs)).sel(Editor.concretes["EditorEng"].rule("_40", cs))));}, CommandAdj: function(cs){return new Arr(new Seq(Editor.concretes["EditorEng"].rule("_8", cs),(new Arr(new Arr(new Seq(Editor.concretes["EditorEng"].rule("_12", cs), Editor.concretes["EditorEng"].rule("_13", cs), Editor.concretes["EditorEng"].rule("_53", cs)), new Seq(Editor.concretes["EditorEng"].rule("_20", cs), Editor.concretes["EditorEng"].rule("_13", cs), Editor.concretes["EditorEng"].rule("_53", cs)), new Seq(Editor.concretes["EditorEng"].rule("_23", cs), Editor.concretes["EditorEng"].rule("_13", cs), Editor.concretes["EditorEng"].rule("_53", cs))), new Arr(new Seq(Editor.concretes["EditorEng"].rule("_27", cs), Editor.concretes["EditorEng"].rule("_13", cs), Editor.concretes["EditorEng"].rule("_53", cs)), new Seq(Editor.concretes["EditorEng"].rule("_30", cs), Editor.concretes["EditorEng"].rule("_13", cs), Editor.concretes["EditorEng"].rule("_53", cs)), new Seq(Editor.concretes["EditorEng"].rule("_33", cs), Editor.concretes["EditorEng"].rule("_13", cs), Editor.concretes["EditorEng"].rule("_53", cs))))).sel(Editor.concretes["EditorEng"].rule("_38", cs)).sel(Editor.concretes["EditorEng"].rule("_40", cs))));}, Copy: function(cs){return new Arr(new Int(1), new Suffix("Cop", new Arr(new Str("y"), new Str("ies"), new Str("ied"), new Str("ying"))));}, Cut: function(cs){return new Arr(new Int(1), new Suffix("Cut", Editor.concretes["EditorEng"].rule("_70", cs)));}, Danish: function(cs){return new Arr(new Arr(Editor.concretes["EditorEng"].rule("_73", cs), Editor.concretes["EditorEng"].rule("_73", cs)));}, DefPlDet: function(cs){return new Arr(new Int(1), new Str("the"));}, DefSgDet: function(cs){return new Arr(new Int(0), new Str("the"));}, Delete: function(cs){return new Arr(new Int(1), new Suffix("Delet", Editor.concretes["EditorEng"].rule("_78", cs)));}, English: function(cs){return new Arr(new Arr(Editor.concretes["EditorEng"].rule("_81", cs), Editor.concretes["EditorEng"].rule("_81", cs)));}, Enter: function(cs){return new Arr(new Int(1), new Suffix("Enter", Editor.concretes["EditorEng"].rule("_70", cs)));}, ErrorMessage: function(cs){return new Arr(new Seq(new Str("there"),(new Arr(new Arr(new Seq(new Str("am"), new Str("not")), new Str("aren't"), new Str("isn't")), new Arr(new Str("aren't"), new Str("aren't"), new Str("aren't")))).sel(Editor.concretes["EditorEng"].rule("_91", cs)).sel(Editor.concretes["EditorEng"].rule("_93", cs)), Editor.concretes["EditorEng"].rule("_98", cs), Editor.concretes["EditorEng"].rule("_98", cs), Editor.concretes["EditorEng"].rule("_98", cs),(new Arr(Editor.concretes["EditorEng"].rule("_103", cs), Editor.concretes["EditorEng"].rule("_103", cs))).sel(Editor.concretes["EditorEng"].rule("_91", cs)).sel(Editor.concretes["EditorEng"].rule("_93", cs))));}, Finnish: function(cs){return new Arr(new Arr(Editor.concretes["EditorEng"].rule("_109", cs), Editor.concretes["EditorEng"].rule("_109", cs)));}, Float_N: function(cs){return new Arr(new Arr(new Suffix("float", Editor.concretes["EditorEng"].rule("_3", cs)), new Suffix("floats", Editor.concretes["EditorEng"].rule("_113", cs))));}, French: function(cs){return new Arr(new Arr(Editor.concretes["EditorEng"].rule("_117", cs), Editor.concretes["EditorEng"].rule("_117", cs)));}, German: function(cs){return new Arr(new Arr(Editor.concretes["EditorEng"].rule("_120", cs), Editor.concretes["EditorEng"].rule("_120", cs)));}, IndefPlDet: function(cs){return new Arr(new Int(1), Editor.concretes["EditorEng"].rule("_9", cs));}, IndefSgDet: function(cs){return new Arr(new Int(0), new Str("a"));}, Integer_N: function(cs){return new Arr(new Arr(new Suffix("integer", Editor.concretes["EditorEng"].rule("_3", cs)), new Suffix("integers", Editor.concretes["EditorEng"].rule("_113", cs))));}, Italian: function(cs){return new Arr(new Arr(Editor.concretes["EditorEng"].rule("_129", cs), Editor.concretes["EditorEng"].rule("_129", cs)));}, Label: function(cs){return new Arr(Editor.concretes["EditorEng"].rule("_99", cs).sel(new Int(0)));}, Language: function(cs){return new Arr(new Arr(new Suffix("language", Editor.concretes["EditorEng"].rule("_3", cs)), new Suffix("languages", Editor.concretes["EditorEng"].rule("_113", cs))));}, Next: function(cs){return new Arr(new Suffix("next", Editor.concretes["EditorEng"].rule("_138", cs)));}, Node: function(cs){return new Arr(new Arr(new Suffix("node", Editor.concretes["EditorEng"].rule("_3", cs)), new Suffix("nodes", Editor.concretes["EditorEng"].rule("_113", cs))));}, Norwegian: function(cs){return new Arr(new Arr(Editor.concretes["EditorEng"].rule("_145", cs), Editor.concretes["EditorEng"].rule("_145", cs)));}, Page: function(cs){return new Arr(new Arr(new Suffix("page", Editor.concretes["EditorEng"].rule("_3", cs)), new Suffix("pages", Editor.concretes["EditorEng"].rule("_113", cs))));}, Parse: function(cs){return new Arr(new Int(1), new Suffix("Pars", Editor.concretes["EditorEng"].rule("_78", cs)));}, Paste: function(cs){return new Arr(new Int(1), new Suffix("Past", Editor.concretes["EditorEng"].rule("_78", cs)));}, Previous: function(cs){return new Arr(new Suffix("previous", Editor.concretes["EditorEng"].rule("_138", cs)));}, RandomlyCommand: function(cs){return new Arr(new Seq(Editor.concretes["EditorEng"].rule("_8", cs), Editor.concretes["EditorEng"].rule("_20", cs), Editor.concretes["EditorEng"].rule("_13", cs), Editor.concretes["EditorEng"].rule("_17", cs), new Str("at"), new Str("random")));}, Redo: function(cs){return new Arr(new Int(1), new Suffix("Redo", Editor.concretes["EditorEng"].rule("_160", cs)));}, Refine: function(cs){return new Arr(new Int(1), new Suffix("Refin", Editor.concretes["EditorEng"].rule("_78", cs)));}, Refinement: function(cs){return new Arr(new Arr(new Suffix("refinement", Editor.concretes["EditorEng"].rule("_3", cs)), new Suffix("refinements", Editor.concretes["EditorEng"].rule("_113", cs))));}, Replace: function(cs){return new Arr(new Int(1), new Suffix("Replac", Editor.concretes["EditorEng"].rule("_78", cs)));}, Russian: function(cs){return new Arr(new Arr(Editor.concretes["EditorEng"].rule("_171", cs), Editor.concretes["EditorEng"].rule("_171", cs)));}, Select: function(cs){return new Arr(new Int(1), new Suffix("Select", Editor.concretes["EditorEng"].rule("_70", cs)));}, Show: function(cs){return new Arr(new Int(1), new Suffix("Show", Editor.concretes["EditorEng"].rule("_70", cs)));}, SingleWordCommand: function(cs){return new Arr(new Seq(Editor.concretes["EditorEng"].rule("_8", cs),(new Arr(new Arr(Editor.concretes["EditorEng"].rule("_12", cs), Editor.concretes["EditorEng"].rule("_20", cs), Editor.concretes["EditorEng"].rule("_23", cs)), new Arr(Editor.concretes["EditorEng"].rule("_27", cs), Editor.concretes["EditorEng"].rule("_30", cs), Editor.concretes["EditorEng"].rule("_33", cs)))).sel(Editor.concretes["EditorEng"].rule("_38", cs)).sel(Editor.concretes["EditorEng"].rule("_40", cs))));}, Spanish: function(cs){return new Arr(new Arr(Editor.concretes["EditorEng"].rule("_185", cs), Editor.concretes["EditorEng"].rule("_185", cs)));}, String_N: function(cs){return new Arr(new Arr(new Suffix("string", Editor.concretes["EditorEng"].rule("_3", cs)), new Suffix("strings", Editor.concretes["EditorEng"].rule("_113", cs))));}, Swedish: function(cs){return new Arr(new Arr(Editor.concretes["EditorEng"].rule("_192", cs), Editor.concretes["EditorEng"].rule("_192", cs)));}, This: function(cs){return new Arr(new Int(0), new Str("this"));}, Tree: function(cs){return new Arr(new Arr(new Suffix("tree", Editor.concretes["EditorEng"].rule("_3", cs)), new Suffix("trees", Editor.concretes["EditorEng"].rule("_113", cs))));}, Undo: function(cs){return new Arr(new Int(1), new Suffix("Undo", Editor.concretes["EditorEng"].rule("_160", cs)));}, Wrap: function(cs){return new Arr(new Int(1), new Suffix("Wrap", Editor.concretes["EditorEng"].rule("_70", cs)));}, Wrapper: function(cs){return new Arr(new Arr(new Suffix("wrapper", Editor.concretes["EditorEng"].rule("_3", cs)), new Suffix("wrappers", Editor.concretes["EditorEng"].rule("_113", cs))));}, _10: function(cs){return new Arr(new Str("myself"), Editor.concretes["EditorEng"].rule("_9", cs));}, _100: function(cs){return Editor.concretes["EditorEng"].rule("_15", cs).sel(new Int(1));}, _101: function(cs){return Editor.concretes["EditorEng"].rule("_100", cs).sel(new Int(1));}, _102: function(cs){return new Seq(Editor.concretes["EditorEng"].rule("_99", cs), Editor.concretes["EditorEng"].rule("_101", cs));}, _103: function(cs){return new Arr(Editor.concretes["EditorEng"].rule("_102", cs), Editor.concretes["EditorEng"].rule("_102", cs), Editor.concretes["EditorEng"].rule("_102", cs));}, _109: function(cs){return new Suffix("Finnish", Editor.concretes["EditorEng"].rule("_3", cs));}, _11: function(cs){return cs[0].sel(new Int(0));}, _113: function(cs){return new Arr(new Str(""), new Str(""), new Str("'"));}, _117: function(cs){return new Suffix("French", Editor.concretes["EditorEng"].rule("_3", cs));}, _12: function(cs){return Editor.concretes["EditorEng"].rule("_10", cs).sel(Editor.concretes["EditorEng"].rule("_11", cs));}, _120: function(cs){return new Suffix("German", Editor.concretes["EditorEng"].rule("_3", cs));}, _129: function(cs){return new Suffix("Italian", Editor.concretes["EditorEng"].rule("_3", cs));}, _13: function(cs){return cs[1].sel(new Int(1));}, _138: function(cs){return new Arr(new Str(""), new Str("er"), new Str("est"), new Str("ly"));}, _14: function(cs){return cs[2].sel(new Int(0));}, _145: function(cs){return new Suffix("Norwegian", Editor.concretes["EditorEng"].rule("_3", cs));}, _15: function(cs){return cs[1].sel(new Int(0));}, _16: function(cs){return Editor.concretes["EditorEng"].rule("_14", cs).sel(Editor.concretes["EditorEng"].rule("_15", cs));}, _160: function(cs){return new Arr(new Str(""), new Str("es"), new Str("ed"), new Str("ing"));}, _17: function(cs){return Editor.concretes["EditorEng"].rule("_16", cs).sel(new Int(1));}, _171: function(cs){return new Suffix("Russian", Editor.concretes["EditorEng"].rule("_3", cs));}, _185: function(cs){return new Suffix("Spanish", Editor.concretes["EditorEng"].rule("_3", cs));}, _19: function(cs){return new Arr(new Str("yourself"), Editor.concretes["EditorEng"].rule("_9", cs));}, _192: function(cs){return new Suffix("Swedish", Editor.concretes["EditorEng"].rule("_3", cs));}, _20: function(cs){return Editor.concretes["EditorEng"].rule("_19", cs).sel(Editor.concretes["EditorEng"].rule("_11", cs));}, _208: function(cs){return new Arr(cs[0], cs[0], cs[0], cs[0]);}, _211: function(cs){return new Arr(cs[0], cs[0], cs[0]);}, _22: function(cs){return new Arr(new Str("itself"), Editor.concretes["EditorEng"].rule("_9", cs));}, _23: function(cs){return Editor.concretes["EditorEng"].rule("_22", cs).sel(Editor.concretes["EditorEng"].rule("_11", cs));}, _26: function(cs){return new Arr(new Str("ourselves"), Editor.concretes["EditorEng"].rule("_9", cs));}, _27: function(cs){return Editor.concretes["EditorEng"].rule("_26", cs).sel(Editor.concretes["EditorEng"].rule("_11", cs));}, _29: function(cs){return new Arr(new Str("yourselves"), Editor.concretes["EditorEng"].rule("_9", cs));}, _3: function(cs){return new Arr(new Str(""), new Str(""), new Str("'s"));}, _30: function(cs){return Editor.concretes["EditorEng"].rule("_29", cs).sel(Editor.concretes["EditorEng"].rule("_11", cs));}, _32: function(cs){return new Arr(new Str("themselves"), Editor.concretes["EditorEng"].rule("_9", cs));}, _33: function(cs){return Editor.concretes["EditorEng"].rule("_32", cs).sel(Editor.concretes["EditorEng"].rule("_11", cs));}, _37: function(cs){return new Arr(new Int(0), new Int(1));}, _38: function(cs){return Editor.concretes["EditorEng"].rule("_37", cs).sel(new Int(0));}, _4: function(cs){return new Suffix("Bulgarian", Editor.concretes["EditorEng"].rule("_3", cs));}, _40: function(cs){return Editor.concretes["EditorEng"].rule("_37", cs).sel(new Int(1));}, _44: function(cs){return Editor.concretes["EditorEng"].rule("_14", cs).sel(new Int(0));}, _45: function(cs){return cs[3].sel(new Int(0));}, _46: function(cs){return Editor.concretes["EditorEng"].rule("_45", cs).sel(new Int(0));}, _47: function(cs){return Editor.concretes["EditorEng"].rule("_46", cs).sel(new Int(1));}, _48: function(cs){return new Seq(Editor.concretes["EditorEng"].rule("_44", cs), Editor.concretes["EditorEng"].rule("_47", cs));}, _49: function(cs){return Editor.concretes["EditorEng"].rule("_45", cs).sel(new Int(1));}, _50: function(cs){return Editor.concretes["EditorEng"].rule("_49", cs).sel(new Int(1));}, _51: function(cs){return new Seq(Editor.concretes["EditorEng"].rule("_44", cs), Editor.concretes["EditorEng"].rule("_50", cs));}, _52: function(cs){return new Arr(Editor.concretes["EditorEng"].rule("_48", cs), Editor.concretes["EditorEng"].rule("_51", cs));}, _53: function(cs){return Editor.concretes["EditorEng"].rule("_52", cs).sel(Editor.concretes["EditorEng"].rule("_15", cs));}, _7: function(cs){return cs[0].sel(new Int(1));}, _70: function(cs){return new Arr(new Str(""), new Str("s"), new Str("ed"), new Str("ing"));}, _73: function(cs){return new Suffix("Danish", Editor.concretes["EditorEng"].rule("_3", cs));}, _78: function(cs){return new Arr(new Str("e"), new Str("es"), new Str("ed"), new Str("ing"));}, _8: function(cs){return Editor.concretes["EditorEng"].rule("_7", cs).sel(new Int(0));}, _81: function(cs){return new Suffix("English", Editor.concretes["EditorEng"].rule("_3", cs));}, _9: function(cs){return new Seq();}, _90: function(cs){return new Arr(new Int(1), new Int(2));}, _91: function(cs){return Editor.concretes["EditorEng"].rule("_90", cs).sel(new Int(0));}, _93: function(cs){return Editor.concretes["EditorEng"].rule("_90", cs).sel(new Int(1));}, _95: function(cs){return new Arr(Editor.concretes["EditorEng"].rule("_9", cs), Editor.concretes["EditorEng"].rule("_9", cs), Editor.concretes["EditorEng"].rule("_9", cs));}, _96: function(cs){return new Arr(Editor.concretes["EditorEng"].rule("_95", cs), Editor.concretes["EditorEng"].rule("_95", cs));}, _97: function(cs){return Editor.concretes["EditorEng"].rule("_96", cs).sel(Editor.concretes["EditorEng"].rule("_91", cs));}, _98: function(cs){return Editor.concretes["EditorEng"].rule("_97", cs).sel(Editor.concretes["EditorEng"].rule("_93", cs));}, _99: function(cs){return Editor.concretes["EditorEng"].rule("_11", cs).sel(new Int(0));}, Adjective: function(cs){return new Arr(Editor.concretes["EditorEng"].rule("_208", cs));}, Determiner: function(cs){return new Arr(new Int(0), cs[0]);}, Noun: function(cs){return new Arr(new Arr(Editor.concretes["EditorEng"].rule("_211", cs), Editor.concretes["EditorEng"].rule("_211", cs)));}, Sentence: function(cs){return new Arr(cs[0]);}, Verb: function(cs){return new Arr(new Int(0), Editor.concretes["EditorEng"].rule("_208", cs));}, Int: function(cs){return new Arr(cs[0]);}, Float: function(cs){return new Arr(cs[0]);}, String: function(cs){return new Arr(cs[0]);}}, new Parser("Sentence",[new Rule(10, new FunApp("Wrapper",[]),[],[[new Terminal("wrapper")]]), new Rule(9, new FunApp("Wrapper",[]),[],[[new Terminal("wrapper")]]), new Rule(8, new FunApp("Wrapper",[]),[],[[new Terminal("wrapper's")]]), new Rule(7, new FunApp("Wrapper",[]),[],[[new Terminal("wrappers")]]), new Rule(6, new FunApp("Wrapper",[]),[],[[new Terminal("wrappers")]]), new Rule(5, new FunApp("Wrapper",[]),[],[[new Terminal("wrappers'")]]), new Rule(14, new FunApp("Wrap",[]),[],[[new Terminal("Wrap")]]), new Rule(18, new FunApp("Wrap",[]),[],[[new Terminal("Wraps")]]), new Rule(17, new FunApp("Wrap",[]),[],[[new Terminal("Wraped")]]), new Rule(16, new FunApp("Wrap",[]),[],[[new Terminal("Wraping")]]), new Rule(14, new FunApp("Undo",[]),[],[[new Terminal("Undo")]]), new Rule(18, new FunApp("Undo",[]),[],[[new Terminal("Undoes")]]), new Rule(17, new FunApp("Undo",[]),[],[[new Terminal("Undoed")]]), new Rule(16, new FunApp("Undo",[]),[],[[new Terminal("Undoing")]]), new Rule(10, new FunApp("Tree",[]),[],[[new Terminal("tree")]]), new Rule(9, new FunApp("Tree",[]),[],[[new Terminal("tree")]]), new Rule(8, new FunApp("Tree",[]),[],[[new Terminal("tree's")]]), new Rule(7, new FunApp("Tree",[]),[],[[new Terminal("trees")]]), new Rule(6, new FunApp("Tree",[]),[],[[new Terminal("trees")]]), new Rule(5, new FunApp("Tree",[]),[],[[new Terminal("trees'")]]), new Rule(12, new FunApp("This",[]),[],[[new Terminal("this")]]), new Rule(10, new FunApp("Swedish",[]),[],[[new Terminal("Swedish")]]), new Rule(9, new FunApp("Swedish",[]),[],[[new Terminal("Swedish")]]), new Rule(8, new FunApp("Swedish",[]),[],[[new Terminal("Swedish's")]]), new Rule(7, new FunApp("Swedish",[]),[],[[new Terminal("Swedish")]]), new Rule(6, new FunApp("Swedish",[]),[],[[new Terminal("Swedish")]]), new Rule(5, new FunApp("Swedish",[]),[],[[new Terminal("Swedish's")]]), new Rule(10, new FunApp("String_N",[]),[],[[new Terminal("string")]]), new Rule(9, new FunApp("String_N",[]),[],[[new Terminal("string")]]), new Rule(8, new FunApp("String_N",[]),[],[[new Terminal("string's")]]), new Rule(7, new FunApp("String_N",[]),[],[[new Terminal("strings")]]), new Rule(6, new FunApp("String_N",[]),[],[[new Terminal("strings")]]), new Rule(5, new FunApp("String_N",[]),[],[[new Terminal("strings'")]]), new Rule(10, new FunApp("Spanish",[]),[],[[new Terminal("Spanish")]]), new Rule(9, new FunApp("Spanish",[]),[],[[new Terminal("Spanish")]]), new Rule(8, new FunApp("Spanish",[]),[],[[new Terminal("Spanish's")]]), new Rule(7, new FunApp("Spanish",[]),[],[[new Terminal("Spanish")]]), new Rule(6, new FunApp("Spanish",[]),[],[[new Terminal("Spanish")]]), new Rule(5, new FunApp("Spanish",[]),[],[[new Terminal("Spanish's")]]), new Rule(11, new FunApp("SingleWordCommand",[new Arg(0)]),[14],[[new ArgProj(0, 0)]]), new Rule(11, new FunApp("SingleWordCommand",[new Arg(0)]),[13],[[new ArgProj(0, 0), new Terminal("yourself")]]), new Rule(14, new FunApp("Show",[]),[],[[new Terminal("Show")]]), new Rule(18, new FunApp("Show",[]),[],[[new Terminal("Shows")]]), new Rule(17, new FunApp("Show",[]),[],[[new Terminal("Showed")]]), new Rule(16, new FunApp("Show",[]),[],[[new Terminal("Showing")]]), new Rule(14, new FunApp("Select",[]),[],[[new Terminal("Select")]]), new Rule(18, new FunApp("Select",[]),[],[[new Terminal("Selects")]]), new Rule(17, new FunApp("Select",[]),[],[[new Terminal("Selected")]]), new Rule(16, new FunApp("Select",[]),[],[[new Terminal("Selecting")]]), new Rule(10, new FunApp("Russian",[]),[],[[new Terminal("Russian")]]), new Rule(9, new FunApp("Russian",[]),[],[[new Terminal("Russian")]]), new Rule(8, new FunApp("Russian",[]),[],[[new Terminal("Russian's")]]), new Rule(7, new FunApp("Russian",[]),[],[[new Terminal("Russian")]]), new Rule(6, new FunApp("Russian",[]),[],[[new Terminal("Russian")]]), new Rule(5, new FunApp("Russian",[]),[],[[new Terminal("Russian's")]]), new Rule(14, new FunApp("Replace",[]),[],[[new Terminal("Replace")]]), new Rule(18, new FunApp("Replace",[]),[],[[new Terminal("Replaces")]]), new Rule(17, new FunApp("Replace",[]),[],[[new Terminal("Replaced")]]), new Rule(16, new FunApp("Replace",[]),[],[[new Terminal("Replacing")]]), new Rule(10, new FunApp("Refinement",[]),[],[[new Terminal("refinement")]]), new Rule(9, new FunApp("Refinement",[]),[],[[new Terminal("refinement")]]), new Rule(8, new FunApp("Refinement",[]),[],[[new Terminal("refinement's")]]), new Rule(7, new FunApp("Refinement",[]),[],[[new Terminal("refinements")]]), new Rule(6, new FunApp("Refinement",[]),[],[[new Terminal("refinements")]]), new Rule(5, new FunApp("Refinement",[]),[],[[new Terminal("refinements'")]]), new Rule(14, new FunApp("Refine",[]),[],[[new Terminal("Refine")]]), new Rule(18, new FunApp("Refine",[]),[],[[new Terminal("Refines")]]), new Rule(17, new FunApp("Refine",[]),[],[[new Terminal("Refined")]]), new Rule(16, new FunApp("Refine",[]),[],[[new Terminal("Refining")]]), new Rule(14, new FunApp("Redo",[]),[],[[new Terminal("Redo")]]), new Rule(18, new FunApp("Redo",[]),[],[[new Terminal("Redoes")]]), new Rule(17, new FunApp("Redo",[]),[],[[new Terminal("Redoed")]]), new Rule(16, new FunApp("Redo",[]),[],[[new Terminal("Redoing")]]), new Rule(11, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[14, 15, 6],[[new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("at"), new Terminal("random")]]), new Rule(11, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[13, 15, 6],[[new ArgProj(0, 0), new Terminal("yourself"), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("at"), new Terminal("random")]]), new Rule(11, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[14, 12, 9],[[new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("at"), new Terminal("random")]]), new Rule(11, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[13, 12, 9],[[new ArgProj(0, 0), new Terminal("yourself"), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("at"), new Terminal("random")]]), new Rule(4, new FunApp("Previous",[]),[],[[new Terminal("previous")]]), new Rule(3, new FunApp("Previous",[]),[],[[new Terminal("previouser")]]), new Rule(2, new FunApp("Previous",[]),[],[[new Terminal("previousest")]]), new Rule(1, new FunApp("Previous",[]),[],[[new Terminal("previously")]]), new Rule(14, new FunApp("Paste",[]),[],[[new Terminal("Paste")]]), new Rule(18, new FunApp("Paste",[]),[],[[new Terminal("Pastes")]]), new Rule(17, new FunApp("Paste",[]),[],[[new Terminal("Pasted")]]), new Rule(16, new FunApp("Paste",[]),[],[[new Terminal("Pasting")]]), new Rule(14, new FunApp("Parse",[]),[],[[new Terminal("Parse")]]), new Rule(18, new FunApp("Parse",[]),[],[[new Terminal("Parses")]]), new Rule(17, new FunApp("Parse",[]),[],[[new Terminal("Parsed")]]), new Rule(16, new FunApp("Parse",[]),[],[[new Terminal("Parsing")]]), new Rule(10, new FunApp("Page",[]),[],[[new Terminal("page")]]), new Rule(9, new FunApp("Page",[]),[],[[new Terminal("page")]]), new Rule(8, new FunApp("Page",[]),[],[[new Terminal("page's")]]), new Rule(7, new FunApp("Page",[]),[],[[new Terminal("pages")]]), new Rule(6, new FunApp("Page",[]),[],[[new Terminal("pages")]]), new Rule(5, new FunApp("Page",[]),[],[[new Terminal("pages'")]]), new Rule(10, new FunApp("Norwegian",[]),[],[[new Terminal("Norwegian")]]), new Rule(9, new FunApp("Norwegian",[]),[],[[new Terminal("Norwegian")]]), new Rule(8, new FunApp("Norwegian",[]),[],[[new Terminal("Norwegian's")]]), new Rule(7, new FunApp("Norwegian",[]),[],[[new Terminal("Norwegian")]]), new Rule(6, new FunApp("Norwegian",[]),[],[[new Terminal("Norwegian")]]), new Rule(5, new FunApp("Norwegian",[]),[],[[new Terminal("Norwegian's")]]), new Rule(10, new FunApp("Node",[]),[],[[new Terminal("node")]]), new Rule(9, new FunApp("Node",[]),[],[[new Terminal("node")]]), new Rule(8, new FunApp("Node",[]),[],[[new Terminal("node's")]]), new Rule(7, new FunApp("Node",[]),[],[[new Terminal("nodes")]]), new Rule(6, new FunApp("Node",[]),[],[[new Terminal("nodes")]]), new Rule(5, new FunApp("Node",[]),[],[[new Terminal("nodes'")]]), new Rule(4, new FunApp("Next",[]),[],[[new Terminal("next")]]), new Rule(3, new FunApp("Next",[]),[],[[new Terminal("nexter")]]), new Rule(2, new FunApp("Next",[]),[],[[new Terminal("nextest")]]), new Rule(1, new FunApp("Next",[]),[],[[new Terminal("nextly")]]), new Rule(10, new FunApp("Language",[]),[],[[new Terminal("language")]]), new Rule(9, new FunApp("Language",[]),[],[[new Terminal("language")]]), new Rule(8, new FunApp("Language",[]),[],[[new Terminal("language's")]]), new Rule(7, new FunApp("Language",[]),[],[[new Terminal("languages")]]), new Rule(6, new FunApp("Language",[]),[],[[new Terminal("languages")]]), new Rule(5, new FunApp("Language",[]),[],[[new Terminal("languages'")]]), new Rule(11, new FunApp("Label",[new Arg(0)]),[10],[[new ArgProj(0, 0)]]), new Rule(10, new FunApp("Italian",[]),[],[[new Terminal("Italian")]]), new Rule(9, new FunApp("Italian",[]),[],[[new Terminal("Italian")]]), new Rule(8, new FunApp("Italian",[]),[],[[new Terminal("Italian's")]]), new Rule(7, new FunApp("Italian",[]),[],[[new Terminal("Italian")]]), new Rule(6, new FunApp("Italian",[]),[],[[new Terminal("Italian")]]), new Rule(5, new FunApp("Italian",[]),[],[[new Terminal("Italian's")]]), new Rule(10, new FunApp("Integer_N",[]),[],[[new Terminal("integer")]]), new Rule(9, new FunApp("Integer_N",[]),[],[[new Terminal("integer")]]), new Rule(8, new FunApp("Integer_N",[]),[],[[new Terminal("integer's")]]), new Rule(7, new FunApp("Integer_N",[]),[],[[new Terminal("integers")]]), new Rule(6, new FunApp("Integer_N",[]),[],[[new Terminal("integers")]]), new Rule(5, new FunApp("Integer_N",[]),[],[[new Terminal("integers'")]]), new Rule(12, new FunApp("IndefSgDet",[]),[],[[new Terminal("an")]]), new Rule(12, new FunApp("IndefSgDet",[]),[],[[new Terminal("a")]]), new Rule(15, new FunApp("IndefPlDet",[]),[],[[]]), new Rule(10, new FunApp("German",[]),[],[[new Terminal("German")]]), new Rule(9, new FunApp("German",[]),[],[[new Terminal("German")]]), new Rule(8, new FunApp("German",[]),[],[[new Terminal("German's")]]), new Rule(7, new FunApp("German",[]),[],[[new Terminal("German")]]), new Rule(6, new FunApp("German",[]),[],[[new Terminal("German")]]), new Rule(5, new FunApp("German",[]),[],[[new Terminal("German's")]]), new Rule(10, new FunApp("French",[]),[],[[new Terminal("French")]]), new Rule(9, new FunApp("French",[]),[],[[new Terminal("French")]]), new Rule(8, new FunApp("French",[]),[],[[new Terminal("French's")]]), new Rule(7, new FunApp("French",[]),[],[[new Terminal("French")]]), new Rule(6, new FunApp("French",[]),[],[[new Terminal("French")]]), new Rule(5, new FunApp("French",[]),[],[[new Terminal("French's")]]), new Rule(10, new FunApp("Float_N",[]),[],[[new Terminal("float")]]), new Rule(9, new FunApp("Float_N",[]),[],[[new Terminal("float")]]), new Rule(8, new FunApp("Float_N",[]),[],[[new Terminal("float's")]]), new Rule(7, new FunApp("Float_N",[]),[],[[new Terminal("floats")]]), new Rule(6, new FunApp("Float_N",[]),[],[[new Terminal("floats")]]), new Rule(5, new FunApp("Float_N",[]),[],[[new Terminal("floats'")]]), new Rule(10, new FunApp("Finnish",[]),[],[[new Terminal("Finnish")]]), new Rule(9, new FunApp("Finnish",[]),[],[[new Terminal("Finnish")]]), new Rule(8, new FunApp("Finnish",[]),[],[[new Terminal("Finnish's")]]), new Rule(7, new FunApp("Finnish",[]),[],[[new Terminal("Finnish")]]), new Rule(6, new FunApp("Finnish",[]),[],[[new Terminal("Finnish")]]), new Rule(5, new FunApp("Finnish",[]),[],[[new Terminal("Finnish's")]]), new Rule(11, new FunApp("ErrorMessage",[new Arg(0), new Arg(1)]),[4, 6],[[new Terminal("there"), new Terminal("aren't"), new ArgProj(0, 0), new ArgProj(1, 0)]]), new Rule(14, new FunApp("Enter",[]),[],[[new Terminal("Enter")]]), new Rule(18, new FunApp("Enter",[]),[],[[new Terminal("Enters")]]), new Rule(17, new FunApp("Enter",[]),[],[[new Terminal("Entered")]]), new Rule(16, new FunApp("Enter",[]),[],[[new Terminal("Entering")]]), new Rule(10, new FunApp("English",[]),[],[[new Terminal("English")]]), new Rule(9, new FunApp("English",[]),[],[[new Terminal("English")]]), new Rule(8, new FunApp("English",[]),[],[[new Terminal("English's")]]), new Rule(7, new FunApp("English",[]),[],[[new Terminal("English")]]), new Rule(6, new FunApp("English",[]),[],[[new Terminal("English")]]), new Rule(5, new FunApp("English",[]),[],[[new Terminal("English's")]]), new Rule(14, new FunApp("Delete",[]),[],[[new Terminal("Delete")]]), new Rule(18, new FunApp("Delete",[]),[],[[new Terminal("Deletes")]]), new Rule(17, new FunApp("Delete",[]),[],[[new Terminal("Deleted")]]), new Rule(16, new FunApp("Delete",[]),[],[[new Terminal("Deleting")]]), new Rule(12, new FunApp("DefSgDet",[]),[],[[new Terminal("the")]]), new Rule(15, new FunApp("DefPlDet",[]),[],[[new Terminal("the")]]), new Rule(10, new FunApp("Danish",[]),[],[[new Terminal("Danish")]]), new Rule(9, new FunApp("Danish",[]),[],[[new Terminal("Danish")]]), new Rule(8, new FunApp("Danish",[]),[],[[new Terminal("Danish's")]]), new Rule(7, new FunApp("Danish",[]),[],[[new Terminal("Danish")]]), new Rule(6, new FunApp("Danish",[]),[],[[new Terminal("Danish")]]), new Rule(5, new FunApp("Danish",[]),[],[[new Terminal("Danish's")]]), new Rule(14, new FunApp("Cut",[]),[],[[new Terminal("Cut")]]), new Rule(18, new FunApp("Cut",[]),[],[[new Terminal("Cuts")]]), new Rule(17, new FunApp("Cut",[]),[],[[new Terminal("Cuted")]]), new Rule(16, new FunApp("Cut",[]),[],[[new Terminal("Cuting")]]), new Rule(14, new FunApp("Copy",[]),[],[[new Terminal("Copy")]]), new Rule(18, new FunApp("Copy",[]),[],[[new Terminal("Copies")]]), new Rule(17, new FunApp("Copy",[]),[],[[new Terminal("Copied")]]), new Rule(16, new FunApp("Copy",[]),[],[[new Terminal("Copying")]]), new Rule(11, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[14, 15, 4, 6],[[new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(11, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[13, 15, 4, 6],[[new ArgProj(0, 0), new Terminal("yourself"), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(11, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[14, 12, 4, 9],[[new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(11, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[13, 12, 4, 9],[[new ArgProj(0, 0), new Terminal("yourself"), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(11, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[14, 15, 6],[[new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(11, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[13, 15, 6],[[new ArgProj(0, 0), new Terminal("yourself"), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(11, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[14, 12, 9],[[new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(11, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[13, 12, 9],[[new ArgProj(0, 0), new Terminal("yourself"), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(10, new FunApp("Bulgarian",[]),[],[[new Terminal("Bulgarian")]]), new Rule(9, new FunApp("Bulgarian",[]),[],[[new Terminal("Bulgarian")]]), new Rule(8, new FunApp("Bulgarian",[]),[],[[new Terminal("Bulgarian's")]]), new Rule(7, new FunApp("Bulgarian",[]),[],[[new Terminal("Bulgarian")]]), new Rule(6, new FunApp("Bulgarian",[]),[],[[new Terminal("Bulgarian")]]), new Rule(5, new FunApp("Bulgarian",[]),[],[[new Terminal("Bulgarian's")]]), new Rule(4, new FunApp("Available",[]),[],[[new Terminal("available")]]), new Rule(3, new FunApp("Available",[]),[],[[new Terminal("availabler")]]), new Rule(2, new FunApp("Available",[]),[],[[new Terminal("availablest")]]), new Rule(1, new FunApp("Available",[]),[],[[new Terminal("availablely")]])],{Adjective:[4, 3, 2, 1], Determiner:[12, 15], Float:[-3], Int:[-2], Noun:[10, 7, 9, 6, 8, 5], Sentence:[11], String:[-1], Verb:[13, 14, 18, 17, 16], _Var:[-4]})), EditorSwe: new GFConcrete({Available: function(cs){return new Arr(new Int(1), new Suffix("tillgänglig", Editor.concretes["EditorSwe"].rule("_0", cs)));}, Bulgarian: function(cs){return new Arr(new Int(0), new Arr(new Arr(new Suffix("Bulgariska", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Bulgariskan", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(new Suffix("Bulgariskor", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Bulgariskorna", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, Command: function(cs){return new Arr(new Seq(Editor.concretes["EditorSwe"].rule("_16", cs), Editor.concretes["EditorSwe"].rule("_17", cs), Editor.concretes["EditorSwe"].rule("_79", cs)));}, CommandAdj: function(cs){return new Arr(new Seq(Editor.concretes["EditorSwe"].rule("_16", cs), Editor.concretes["EditorSwe"].rule("_17", cs),(new Arr(Editor.concretes["EditorSwe"].rule("_179", cs), Editor.concretes["EditorSwe"].rule("_179", cs), new Arr(new Seq(Editor.concretes["EditorSwe"].rule("_68", cs), Editor.concretes["EditorSwe"].rule("_84", cs), Editor.concretes["EditorSwe"].rule("_175", cs)), new Seq(Editor.concretes["EditorSwe"].rule("_71", cs), Editor.concretes["EditorSwe"].rule("_84", cs), Editor.concretes["EditorSwe"].rule("_175", cs)), Editor.concretes["EditorSwe"].rule("_178", cs)))).sel(Editor.concretes["EditorSwe"].rule("_76", cs)).sel(Editor.concretes["EditorSwe"].rule("_78", cs))));}, Copy: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_18", cs), new Suffix("Kopiera", Editor.concretes["EditorSwe"].rule("_188", cs)), new Int(0));}, Cut: function(cs){return new Arr(new Str("ut"), new Suffix("Klipp", Editor.concretes["EditorSwe"].rule("_191", cs)), new Int(0));}, Danish: function(cs){return new Arr(new Int(0), new Arr(new Arr(new Suffix("Danska", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Danskan", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(new Suffix("Danskor", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Danskorna", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, DefPlDet: function(cs){return new Arr(new Int(2), new Int(1), new Arr(new Suffix("de", new Arr(new Str(""), new Str(""))), Editor.concretes["EditorSwe"].rule("_204", cs)));}, DefSgDet: function(cs){return new Arr(new Int(2), new Int(0), new Arr(new Suffix("de", new Arr(new Str("n"), new Str("t"))), Editor.concretes["EditorSwe"].rule("_204", cs)));}, Delete: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_18", cs), new Suffix("Radera", Editor.concretes["EditorSwe"].rule("_188", cs)), new Int(0));}, English: function(cs){return new Arr(new Int(0), new Arr(new Arr(new Suffix("Engelska", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Engelskan", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(new Suffix("Engelskor", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Engelskorna", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, Enter: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_18", cs), new Suffix("Skriv", new Arr(new Str("er"), new Str("s"), new Str(""), new Str("s"), new Str("a"), new Str("as"), new Str("d"), new Str("ds"), new Str("t"), new Str("ts"), new Str("da"), new Str("das"), new Str("da"), new Str("das"), new Str("da"), new Str("das"))), new Int(0));}, ErrorMessage: function(cs){return new Arr(new Seq(new Str("det"), new Str("finns"), new Str("inte"), Editor.concretes["EditorSwe"].rule("_204", cs).sel(Editor.concretes["EditorSwe"].rule("_40", cs)),(new Arr(new Seq(Editor.concretes["EditorSwe"].rule("_230", cs).sel(Editor.concretes["EditorSwe"].rule("_234", cs).sel(Editor.concretes["EditorSwe"].rule("_240", cs).sel(new Int(0))).sel(Editor.concretes["EditorSwe"].rule("_240", cs).sel(new Int(1)))), Editor.concretes["EditorSwe"].rule("_248", cs)), new Seq(Editor.concretes["EditorSwe"].rule("_230", cs).sel(Editor.concretes["EditorSwe"].rule("_234", cs).sel(Editor.concretes["EditorSwe"].rule("_250", cs).sel(new Int(0))).sel(Editor.concretes["EditorSwe"].rule("_250", cs).sel(new Int(1)))), Editor.concretes["EditorSwe"].rule("_248", cs)), new Seq(Editor.concretes["EditorSwe"].rule("_230", cs).sel(Editor.concretes["EditorSwe"].rule("_234", cs).sel(Editor.concretes["EditorSwe"].rule("_257", cs).sel(new Int(0))).sel(Editor.concretes["EditorSwe"].rule("_257", cs).sel(new Int(1)))), Editor.concretes["EditorSwe"].rule("_246", cs).sel(new Int(1)).sel(new Int(0))))).sel(Editor.concretes["EditorSwe"].rule("_39", cs).sel(Editor.concretes["EditorSwe"].rule("_267", cs).sel(new Int(0))).sel(Editor.concretes["EditorSwe"].rule("_267", cs).sel(new Int(1))).sel(Editor.concretes["EditorSwe"].rule("_267", cs).sel(new Int(2))))));}, Finnish: function(cs){return new Arr(new Int(0), new Arr(new Arr(new Suffix("Finska", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Finskan", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(new Suffix("Finskor", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Finskorna", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, Float_N: function(cs){return new Arr(new Int(1), new Arr(new Arr(Editor.concretes["EditorSwe"].rule("_285", cs), new Suffix("flyttalet", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(Editor.concretes["EditorSwe"].rule("_285", cs), new Suffix("flyttalen", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, French: function(cs){return new Arr(new Int(0), new Arr(new Arr(new Suffix("Franska", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Franskan", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(new Suffix("Franskor", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Franskorna", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, German: function(cs){return new Arr(new Int(0), new Arr(new Arr(new Suffix("Tyska", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Tyskan", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(new Suffix("Tyskor", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Tyskorna", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, IndefPlDet: function(cs){return new Arr(new Int(0), new Int(1), new Arr(Editor.concretes["EditorSwe"].rule("_204", cs), Editor.concretes["EditorSwe"].rule("_204", cs)));}, IndefSgDet: function(cs){return new Arr(new Int(0), new Int(0), new Arr(Editor.concretes["EditorSwe"].rule("_311", cs), Editor.concretes["EditorSwe"].rule("_311", cs)));}, Integer_N: function(cs){return new Arr(new Int(1), new Arr(new Arr(Editor.concretes["EditorSwe"].rule("_314", cs), new Suffix("heltalet", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(Editor.concretes["EditorSwe"].rule("_314", cs), new Suffix("heltalen", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, Italian: function(cs){return new Arr(new Int(0), new Arr(new Arr(new Suffix("Italienska", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Italienskan", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(new Suffix("Italienskor", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Italienskorna", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, Label: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_225", cs).sel(new Int(0)).sel(new Int(0)));}, Language: function(cs){return new Arr(new Int(1), new Arr(new Arr(Editor.concretes["EditorSwe"].rule("_332", cs), new Suffix("språket", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(Editor.concretes["EditorSwe"].rule("_332", cs), new Suffix("språken", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, Next: function(cs){return new Arr(new Int(1), new Suffix("näst", Editor.concretes["EditorSwe"].rule("_0", cs)));}, Node: function(cs){return new Arr(new Int(0), new Arr(new Arr(new Suffix("nod", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("noden", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(new Suffix("nodar", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("nodarna", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, Norwegian: function(cs){return new Arr(new Int(0), new Arr(new Arr(new Suffix("Norska", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Norskan", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(new Suffix("Norskor", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Norskorna", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, Page: function(cs){return new Arr(new Int(0), new Arr(new Arr(new Suffix("sida", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("sidan", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(new Suffix("sidor", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("sidorna", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, Parse: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_18", cs), new Suffix("Parsa", Editor.concretes["EditorSwe"].rule("_188", cs)), new Int(0));}, Paste: function(cs){return new Arr(new Str("in"), new Suffix("Klistra", Editor.concretes["EditorSwe"].rule("_188", cs)), new Int(0));}, Previous: function(cs){return new Arr(new Int(1), new Arr(new Str("föregående"), new Str("föregåendes"), new Str("föregående"), new Str("föregåendes"), new Str("föregående"), new Str("föregåendes"), new Str("föregående"), new Str("föregåendes"), new Str("föregående"), new Str("föregåendes"), Editor.concretes["EditorSwe"].rule("_18", cs), new Str("s"), Editor.concretes["EditorSwe"].rule("_18", cs), new Str("s"), new Str("a"), new Str("as")));}, RandomlyCommand: function(cs){return new Arr(new Seq(Editor.concretes["EditorSwe"].rule("_16", cs), Editor.concretes["EditorSwe"].rule("_17", cs), Editor.concretes["EditorSwe"].rule("_79", cs), new Str("slumpmässigt")));}, Redo: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_18", cs), new Suffix("Upprepa", Editor.concretes["EditorSwe"].rule("_188", cs)), new Int(0));}, Refine: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_18", cs), new Suffix("Raffinera", Editor.concretes["EditorSwe"].rule("_188", cs)), new Int(0));}, Refinement: function(cs){return new Arr(new Int(0), new Arr(new Arr(new Suffix("raffinemang", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("raffinemangen", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(new Suffix("raffinemangar", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("raffinemangarna", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, Replace: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_18", cs), new Suffix("Ersätt", Editor.concretes["EditorSwe"].rule("_191", cs)), new Int(0));}, Russian: function(cs){return new Arr(new Int(0), new Arr(new Arr(new Suffix("Ryska", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Ryskan", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(new Suffix("Ryskor", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Ryskorna", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, Select: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_18", cs), new Suffix("Välj", Editor.concretes["EditorSwe"].rule("_191", cs)), new Int(0));}, Show: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_18", cs), new Suffix("Visa", Editor.concretes["EditorSwe"].rule("_188", cs)), new Int(0));}, SingleWordCommand: function(cs){return new Arr(new Seq(Editor.concretes["EditorSwe"].rule("_16", cs), Editor.concretes["EditorSwe"].rule("_17", cs),(new Arr(Editor.concretes["EditorSwe"].rule("_399", cs), Editor.concretes["EditorSwe"].rule("_399", cs), new Arr(Editor.concretes["EditorSwe"].rule("_68", cs), Editor.concretes["EditorSwe"].rule("_71", cs), Editor.concretes["EditorSwe"].rule("_64", cs)))).sel(Editor.concretes["EditorSwe"].rule("_76", cs)).sel(Editor.concretes["EditorSwe"].rule("_78", cs))));}, Spanish: function(cs){return new Arr(new Int(0), new Arr(new Arr(new Suffix("Spanska", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Spanskan", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(new Suffix("Spanskor", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Spanskorna", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, String_N: function(cs){return new Arr(new Int(0), new Arr(new Arr(new Suffix("sträng", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("strängen", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(new Suffix("strängar", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("strängarna", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, Swedish: function(cs){return new Arr(new Int(0), new Arr(new Arr(new Suffix("Svenska", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Svenskan", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(new Suffix("Svenskor", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("Svenskorna", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, This: function(cs){return new Arr(new Int(2), new Int(0), new Arr(Editor.concretes["EditorSwe"].rule("_432", cs), Editor.concretes["EditorSwe"].rule("_432", cs)));}, Tree: function(cs){return new Arr(new Int(1), new Arr(new Arr(Editor.concretes["EditorSwe"].rule("_435", cs), new Suffix("trädet", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(Editor.concretes["EditorSwe"].rule("_435", cs), new Suffix("träden", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, Undo: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_18", cs), new Suffix("Ångra", Editor.concretes["EditorSwe"].rule("_188", cs)), new Int(0));}, Wrap: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_18", cs), new Suffix("Förpacka", Editor.concretes["EditorSwe"].rule("_188", cs)), new Int(0));}, Wrapper: function(cs){return new Arr(new Int(0), new Arr(new Arr(new Suffix("förpackning", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("förpackningen", Editor.concretes["EditorSwe"].rule("_3", cs))), new Arr(new Suffix("förpackningar", Editor.concretes["EditorSwe"].rule("_3", cs)), new Suffix("förpackningarna", Editor.concretes["EditorSwe"].rule("_3", cs)))));}, _0: function(cs){return new Arr(new Str(""), new Str("s"), new Str("t"), new Str("ts"), new Str("a"), new Str("as"), new Str("a"), new Str("as"), new Str("a"), new Str("as"), new Str("are"), new Str("ares"), new Str("ast"), new Str("asts"), new Str("aste"), new Str("astes"));}, _100: function(cs){return Editor.concretes["EditorSwe"].rule("_98", cs).sel(Editor.concretes["EditorSwe"].rule("_99", cs));}, _101: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_100", cs), new Int(0));}, _102: function(cs){return Editor.concretes["EditorSwe"].rule("_101", cs).sel(new Int(0));}, _103: function(cs){return Editor.concretes["EditorSwe"].rule("_93", cs).sel(Editor.concretes["EditorSwe"].rule("_102", cs));}, _104: function(cs){return Editor.concretes["EditorSwe"].rule("_101", cs).sel(new Int(1));}, _105: function(cs){return Editor.concretes["EditorSwe"].rule("_103", cs).sel(Editor.concretes["EditorSwe"].rule("_104", cs));}, _106: function(cs){return Editor.concretes["EditorSwe"].rule("_89", cs).sel(Editor.concretes["EditorSwe"].rule("_105", cs));}, _107: function(cs){return cs[3].sel(new Int(1));}, _108: function(cs){return Editor.concretes["EditorSwe"].rule("_107", cs).sel(new Int(0));}, _109: function(cs){return Editor.concretes["EditorSwe"].rule("_108", cs).sel(new Int(0));}, _110: function(cs){return Editor.concretes["EditorSwe"].rule("_109", cs).sel(new Int(0));}, _111: function(cs){return new Seq(Editor.concretes["EditorSwe"].rule("_106", cs), Editor.concretes["EditorSwe"].rule("_110", cs));}, _112: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_100", cs), new Int(1));}, _113: function(cs){return Editor.concretes["EditorSwe"].rule("_112", cs).sel(new Int(0));}, _114: function(cs){return Editor.concretes["EditorSwe"].rule("_93", cs).sel(Editor.concretes["EditorSwe"].rule("_113", cs));}, _115: function(cs){return Editor.concretes["EditorSwe"].rule("_112", cs).sel(new Int(1));}, _116: function(cs){return Editor.concretes["EditorSwe"].rule("_114", cs).sel(Editor.concretes["EditorSwe"].rule("_115", cs));}, _117: function(cs){return Editor.concretes["EditorSwe"].rule("_89", cs).sel(Editor.concretes["EditorSwe"].rule("_116", cs));}, _118: function(cs){return new Seq(Editor.concretes["EditorSwe"].rule("_117", cs), Editor.concretes["EditorSwe"].rule("_110", cs));}, _119: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_100", cs), new Int(2));}, _12: function(cs){return cs[0].sel(new Int(1));}, _120: function(cs){return Editor.concretes["EditorSwe"].rule("_119", cs).sel(new Int(0));}, _121: function(cs){return Editor.concretes["EditorSwe"].rule("_93", cs).sel(Editor.concretes["EditorSwe"].rule("_120", cs));}, _122: function(cs){return Editor.concretes["EditorSwe"].rule("_119", cs).sel(new Int(1));}, _123: function(cs){return Editor.concretes["EditorSwe"].rule("_121", cs).sel(Editor.concretes["EditorSwe"].rule("_122", cs));}, _124: function(cs){return Editor.concretes["EditorSwe"].rule("_89", cs).sel(Editor.concretes["EditorSwe"].rule("_123", cs));}, _125: function(cs){return Editor.concretes["EditorSwe"].rule("_108", cs).sel(new Int(1));}, _126: function(cs){return Editor.concretes["EditorSwe"].rule("_125", cs).sel(new Int(0));}, _127: function(cs){return new Seq(Editor.concretes["EditorSwe"].rule("_124", cs), Editor.concretes["EditorSwe"].rule("_126", cs));}, _128: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_111", cs), Editor.concretes["EditorSwe"].rule("_118", cs), Editor.concretes["EditorSwe"].rule("_127", cs));}, _129: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_40", cs), new Int(1), new Int(0));}, _13: function(cs){return new Arr(new Int(2), new Int(3), new Int(2));}, _130: function(cs){return Editor.concretes["EditorSwe"].rule("_129", cs).sel(new Int(0));}, _131: function(cs){return Editor.concretes["EditorSwe"].rule("_39", cs).sel(Editor.concretes["EditorSwe"].rule("_130", cs));}, _132: function(cs){return Editor.concretes["EditorSwe"].rule("_129", cs).sel(new Int(1));}, _133: function(cs){return Editor.concretes["EditorSwe"].rule("_131", cs).sel(Editor.concretes["EditorSwe"].rule("_132", cs));}, _134: function(cs){return Editor.concretes["EditorSwe"].rule("_129", cs).sel(new Int(2));}, _135: function(cs){return Editor.concretes["EditorSwe"].rule("_133", cs).sel(Editor.concretes["EditorSwe"].rule("_134", cs));}, _136: function(cs){return Editor.concretes["EditorSwe"].rule("_128", cs).sel(Editor.concretes["EditorSwe"].rule("_135", cs));}, _137: function(cs){return Editor.concretes["EditorSwe"].rule("_37", cs).sel(Editor.concretes["EditorSwe"].rule("_83", cs));}, _138: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_137", cs), new Int(3), new Int(3));}, _139: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_137", cs), new Int(4), new Int(4));}, _14: function(cs){return cs[0].sel(new Int(2));}, _140: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_138", cs), Editor.concretes["EditorSwe"].rule("_138", cs), Editor.concretes["EditorSwe"].rule("_139", cs));}, _141: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_83", cs), new Int(1));}, _142: function(cs){return Editor.concretes["EditorSwe"].rule("_141", cs).sel(new Int(0));}, _143: function(cs){return Editor.concretes["EditorSwe"].rule("_95", cs).sel(Editor.concretes["EditorSwe"].rule("_142", cs));}, _144: function(cs){return Editor.concretes["EditorSwe"].rule("_141", cs).sel(new Int(1));}, _145: function(cs){return Editor.concretes["EditorSwe"].rule("_143", cs).sel(Editor.concretes["EditorSwe"].rule("_144", cs));}, _146: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_145", cs), new Int(0));}, _147: function(cs){return Editor.concretes["EditorSwe"].rule("_146", cs).sel(new Int(0));}, _148: function(cs){return Editor.concretes["EditorSwe"].rule("_140", cs).sel(Editor.concretes["EditorSwe"].rule("_147", cs));}, _149: function(cs){return Editor.concretes["EditorSwe"].rule("_146", cs).sel(new Int(1));}, _15: function(cs){return Editor.concretes["EditorSwe"].rule("_13", cs).sel(Editor.concretes["EditorSwe"].rule("_14", cs));}, _150: function(cs){return Editor.concretes["EditorSwe"].rule("_148", cs).sel(Editor.concretes["EditorSwe"].rule("_149", cs));}, _151: function(cs){return Editor.concretes["EditorSwe"].rule("_89", cs).sel(Editor.concretes["EditorSwe"].rule("_150", cs));}, _152: function(cs){return Editor.concretes["EditorSwe"].rule("_107", cs).sel(new Int(1));}, _153: function(cs){return Editor.concretes["EditorSwe"].rule("_152", cs).sel(new Int(0));}, _154: function(cs){return Editor.concretes["EditorSwe"].rule("_153", cs).sel(new Int(0));}, _155: function(cs){return new Seq(Editor.concretes["EditorSwe"].rule("_151", cs), Editor.concretes["EditorSwe"].rule("_154", cs));}, _156: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_145", cs), new Int(1));}, _157: function(cs){return Editor.concretes["EditorSwe"].rule("_156", cs).sel(new Int(0));}, _158: function(cs){return Editor.concretes["EditorSwe"].rule("_140", cs).sel(Editor.concretes["EditorSwe"].rule("_157", cs));}, _159: function(cs){return Editor.concretes["EditorSwe"].rule("_156", cs).sel(new Int(1));}, _16: function(cs){return Editor.concretes["EditorSwe"].rule("_12", cs).sel(Editor.concretes["EditorSwe"].rule("_15", cs));}, _160: function(cs){return Editor.concretes["EditorSwe"].rule("_158", cs).sel(Editor.concretes["EditorSwe"].rule("_159", cs));}, _161: function(cs){return Editor.concretes["EditorSwe"].rule("_89", cs).sel(Editor.concretes["EditorSwe"].rule("_160", cs));}, _162: function(cs){return new Seq(Editor.concretes["EditorSwe"].rule("_161", cs), Editor.concretes["EditorSwe"].rule("_154", cs));}, _163: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_145", cs), new Int(2));}, _164: function(cs){return Editor.concretes["EditorSwe"].rule("_163", cs).sel(new Int(0));}, _165: function(cs){return Editor.concretes["EditorSwe"].rule("_140", cs).sel(Editor.concretes["EditorSwe"].rule("_164", cs));}, _166: function(cs){return Editor.concretes["EditorSwe"].rule("_163", cs).sel(new Int(1));}, _167: function(cs){return Editor.concretes["EditorSwe"].rule("_165", cs).sel(Editor.concretes["EditorSwe"].rule("_166", cs));}, _168: function(cs){return Editor.concretes["EditorSwe"].rule("_89", cs).sel(Editor.concretes["EditorSwe"].rule("_167", cs));}, _169: function(cs){return Editor.concretes["EditorSwe"].rule("_152", cs).sel(new Int(1));}, _17: function(cs){return cs[0].sel(new Int(0));}, _170: function(cs){return Editor.concretes["EditorSwe"].rule("_169", cs).sel(new Int(0));}, _171: function(cs){return new Seq(Editor.concretes["EditorSwe"].rule("_168", cs), Editor.concretes["EditorSwe"].rule("_170", cs));}, _172: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_155", cs), Editor.concretes["EditorSwe"].rule("_162", cs), Editor.concretes["EditorSwe"].rule("_171", cs));}, _173: function(cs){return Editor.concretes["EditorSwe"].rule("_172", cs).sel(Editor.concretes["EditorSwe"].rule("_135", cs));}, _174: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_136", cs), Editor.concretes["EditorSwe"].rule("_173", cs));}, _175: function(cs){return Editor.concretes["EditorSwe"].rule("_174", cs).sel(Editor.concretes["EditorSwe"].rule("_57", cs));}, _176: function(cs){return new Seq(Editor.concretes["EditorSwe"].rule("_20", cs), Editor.concretes["EditorSwe"].rule("_84", cs), Editor.concretes["EditorSwe"].rule("_175", cs));}, _177: function(cs){return new Seq(Editor.concretes["EditorSwe"].rule("_61", cs), Editor.concretes["EditorSwe"].rule("_84", cs), Editor.concretes["EditorSwe"].rule("_175", cs));}, _178: function(cs){return new Seq(Editor.concretes["EditorSwe"].rule("_64", cs), Editor.concretes["EditorSwe"].rule("_84", cs), Editor.concretes["EditorSwe"].rule("_175", cs));}, _179: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_176", cs), Editor.concretes["EditorSwe"].rule("_177", cs), Editor.concretes["EditorSwe"].rule("_178", cs));}, _18: function(cs){return new Seq();}, _188: function(cs){return new Arr(new Str("r"), new Str("s"), new Str(""), new Str("s"), new Str(""), new Str("s"), new Str("d"), new Str("ds"), new Str("t"), new Str("ts"), new Str("de"), new Str("des"), new Str("de"), new Str("des"), new Str("de"), new Str("des"));}, _19: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_18", cs), Editor.concretes["EditorSwe"].rule("_18", cs), new Str("mig"));}, _191: function(cs){return new Arr(new Str("er"), new Str("s"), new Str(""), new Str("s"), new Str("a"), new Str("as"), new Str("t"), new Str("ts"), new Str("t"), new Str("ts"), new Str("ta"), new Str("tas"), new Str("ta"), new Str("tas"), new Str("ta"), new Str("tas"));}, _20: function(cs){return Editor.concretes["EditorSwe"].rule("_19", cs).sel(Editor.concretes["EditorSwe"].rule("_14", cs));}, _204: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_18", cs), Editor.concretes["EditorSwe"].rule("_18", cs));}, _21: function(cs){return cs[1].sel(new Int(2));}, _22: function(cs){return Editor.concretes["EditorSwe"].rule("_21", cs).sel(new Int(1));}, _225: function(cs){return Editor.concretes["EditorSwe"].rule("_12", cs).sel(new Int(0));}, _226: function(cs){return Editor.concretes["EditorSwe"].rule("_12", cs).sel(new Int(2));}, _227: function(cs){return Editor.concretes["EditorSwe"].rule("_12", cs).sel(new Int(4));}, _228: function(cs){return Editor.concretes["EditorSwe"].rule("_12", cs).sel(new Int(6));}, _229: function(cs){return Editor.concretes["EditorSwe"].rule("_12", cs).sel(new Int(8));}, _23: function(cs){return cs[2].sel(new Int(0));}, _230: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_225", cs), Editor.concretes["EditorSwe"].rule("_226", cs), Editor.concretes["EditorSwe"].rule("_227", cs), Editor.concretes["EditorSwe"].rule("_228", cs), Editor.concretes["EditorSwe"].rule("_229", cs));}, _231: function(cs){return Editor.concretes["EditorSwe"].rule("_37", cs).sel(Editor.concretes["EditorSwe"].rule("_40", cs));}, _232: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_231", cs), new Int(3), new Int(3));}, _233: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_231", cs), new Int(4), new Int(4));}, _234: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_232", cs), Editor.concretes["EditorSwe"].rule("_232", cs), Editor.concretes["EditorSwe"].rule("_233", cs));}, _235: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_40", cs), new Int(1));}, _236: function(cs){return Editor.concretes["EditorSwe"].rule("_235", cs).sel(new Int(0));}, _237: function(cs){return Editor.concretes["EditorSwe"].rule("_95", cs).sel(Editor.concretes["EditorSwe"].rule("_236", cs));}, _238: function(cs){return Editor.concretes["EditorSwe"].rule("_235", cs).sel(new Int(1));}, _239: function(cs){return Editor.concretes["EditorSwe"].rule("_237", cs).sel(Editor.concretes["EditorSwe"].rule("_238", cs));}, _24: function(cs){return Editor.concretes["EditorSwe"].rule("_22", cs).sel(Editor.concretes["EditorSwe"].rule("_23", cs));}, _240: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_239", cs), new Int(0));}, _246: function(cs){return Editor.concretes["EditorSwe"].rule("_57", cs).sel(new Int(1));}, _247: function(cs){return Editor.concretes["EditorSwe"].rule("_246", cs).sel(new Int(0));}, _248: function(cs){return Editor.concretes["EditorSwe"].rule("_247", cs).sel(new Int(0));}, _25: function(cs){return cs[2].sel(new Int(1));}, _250: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_239", cs), new Int(1));}, _257: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_239", cs), new Int(2));}, _26: function(cs){return Editor.concretes["EditorSwe"].rule("_25", cs).sel(new Int(0));}, _267: function(cs){return new Arr(new Int(0), new Int(1), new Int(0));}, _27: function(cs){return Editor.concretes["EditorSwe"].rule("_26", cs).sel(new Int(0));}, _28: function(cs){return Editor.concretes["EditorSwe"].rule("_27", cs).sel(new Int(0));}, _285: function(cs){return new Suffix("flyttal", Editor.concretes["EditorSwe"].rule("_3", cs));}, _29: function(cs){return Editor.concretes["EditorSwe"].rule("_26", cs).sel(new Int(1));}, _3: function(cs){return new Arr(new Str(""), new Str("s"));}, _30: function(cs){return Editor.concretes["EditorSwe"].rule("_29", cs).sel(new Int(0));}, _31: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_28", cs), Editor.concretes["EditorSwe"].rule("_28", cs), Editor.concretes["EditorSwe"].rule("_30", cs));}, _310: function(cs){return new Arr(new Str("n"), new Str("tt"));}, _311: function(cs){return new Suffix("e", Editor.concretes["EditorSwe"].rule("_310", cs));}, _314: function(cs){return new Suffix("heltal", Editor.concretes["EditorSwe"].rule("_3", cs));}, _32: function(cs){return new Arr(new Int(0), new Int(0));}, _33: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_32", cs), Editor.concretes["EditorSwe"].rule("_32", cs));}, _332: function(cs){return new Suffix("språk", Editor.concretes["EditorSwe"].rule("_3", cs));}, _34: function(cs){return new Arr(new Int(1), new Int(1));}, _35: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_34", cs), Editor.concretes["EditorSwe"].rule("_34", cs));}, _36: function(cs){return new Arr(new Int(1), new Int(2));}, _37: function(cs){return new Arr(new Int(2), new Int(2));}, _38: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_36", cs), Editor.concretes["EditorSwe"].rule("_37", cs));}, _39: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_33", cs), Editor.concretes["EditorSwe"].rule("_35", cs), Editor.concretes["EditorSwe"].rule("_38", cs));}, _399: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_20", cs), Editor.concretes["EditorSwe"].rule("_61", cs), Editor.concretes["EditorSwe"].rule("_64", cs));}, _40: function(cs){return cs[1].sel(new Int(0));}, _41: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_40", cs), new Int(1), new Int(1));}, _42: function(cs){return Editor.concretes["EditorSwe"].rule("_41", cs).sel(new Int(0));}, _43: function(cs){return Editor.concretes["EditorSwe"].rule("_39", cs).sel(Editor.concretes["EditorSwe"].rule("_42", cs));}, _430: function(cs){return new Seq(new Str("den"), new Str("här"));}, _431: function(cs){return new Seq(new Str("det"), new Str("här"));}, _432: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_430", cs), Editor.concretes["EditorSwe"].rule("_431", cs));}, _435: function(cs){return new Suffix("träd", Editor.concretes["EditorSwe"].rule("_3", cs));}, _44: function(cs){return Editor.concretes["EditorSwe"].rule("_41", cs).sel(new Int(1));}, _45: function(cs){return Editor.concretes["EditorSwe"].rule("_43", cs).sel(Editor.concretes["EditorSwe"].rule("_44", cs));}, _454: function(cs){return new Arr(cs[0], cs[0], cs[0], cs[0], cs[0], cs[0], cs[0], cs[0], cs[0], cs[0], cs[0], cs[0], cs[0], cs[0], cs[0], cs[0]);}, _456: function(cs){return new Arr(cs[0], cs[0]);}, _457: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_456", cs), Editor.concretes["EditorSwe"].rule("_456", cs));}, _46: function(cs){return Editor.concretes["EditorSwe"].rule("_41", cs).sel(new Int(2));}, _47: function(cs){return Editor.concretes["EditorSwe"].rule("_45", cs).sel(Editor.concretes["EditorSwe"].rule("_46", cs));}, _48: function(cs){return Editor.concretes["EditorSwe"].rule("_31", cs).sel(Editor.concretes["EditorSwe"].rule("_47", cs));}, _49: function(cs){return Editor.concretes["EditorSwe"].rule("_25", cs).sel(new Int(1));}, _50: function(cs){return Editor.concretes["EditorSwe"].rule("_49", cs).sel(new Int(0));}, _51: function(cs){return Editor.concretes["EditorSwe"].rule("_50", cs).sel(new Int(0));}, _52: function(cs){return Editor.concretes["EditorSwe"].rule("_49", cs).sel(new Int(1));}, _53: function(cs){return Editor.concretes["EditorSwe"].rule("_52", cs).sel(new Int(0));}, _54: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_51", cs), Editor.concretes["EditorSwe"].rule("_51", cs), Editor.concretes["EditorSwe"].rule("_53", cs));}, _55: function(cs){return Editor.concretes["EditorSwe"].rule("_54", cs).sel(Editor.concretes["EditorSwe"].rule("_47", cs));}, _56: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_48", cs), Editor.concretes["EditorSwe"].rule("_55", cs));}, _57: function(cs){return cs[1].sel(new Int(1));}, _58: function(cs){return Editor.concretes["EditorSwe"].rule("_56", cs).sel(Editor.concretes["EditorSwe"].rule("_57", cs));}, _59: function(cs){return new Seq(Editor.concretes["EditorSwe"].rule("_20", cs), Editor.concretes["EditorSwe"].rule("_24", cs), Editor.concretes["EditorSwe"].rule("_58", cs));}, _60: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_18", cs), Editor.concretes["EditorSwe"].rule("_18", cs), new Str("dig"));}, _61: function(cs){return Editor.concretes["EditorSwe"].rule("_60", cs).sel(Editor.concretes["EditorSwe"].rule("_14", cs));}, _62: function(cs){return new Seq(Editor.concretes["EditorSwe"].rule("_61", cs), Editor.concretes["EditorSwe"].rule("_24", cs), Editor.concretes["EditorSwe"].rule("_58", cs));}, _63: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_18", cs), Editor.concretes["EditorSwe"].rule("_18", cs), new Str("sig"));}, _64: function(cs){return Editor.concretes["EditorSwe"].rule("_63", cs).sel(Editor.concretes["EditorSwe"].rule("_14", cs));}, _65: function(cs){return new Seq(Editor.concretes["EditorSwe"].rule("_64", cs), Editor.concretes["EditorSwe"].rule("_24", cs), Editor.concretes["EditorSwe"].rule("_58", cs));}, _66: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_59", cs), Editor.concretes["EditorSwe"].rule("_62", cs), Editor.concretes["EditorSwe"].rule("_65", cs));}, _67: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_18", cs), Editor.concretes["EditorSwe"].rule("_18", cs), new Str("oss"));}, _68: function(cs){return Editor.concretes["EditorSwe"].rule("_67", cs).sel(Editor.concretes["EditorSwe"].rule("_14", cs));}, _69: function(cs){return new Seq(Editor.concretes["EditorSwe"].rule("_68", cs), Editor.concretes["EditorSwe"].rule("_24", cs), Editor.concretes["EditorSwe"].rule("_58", cs));}, _70: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_18", cs), Editor.concretes["EditorSwe"].rule("_18", cs), new Str("er"));}, _71: function(cs){return Editor.concretes["EditorSwe"].rule("_70", cs).sel(Editor.concretes["EditorSwe"].rule("_14", cs));}, _72: function(cs){return new Seq(Editor.concretes["EditorSwe"].rule("_71", cs), Editor.concretes["EditorSwe"].rule("_24", cs), Editor.concretes["EditorSwe"].rule("_58", cs));}, _73: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_69", cs), Editor.concretes["EditorSwe"].rule("_72", cs), Editor.concretes["EditorSwe"].rule("_65", cs));}, _74: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_66", cs), Editor.concretes["EditorSwe"].rule("_66", cs), Editor.concretes["EditorSwe"].rule("_73", cs));}, _75: function(cs){return new Arr(new Int(0), new Int(1));}, _76: function(cs){return Editor.concretes["EditorSwe"].rule("_75", cs).sel(new Int(0));}, _77: function(cs){return Editor.concretes["EditorSwe"].rule("_74", cs).sel(Editor.concretes["EditorSwe"].rule("_76", cs));}, _78: function(cs){return Editor.concretes["EditorSwe"].rule("_75", cs).sel(new Int(1));}, _79: function(cs){return Editor.concretes["EditorSwe"].rule("_77", cs).sel(Editor.concretes["EditorSwe"].rule("_78", cs));}, _82: function(cs){return Editor.concretes["EditorSwe"].rule("_21", cs).sel(new Int(0));}, _83: function(cs){return cs[3].sel(new Int(0));}, _84: function(cs){return Editor.concretes["EditorSwe"].rule("_82", cs).sel(Editor.concretes["EditorSwe"].rule("_83", cs));}, _85: function(cs){return Editor.concretes["EditorSwe"].rule("_25", cs).sel(new Int(2));}, _86: function(cs){return Editor.concretes["EditorSwe"].rule("_25", cs).sel(new Int(4));}, _87: function(cs){return Editor.concretes["EditorSwe"].rule("_25", cs).sel(new Int(6));}, _88: function(cs){return Editor.concretes["EditorSwe"].rule("_25", cs).sel(new Int(8));}, _89: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_26", cs), Editor.concretes["EditorSwe"].rule("_85", cs), Editor.concretes["EditorSwe"].rule("_86", cs), Editor.concretes["EditorSwe"].rule("_87", cs), Editor.concretes["EditorSwe"].rule("_88", cs));}, _90: function(cs){return Editor.concretes["EditorSwe"].rule("_75", cs).sel(Editor.concretes["EditorSwe"].rule("_83", cs));}, _91: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_90", cs), new Int(3), new Int(3));}, _92: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_90", cs), new Int(4), new Int(4));}, _93: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_91", cs), Editor.concretes["EditorSwe"].rule("_91", cs), Editor.concretes["EditorSwe"].rule("_92", cs));}, _94: function(cs){return new Arr(new Int(0), new Int(2));}, _95: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_94", cs), Editor.concretes["EditorSwe"].rule("_36", cs));}, _96: function(cs){return new Arr(Editor.concretes["EditorSwe"].rule("_83", cs), new Int(0));}, _97: function(cs){return Editor.concretes["EditorSwe"].rule("_96", cs).sel(new Int(0));}, _98: function(cs){return Editor.concretes["EditorSwe"].rule("_95", cs).sel(Editor.concretes["EditorSwe"].rule("_97", cs));}, _99: function(cs){return Editor.concretes["EditorSwe"].rule("_96", cs).sel(new Int(1));}, Adjective: function(cs){return new Arr(new Int(0), Editor.concretes["EditorSwe"].rule("_454", cs));}, Determiner: function(cs){return new Arr(new Int(0), new Int(0), Editor.concretes["EditorSwe"].rule("_457", cs));}, Noun: function(cs){return new Arr(new Int(0), new Arr(Editor.concretes["EditorSwe"].rule("_457", cs), Editor.concretes["EditorSwe"].rule("_457", cs)));}, Sentence: function(cs){return new Arr(cs[0]);}, Verb: function(cs){return new Arr(cs[0], Editor.concretes["EditorSwe"].rule("_454", cs), new Int(0));}, Int: function(cs){return new Arr(cs[0]);}, Float: function(cs){return new Arr(cs[0]);}, String: function(cs){return new Arr(cs[0]);}}, new Parser("Sentence",[new Rule(27, new FunApp("Copy",[]),[],[[],[new Terminal("Kopiera")]]), new Rule(27, new FunApp("Cut",[]),[],[[new Terminal("ut")],[new Terminal("Klipp")]]), new Rule(27, new FunApp("Delete",[]),[],[[],[new Terminal("Radera")]]), new Rule(27, new FunApp("Enter",[]),[],[[],[new Terminal("Skriv")]]), new Rule(27, new FunApp("Parse",[]),[],[[],[new Terminal("Parsa")]]), new Rule(27, new FunApp("Paste",[]),[],[[new Terminal("in")],[new Terminal("Klistra")]]), new Rule(27, new FunApp("Redo",[]),[],[[],[new Terminal("Upprepa")]]), new Rule(27, new FunApp("Refine",[]),[],[[],[new Terminal("Raffinera")]]), new Rule(27, new FunApp("Replace",[]),[],[[],[new Terminal("Ersätt")]]), new Rule(27, new FunApp("Select",[]),[],[[],[new Terminal("Välj")]]), new Rule(27, new FunApp("Show",[]),[],[[],[new Terminal("Visa")]]), new Rule(27, new FunApp("Undo",[]),[],[[],[new Terminal("Ångra")]]), new Rule(27, new FunApp("Wrap",[]),[],[[],[new Terminal("Förpacka")]]), new Rule(24, new FunApp("Wrapper",[]),[],[[new Terminal("förpackning")]]), new Rule(23, new FunApp("Wrapper",[]),[],[[new Terminal("förpacknings")]]), new Rule(22, new FunApp("Wrapper",[]),[],[[new Terminal("förpackningen")]]), new Rule(21, new FunApp("Wrapper",[]),[],[[new Terminal("förpackningens")]]), new Rule(20, new FunApp("Wrapper",[]),[],[[new Terminal("förpackningar")]]), new Rule(19, new FunApp("Wrapper",[]),[],[[new Terminal("förpackningars")]]), new Rule(18, new FunApp("Wrapper",[]),[],[[new Terminal("förpackningarna")]]), new Rule(17, new FunApp("Wrapper",[]),[],[[new Terminal("förpackningarnas")]]), new Rule(83, new FunApp("Wrap",[]),[],[[]]), new Rule(82, new FunApp("Wrap",[]),[],[[new Terminal("Förpackar")]]), new Rule(81, new FunApp("Wrap",[]),[],[[new Terminal("Förpackas")]]), new Rule(80, new FunApp("Wrap",[]),[],[[new Terminal("Förpacka")]]), new Rule(79, new FunApp("Wrap",[]),[],[[new Terminal("Förpackas")]]), new Rule(78, new FunApp("Wrap",[]),[],[[new Terminal("Förpacka")]]), new Rule(77, new FunApp("Wrap",[]),[],[[new Terminal("Förpackas")]]), new Rule(76, new FunApp("Wrap",[]),[],[[new Terminal("Förpackad")]]), new Rule(75, new FunApp("Wrap",[]),[],[[new Terminal("Förpackads")]]), new Rule(74, new FunApp("Wrap",[]),[],[[new Terminal("Förpackat")]]), new Rule(73, new FunApp("Wrap",[]),[],[[new Terminal("Förpackats")]]), new Rule(72, new FunApp("Wrap",[]),[],[[new Terminal("Förpackade")]]), new Rule(71, new FunApp("Wrap",[]),[],[[new Terminal("Förpackades")]]), new Rule(70, new FunApp("Wrap",[]),[],[[new Terminal("Förpackade")]]), new Rule(69, new FunApp("Wrap",[]),[],[[new Terminal("Förpackades")]]), new Rule(68, new FunApp("Wrap",[]),[],[[new Terminal("Förpackade")]]), new Rule(67, new FunApp("Wrap",[]),[],[[new Terminal("Förpackades")]]), new Rule(83, new FunApp("Undo",[]),[],[[]]), new Rule(82, new FunApp("Undo",[]),[],[[new Terminal("Ångrar")]]), new Rule(81, new FunApp("Undo",[]),[],[[new Terminal("Ångras")]]), new Rule(80, new FunApp("Undo",[]),[],[[new Terminal("Ångra")]]), new Rule(79, new FunApp("Undo",[]),[],[[new Terminal("Ångras")]]), new Rule(78, new FunApp("Undo",[]),[],[[new Terminal("Ångra")]]), new Rule(77, new FunApp("Undo",[]),[],[[new Terminal("Ångras")]]), new Rule(76, new FunApp("Undo",[]),[],[[new Terminal("Ångrad")]]), new Rule(75, new FunApp("Undo",[]),[],[[new Terminal("Ångrads")]]), new Rule(74, new FunApp("Undo",[]),[],[[new Terminal("Ångrat")]]), new Rule(73, new FunApp("Undo",[]),[],[[new Terminal("Ångrats")]]), new Rule(72, new FunApp("Undo",[]),[],[[new Terminal("Ångrade")]]), new Rule(71, new FunApp("Undo",[]),[],[[new Terminal("Ångrades")]]), new Rule(70, new FunApp("Undo",[]),[],[[new Terminal("Ångrade")]]), new Rule(69, new FunApp("Undo",[]),[],[[new Terminal("Ångrades")]]), new Rule(68, new FunApp("Undo",[]),[],[[new Terminal("Ångrade")]]), new Rule(67, new FunApp("Undo",[]),[],[[new Terminal("Ångrades")]]), new Rule(30, new FunApp("Tree",[]),[],[[new Terminal("träd")]]), new Rule(87, new FunApp("Tree",[]),[],[[new Terminal("träds")]]), new Rule(35, new FunApp("Tree",[]),[],[[new Terminal("trädet")]]), new Rule(86, new FunApp("Tree",[]),[],[[new Terminal("trädets")]]), new Rule(38, new FunApp("Tree",[]),[],[[new Terminal("träd")]]), new Rule(85, new FunApp("Tree",[]),[],[[new Terminal("träds")]]), new Rule(43, new FunApp("Tree",[]),[],[[new Terminal("träden")]]), new Rule(84, new FunApp("Tree",[]),[],[[new Terminal("trädens")]]), new Rule(55, new FunApp("This",[]),[],[[new Terminal("den"), new Terminal("här")]]), new Rule(56, new FunApp("This",[]),[],[[new Terminal("det"), new Terminal("här")]]), new Rule(34, new FunApp("This",[]),[],[[new Terminal("den"), new Terminal("här")]]), new Rule(36, new FunApp("This",[]),[],[[new Terminal("det"), new Terminal("här")]]), new Rule(24, new FunApp("Swedish",[]),[],[[new Terminal("Svenska")]]), new Rule(23, new FunApp("Swedish",[]),[],[[new Terminal("Svenskas")]]), new Rule(22, new FunApp("Swedish",[]),[],[[new Terminal("Svenskan")]]), new Rule(21, new FunApp("Swedish",[]),[],[[new Terminal("Svenskans")]]), new Rule(20, new FunApp("Swedish",[]),[],[[new Terminal("Svenskor")]]), new Rule(19, new FunApp("Swedish",[]),[],[[new Terminal("Svenskors")]]), new Rule(18, new FunApp("Swedish",[]),[],[[new Terminal("Svenskorna")]]), new Rule(17, new FunApp("Swedish",[]),[],[[new Terminal("Svenskornas")]]), new Rule(24, new FunApp("String_N",[]),[],[[new Terminal("sträng")]]), new Rule(23, new FunApp("String_N",[]),[],[[new Terminal("strängs")]]), new Rule(22, new FunApp("String_N",[]),[],[[new Terminal("strängen")]]), new Rule(21, new FunApp("String_N",[]),[],[[new Terminal("strängens")]]), new Rule(20, new FunApp("String_N",[]),[],[[new Terminal("strängar")]]), new Rule(19, new FunApp("String_N",[]),[],[[new Terminal("strängars")]]), new Rule(18, new FunApp("String_N",[]),[],[[new Terminal("strängarna")]]), new Rule(17, new FunApp("String_N",[]),[],[[new Terminal("strängarnas")]]), new Rule(24, new FunApp("Spanish",[]),[],[[new Terminal("Spanska")]]), new Rule(23, new FunApp("Spanish",[]),[],[[new Terminal("Spanskas")]]), new Rule(22, new FunApp("Spanish",[]),[],[[new Terminal("Spanskan")]]), new Rule(21, new FunApp("Spanish",[]),[],[[new Terminal("Spanskans")]]), new Rule(20, new FunApp("Spanish",[]),[],[[new Terminal("Spanskor")]]), new Rule(19, new FunApp("Spanish",[]),[],[[new Terminal("Spanskors")]]), new Rule(18, new FunApp("Spanish",[]),[],[[new Terminal("Spanskorna")]]), new Rule(17, new FunApp("Spanish",[]),[],[[new Terminal("Spanskornas")]]), new Rule(25, new FunApp("SingleWordCommand",[new Arg(0)]),[29],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig")]]), new Rule(25, new FunApp("SingleWordCommand",[new Arg(0)]),[28],[[new ArgProj(0, 1), new ArgProj(0, 0)]]), new Rule(25, new FunApp("SingleWordCommand",[new Arg(0)]),[27],[[new ArgProj(0, 1), new ArgProj(0, 0)]]), new Rule(83, new FunApp("Show",[]),[],[[]]), new Rule(82, new FunApp("Show",[]),[],[[new Terminal("Visar")]]), new Rule(81, new FunApp("Show",[]),[],[[new Terminal("Visas")]]), new Rule(80, new FunApp("Show",[]),[],[[new Terminal("Visa")]]), new Rule(79, new FunApp("Show",[]),[],[[new Terminal("Visas")]]), new Rule(78, new FunApp("Show",[]),[],[[new Terminal("Visa")]]), new Rule(77, new FunApp("Show",[]),[],[[new Terminal("Visas")]]), new Rule(76, new FunApp("Show",[]),[],[[new Terminal("Visad")]]), new Rule(75, new FunApp("Show",[]),[],[[new Terminal("Visads")]]), new Rule(74, new FunApp("Show",[]),[],[[new Terminal("Visat")]]), new Rule(73, new FunApp("Show",[]),[],[[new Terminal("Visats")]]), new Rule(72, new FunApp("Show",[]),[],[[new Terminal("Visade")]]), new Rule(71, new FunApp("Show",[]),[],[[new Terminal("Visades")]]), new Rule(70, new FunApp("Show",[]),[],[[new Terminal("Visade")]]), new Rule(69, new FunApp("Show",[]),[],[[new Terminal("Visades")]]), new Rule(68, new FunApp("Show",[]),[],[[new Terminal("Visade")]]), new Rule(67, new FunApp("Show",[]),[],[[new Terminal("Visades")]]), new Rule(83, new FunApp("Select",[]),[],[[]]), new Rule(82, new FunApp("Select",[]),[],[[new Terminal("Väljer")]]), new Rule(81, new FunApp("Select",[]),[],[[new Terminal("Väljs")]]), new Rule(80, new FunApp("Select",[]),[],[[new Terminal("Välj")]]), new Rule(79, new FunApp("Select",[]),[],[[new Terminal("Väljs")]]), new Rule(78, new FunApp("Select",[]),[],[[new Terminal("Välja")]]), new Rule(77, new FunApp("Select",[]),[],[[new Terminal("Väljas")]]), new Rule(76, new FunApp("Select",[]),[],[[new Terminal("Väljt")]]), new Rule(75, new FunApp("Select",[]),[],[[new Terminal("Väljts")]]), new Rule(74, new FunApp("Select",[]),[],[[new Terminal("Väljt")]]), new Rule(73, new FunApp("Select",[]),[],[[new Terminal("Väljts")]]), new Rule(72, new FunApp("Select",[]),[],[[new Terminal("Väljta")]]), new Rule(71, new FunApp("Select",[]),[],[[new Terminal("Väljtas")]]), new Rule(70, new FunApp("Select",[]),[],[[new Terminal("Väljta")]]), new Rule(69, new FunApp("Select",[]),[],[[new Terminal("Väljtas")]]), new Rule(68, new FunApp("Select",[]),[],[[new Terminal("Väljta")]]), new Rule(67, new FunApp("Select",[]),[],[[new Terminal("Väljtas")]]), new Rule(24, new FunApp("Russian",[]),[],[[new Terminal("Ryska")]]), new Rule(23, new FunApp("Russian",[]),[],[[new Terminal("Ryskas")]]), new Rule(22, new FunApp("Russian",[]),[],[[new Terminal("Ryskan")]]), new Rule(21, new FunApp("Russian",[]),[],[[new Terminal("Ryskans")]]), new Rule(20, new FunApp("Russian",[]),[],[[new Terminal("Ryskor")]]), new Rule(19, new FunApp("Russian",[]),[],[[new Terminal("Ryskors")]]), new Rule(18, new FunApp("Russian",[]),[],[[new Terminal("Ryskorna")]]), new Rule(17, new FunApp("Russian",[]),[],[[new Terminal("Ryskornas")]]), new Rule(83, new FunApp("Replace",[]),[],[[]]), new Rule(82, new FunApp("Replace",[]),[],[[new Terminal("Ersätter")]]), new Rule(81, new FunApp("Replace",[]),[],[[new Terminal("Ersätts")]]), new Rule(80, new FunApp("Replace",[]),[],[[new Terminal("Ersätt")]]), new Rule(79, new FunApp("Replace",[]),[],[[new Terminal("Ersätts")]]), new Rule(78, new FunApp("Replace",[]),[],[[new Terminal("Ersätta")]]), new Rule(77, new FunApp("Replace",[]),[],[[new Terminal("Ersättas")]]), new Rule(76, new FunApp("Replace",[]),[],[[new Terminal("Ersättt")]]), new Rule(75, new FunApp("Replace",[]),[],[[new Terminal("Ersättts")]]), new Rule(74, new FunApp("Replace",[]),[],[[new Terminal("Ersättt")]]), new Rule(73, new FunApp("Replace",[]),[],[[new Terminal("Ersättts")]]), new Rule(72, new FunApp("Replace",[]),[],[[new Terminal("Ersättta")]]), new Rule(71, new FunApp("Replace",[]),[],[[new Terminal("Ersätttas")]]), new Rule(70, new FunApp("Replace",[]),[],[[new Terminal("Ersättta")]]), new Rule(69, new FunApp("Replace",[]),[],[[new Terminal("Ersätttas")]]), new Rule(68, new FunApp("Replace",[]),[],[[new Terminal("Ersättta")]]), new Rule(67, new FunApp("Replace",[]),[],[[new Terminal("Ersätttas")]]), new Rule(24, new FunApp("Refinement",[]),[],[[new Terminal("raffinemang")]]), new Rule(23, new FunApp("Refinement",[]),[],[[new Terminal("raffinemangs")]]), new Rule(22, new FunApp("Refinement",[]),[],[[new Terminal("raffinemangen")]]), new Rule(21, new FunApp("Refinement",[]),[],[[new Terminal("raffinemangens")]]), new Rule(20, new FunApp("Refinement",[]),[],[[new Terminal("raffinemangar")]]), new Rule(19, new FunApp("Refinement",[]),[],[[new Terminal("raffinemangars")]]), new Rule(18, new FunApp("Refinement",[]),[],[[new Terminal("raffinemangarna")]]), new Rule(17, new FunApp("Refinement",[]),[],[[new Terminal("raffinemangarnas")]]), new Rule(83, new FunApp("Refine",[]),[],[[]]), new Rule(82, new FunApp("Refine",[]),[],[[new Terminal("Raffinerar")]]), new Rule(81, new FunApp("Refine",[]),[],[[new Terminal("Raffineras")]]), new Rule(80, new FunApp("Refine",[]),[],[[new Terminal("Raffinera")]]), new Rule(79, new FunApp("Refine",[]),[],[[new Terminal("Raffineras")]]), new Rule(78, new FunApp("Refine",[]),[],[[new Terminal("Raffinera")]]), new Rule(77, new FunApp("Refine",[]),[],[[new Terminal("Raffineras")]]), new Rule(76, new FunApp("Refine",[]),[],[[new Terminal("Raffinerad")]]), new Rule(75, new FunApp("Refine",[]),[],[[new Terminal("Raffinerads")]]), new Rule(74, new FunApp("Refine",[]),[],[[new Terminal("Raffinerat")]]), new Rule(73, new FunApp("Refine",[]),[],[[new Terminal("Raffinerats")]]), new Rule(72, new FunApp("Refine",[]),[],[[new Terminal("Raffinerade")]]), new Rule(71, new FunApp("Refine",[]),[],[[new Terminal("Raffinerades")]]), new Rule(70, new FunApp("Refine",[]),[],[[new Terminal("Raffinerade")]]), new Rule(69, new FunApp("Refine",[]),[],[[new Terminal("Raffinerades")]]), new Rule(68, new FunApp("Refine",[]),[],[[new Terminal("Raffinerade")]]), new Rule(67, new FunApp("Refine",[]),[],[[new Terminal("Raffinerades")]]), new Rule(83, new FunApp("Redo",[]),[],[[]]), new Rule(82, new FunApp("Redo",[]),[],[[new Terminal("Upprepar")]]), new Rule(81, new FunApp("Redo",[]),[],[[new Terminal("Upprepas")]]), new Rule(80, new FunApp("Redo",[]),[],[[new Terminal("Upprepa")]]), new Rule(79, new FunApp("Redo",[]),[],[[new Terminal("Upprepas")]]), new Rule(78, new FunApp("Redo",[]),[],[[new Terminal("Upprepa")]]), new Rule(77, new FunApp("Redo",[]),[],[[new Terminal("Upprepas")]]), new Rule(76, new FunApp("Redo",[]),[],[[new Terminal("Upprepad")]]), new Rule(75, new FunApp("Redo",[]),[],[[new Terminal("Upprepads")]]), new Rule(74, new FunApp("Redo",[]),[],[[new Terminal("Upprepat")]]), new Rule(73, new FunApp("Redo",[]),[],[[new Terminal("Upprepats")]]), new Rule(72, new FunApp("Redo",[]),[],[[new Terminal("Upprepade")]]), new Rule(71, new FunApp("Redo",[]),[],[[new Terminal("Upprepades")]]), new Rule(70, new FunApp("Redo",[]),[],[[new Terminal("Upprepade")]]), new Rule(69, new FunApp("Redo",[]),[],[[new Terminal("Upprepades")]]), new Rule(68, new FunApp("Redo",[]),[],[[new Terminal("Upprepade")]]), new Rule(67, new FunApp("Redo",[]),[],[[new Terminal("Upprepades")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[29, 44, 43],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[28, 44, 43],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[27, 44, 43],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[29, 42, 18],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[28, 42, 18],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[27, 42, 18],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[29, 41, 38],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[28, 41, 38],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[27, 41, 38],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[29, 40, 20],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[28, 40, 20],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[27, 40, 20],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[29, 39, 38],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[28, 39, 38],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[27, 39, 38],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[29, 37, 20],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[28, 37, 20],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[27, 37, 20],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[29, 36, 35],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[28, 36, 35],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[27, 36, 35],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[29, 34, 22],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[28, 34, 22],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[27, 34, 22],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[29, 33, 30],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[28, 33, 30],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[27, 33, 30],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[29, 32, 24],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[28, 32, 24],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[27, 32, 24],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[29, 31, 30],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[28, 31, 30],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[27, 31, 30],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[29, 26, 24],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[28, 26, 24],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(25, new FunApp("RandomlyCommand",[new Arg(0), new Arg(1), new Arg(2)]),[27, 26, 24],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new Terminal("slumpmässigt")]]), new Rule(16, new FunApp("Previous",[]),[],[[new Terminal("föregående")]]), new Rule(15, new FunApp("Previous",[]),[],[[new Terminal("föregåendes")]]), new Rule(14, new FunApp("Previous",[]),[],[[new Terminal("föregående")]]), new Rule(13, new FunApp("Previous",[]),[],[[new Terminal("föregåendes")]]), new Rule(12, new FunApp("Previous",[]),[],[[new Terminal("föregående")]]), new Rule(11, new FunApp("Previous",[]),[],[[new Terminal("föregåendes")]]), new Rule(10, new FunApp("Previous",[]),[],[[new Terminal("föregående")]]), new Rule(9, new FunApp("Previous",[]),[],[[new Terminal("föregåendes")]]), new Rule(8, new FunApp("Previous",[]),[],[[new Terminal("föregående")]]), new Rule(7, new FunApp("Previous",[]),[],[[new Terminal("föregåendes")]]), new Rule(6, new FunApp("Previous",[]),[],[[]]), new Rule(5, new FunApp("Previous",[]),[],[[new Terminal("s")]]), new Rule(4, new FunApp("Previous",[]),[],[[]]), new Rule(3, new FunApp("Previous",[]),[],[[new Terminal("s")]]), new Rule(2, new FunApp("Previous",[]),[],[[new Terminal("a")]]), new Rule(1, new FunApp("Previous",[]),[],[[new Terminal("as")]]), new Rule(83, new FunApp("Paste",[]),[],[[new Terminal("in")]]), new Rule(82, new FunApp("Paste",[]),[],[[new Terminal("Klistrar")]]), new Rule(81, new FunApp("Paste",[]),[],[[new Terminal("Klistras")]]), new Rule(80, new FunApp("Paste",[]),[],[[new Terminal("Klistra")]]), new Rule(79, new FunApp("Paste",[]),[],[[new Terminal("Klistras")]]), new Rule(78, new FunApp("Paste",[]),[],[[new Terminal("Klistra")]]), new Rule(77, new FunApp("Paste",[]),[],[[new Terminal("Klistras")]]), new Rule(76, new FunApp("Paste",[]),[],[[new Terminal("Klistrad")]]), new Rule(75, new FunApp("Paste",[]),[],[[new Terminal("Klistrads")]]), new Rule(74, new FunApp("Paste",[]),[],[[new Terminal("Klistrat")]]), new Rule(73, new FunApp("Paste",[]),[],[[new Terminal("Klistrats")]]), new Rule(72, new FunApp("Paste",[]),[],[[new Terminal("Klistrade")]]), new Rule(71, new FunApp("Paste",[]),[],[[new Terminal("Klistrades")]]), new Rule(70, new FunApp("Paste",[]),[],[[new Terminal("Klistrade")]]), new Rule(69, new FunApp("Paste",[]),[],[[new Terminal("Klistrades")]]), new Rule(68, new FunApp("Paste",[]),[],[[new Terminal("Klistrade")]]), new Rule(67, new FunApp("Paste",[]),[],[[new Terminal("Klistrades")]]), new Rule(83, new FunApp("Parse",[]),[],[[]]), new Rule(82, new FunApp("Parse",[]),[],[[new Terminal("Parsar")]]), new Rule(81, new FunApp("Parse",[]),[],[[new Terminal("Parsas")]]), new Rule(80, new FunApp("Parse",[]),[],[[new Terminal("Parsa")]]), new Rule(79, new FunApp("Parse",[]),[],[[new Terminal("Parsas")]]), new Rule(78, new FunApp("Parse",[]),[],[[new Terminal("Parsa")]]), new Rule(77, new FunApp("Parse",[]),[],[[new Terminal("Parsas")]]), new Rule(76, new FunApp("Parse",[]),[],[[new Terminal("Parsad")]]), new Rule(75, new FunApp("Parse",[]),[],[[new Terminal("Parsads")]]), new Rule(74, new FunApp("Parse",[]),[],[[new Terminal("Parsat")]]), new Rule(73, new FunApp("Parse",[]),[],[[new Terminal("Parsats")]]), new Rule(72, new FunApp("Parse",[]),[],[[new Terminal("Parsade")]]), new Rule(71, new FunApp("Parse",[]),[],[[new Terminal("Parsades")]]), new Rule(70, new FunApp("Parse",[]),[],[[new Terminal("Parsade")]]), new Rule(69, new FunApp("Parse",[]),[],[[new Terminal("Parsades")]]), new Rule(68, new FunApp("Parse",[]),[],[[new Terminal("Parsade")]]), new Rule(67, new FunApp("Parse",[]),[],[[new Terminal("Parsades")]]), new Rule(24, new FunApp("Page",[]),[],[[new Terminal("sida")]]), new Rule(23, new FunApp("Page",[]),[],[[new Terminal("sidas")]]), new Rule(22, new FunApp("Page",[]),[],[[new Terminal("sidan")]]), new Rule(21, new FunApp("Page",[]),[],[[new Terminal("sidans")]]), new Rule(20, new FunApp("Page",[]),[],[[new Terminal("sidor")]]), new Rule(19, new FunApp("Page",[]),[],[[new Terminal("sidors")]]), new Rule(18, new FunApp("Page",[]),[],[[new Terminal("sidorna")]]), new Rule(17, new FunApp("Page",[]),[],[[new Terminal("sidornas")]]), new Rule(24, new FunApp("Norwegian",[]),[],[[new Terminal("Norska")]]), new Rule(23, new FunApp("Norwegian",[]),[],[[new Terminal("Norskas")]]), new Rule(22, new FunApp("Norwegian",[]),[],[[new Terminal("Norskan")]]), new Rule(21, new FunApp("Norwegian",[]),[],[[new Terminal("Norskans")]]), new Rule(20, new FunApp("Norwegian",[]),[],[[new Terminal("Norskor")]]), new Rule(19, new FunApp("Norwegian",[]),[],[[new Terminal("Norskors")]]), new Rule(18, new FunApp("Norwegian",[]),[],[[new Terminal("Norskorna")]]), new Rule(17, new FunApp("Norwegian",[]),[],[[new Terminal("Norskornas")]]), new Rule(24, new FunApp("Node",[]),[],[[new Terminal("nod")]]), new Rule(23, new FunApp("Node",[]),[],[[new Terminal("nods")]]), new Rule(22, new FunApp("Node",[]),[],[[new Terminal("noden")]]), new Rule(21, new FunApp("Node",[]),[],[[new Terminal("nodens")]]), new Rule(20, new FunApp("Node",[]),[],[[new Terminal("nodar")]]), new Rule(19, new FunApp("Node",[]),[],[[new Terminal("nodars")]]), new Rule(18, new FunApp("Node",[]),[],[[new Terminal("nodarna")]]), new Rule(17, new FunApp("Node",[]),[],[[new Terminal("nodarnas")]]), new Rule(16, new FunApp("Next",[]),[],[[new Terminal("näst")]]), new Rule(15, new FunApp("Next",[]),[],[[new Terminal("nästs")]]), new Rule(14, new FunApp("Next",[]),[],[[new Terminal("nästt")]]), new Rule(13, new FunApp("Next",[]),[],[[new Terminal("nästts")]]), new Rule(12, new FunApp("Next",[]),[],[[new Terminal("nästa")]]), new Rule(11, new FunApp("Next",[]),[],[[new Terminal("nästas")]]), new Rule(10, new FunApp("Next",[]),[],[[new Terminal("nästa")]]), new Rule(9, new FunApp("Next",[]),[],[[new Terminal("nästas")]]), new Rule(8, new FunApp("Next",[]),[],[[new Terminal("nästa")]]), new Rule(7, new FunApp("Next",[]),[],[[new Terminal("nästas")]]), new Rule(6, new FunApp("Next",[]),[],[[new Terminal("nästare")]]), new Rule(5, new FunApp("Next",[]),[],[[new Terminal("nästares")]]), new Rule(4, new FunApp("Next",[]),[],[[new Terminal("nästast")]]), new Rule(3, new FunApp("Next",[]),[],[[new Terminal("nästasts")]]), new Rule(2, new FunApp("Next",[]),[],[[new Terminal("nästaste")]]), new Rule(1, new FunApp("Next",[]),[],[[new Terminal("nästastes")]]), new Rule(30, new FunApp("Language",[]),[],[[new Terminal("språk")]]), new Rule(87, new FunApp("Language",[]),[],[[new Terminal("språks")]]), new Rule(35, new FunApp("Language",[]),[],[[new Terminal("språket")]]), new Rule(86, new FunApp("Language",[]),[],[[new Terminal("språkets")]]), new Rule(38, new FunApp("Language",[]),[],[[new Terminal("språk")]]), new Rule(85, new FunApp("Language",[]),[],[[new Terminal("språks")]]), new Rule(43, new FunApp("Language",[]),[],[[new Terminal("språken")]]), new Rule(84, new FunApp("Language",[]),[],[[new Terminal("språkens")]]), new Rule(25, new FunApp("Label",[new Arg(0)]),[88],[[new ArgProj(0, 0)]]), new Rule(88, new Arg(0),[30],[[new ArgProj(0, 0)]]), new Rule(88, new Arg(0),[24],[[new ArgProj(0, 0)]]), new Rule(24, new FunApp("Italian",[]),[],[[new Terminal("Italienska")]]), new Rule(23, new FunApp("Italian",[]),[],[[new Terminal("Italienskas")]]), new Rule(22, new FunApp("Italian",[]),[],[[new Terminal("Italienskan")]]), new Rule(21, new FunApp("Italian",[]),[],[[new Terminal("Italienskans")]]), new Rule(20, new FunApp("Italian",[]),[],[[new Terminal("Italienskor")]]), new Rule(19, new FunApp("Italian",[]),[],[[new Terminal("Italienskors")]]), new Rule(18, new FunApp("Italian",[]),[],[[new Terminal("Italienskorna")]]), new Rule(17, new FunApp("Italian",[]),[],[[new Terminal("Italienskornas")]]), new Rule(30, new FunApp("Integer_N",[]),[],[[new Terminal("heltal")]]), new Rule(87, new FunApp("Integer_N",[]),[],[[new Terminal("heltals")]]), new Rule(35, new FunApp("Integer_N",[]),[],[[new Terminal("heltalet")]]), new Rule(86, new FunApp("Integer_N",[]),[],[[new Terminal("heltalets")]]), new Rule(38, new FunApp("Integer_N",[]),[],[[new Terminal("heltal")]]), new Rule(85, new FunApp("Integer_N",[]),[],[[new Terminal("heltals")]]), new Rule(43, new FunApp("Integer_N",[]),[],[[new Terminal("heltalen")]]), new Rule(84, new FunApp("Integer_N",[]),[],[[new Terminal("heltalens")]]), new Rule(47, new FunApp("IndefSgDet",[]),[],[[new Terminal("en")]]), new Rule(50, new FunApp("IndefSgDet",[]),[],[[new Terminal("ett")]]), new Rule(26, new FunApp("IndefSgDet",[]),[],[[new Terminal("en")]]), new Rule(31, new FunApp("IndefSgDet",[]),[],[[new Terminal("ett")]]), new Rule(59, new FunApp("IndefPlDet",[]),[],[[]]), new Rule(60, new FunApp("IndefPlDet",[]),[],[[]]), new Rule(37, new FunApp("IndefPlDet",[]),[],[[]]), new Rule(39, new FunApp("IndefPlDet",[]),[],[[]]), new Rule(24, new FunApp("German",[]),[],[[new Terminal("Tyska")]]), new Rule(23, new FunApp("German",[]),[],[[new Terminal("Tyskas")]]), new Rule(22, new FunApp("German",[]),[],[[new Terminal("Tyskan")]]), new Rule(21, new FunApp("German",[]),[],[[new Terminal("Tyskans")]]), new Rule(20, new FunApp("German",[]),[],[[new Terminal("Tyskor")]]), new Rule(19, new FunApp("German",[]),[],[[new Terminal("Tyskors")]]), new Rule(18, new FunApp("German",[]),[],[[new Terminal("Tyskorna")]]), new Rule(17, new FunApp("German",[]),[],[[new Terminal("Tyskornas")]]), new Rule(24, new FunApp("French",[]),[],[[new Terminal("Franska")]]), new Rule(23, new FunApp("French",[]),[],[[new Terminal("Franskas")]]), new Rule(22, new FunApp("French",[]),[],[[new Terminal("Franskan")]]), new Rule(21, new FunApp("French",[]),[],[[new Terminal("Franskans")]]), new Rule(20, new FunApp("French",[]),[],[[new Terminal("Franskor")]]), new Rule(19, new FunApp("French",[]),[],[[new Terminal("Franskors")]]), new Rule(18, new FunApp("French",[]),[],[[new Terminal("Franskorna")]]), new Rule(17, new FunApp("French",[]),[],[[new Terminal("Franskornas")]]), new Rule(30, new FunApp("Float_N",[]),[],[[new Terminal("flyttal")]]), new Rule(87, new FunApp("Float_N",[]),[],[[new Terminal("flyttals")]]), new Rule(35, new FunApp("Float_N",[]),[],[[new Terminal("flyttalet")]]), new Rule(86, new FunApp("Float_N",[]),[],[[new Terminal("flyttalets")]]), new Rule(38, new FunApp("Float_N",[]),[],[[new Terminal("flyttal")]]), new Rule(85, new FunApp("Float_N",[]),[],[[new Terminal("flyttals")]]), new Rule(43, new FunApp("Float_N",[]),[],[[new Terminal("flyttalen")]]), new Rule(84, new FunApp("Float_N",[]),[],[[new Terminal("flyttalens")]]), new Rule(24, new FunApp("Finnish",[]),[],[[new Terminal("Finska")]]), new Rule(23, new FunApp("Finnish",[]),[],[[new Terminal("Finskas")]]), new Rule(22, new FunApp("Finnish",[]),[],[[new Terminal("Finskan")]]), new Rule(21, new FunApp("Finnish",[]),[],[[new Terminal("Finskans")]]), new Rule(20, new FunApp("Finnish",[]),[],[[new Terminal("Finskor")]]), new Rule(19, new FunApp("Finnish",[]),[],[[new Terminal("Finskors")]]), new Rule(18, new FunApp("Finnish",[]),[],[[new Terminal("Finskorna")]]), new Rule(17, new FunApp("Finnish",[]),[],[[new Terminal("Finskornas")]]), new Rule(25, new FunApp("ErrorMessage",[new Arg(0), new Arg(1)]),[57, 38],[[new Terminal("det"), new Terminal("finns"), new Terminal("inte"), new ArgProj(0, 0), new ArgProj(1, 0)]]), new Rule(25, new FunApp("ErrorMessage",[new Arg(0), new Arg(1)]),[57, 20],[[new Terminal("det"), new Terminal("finns"), new Terminal("inte"), new ArgProj(0, 0), new ArgProj(1, 0)]]), new Rule(83, new FunApp("Enter",[]),[],[[]]), new Rule(82, new FunApp("Enter",[]),[],[[new Terminal("Skriver")]]), new Rule(81, new FunApp("Enter",[]),[],[[new Terminal("Skrivs")]]), new Rule(80, new FunApp("Enter",[]),[],[[new Terminal("Skriv")]]), new Rule(79, new FunApp("Enter",[]),[],[[new Terminal("Skrivs")]]), new Rule(78, new FunApp("Enter",[]),[],[[new Terminal("Skriva")]]), new Rule(77, new FunApp("Enter",[]),[],[[new Terminal("Skrivas")]]), new Rule(76, new FunApp("Enter",[]),[],[[new Terminal("Skrivd")]]), new Rule(75, new FunApp("Enter",[]),[],[[new Terminal("Skrivds")]]), new Rule(74, new FunApp("Enter",[]),[],[[new Terminal("Skrivt")]]), new Rule(73, new FunApp("Enter",[]),[],[[new Terminal("Skrivts")]]), new Rule(72, new FunApp("Enter",[]),[],[[new Terminal("Skrivda")]]), new Rule(71, new FunApp("Enter",[]),[],[[new Terminal("Skrivdas")]]), new Rule(70, new FunApp("Enter",[]),[],[[new Terminal("Skrivda")]]), new Rule(69, new FunApp("Enter",[]),[],[[new Terminal("Skrivdas")]]), new Rule(68, new FunApp("Enter",[]),[],[[new Terminal("Skrivda")]]), new Rule(67, new FunApp("Enter",[]),[],[[new Terminal("Skrivdas")]]), new Rule(24, new FunApp("English",[]),[],[[new Terminal("Engelska")]]), new Rule(23, new FunApp("English",[]),[],[[new Terminal("Engelskas")]]), new Rule(22, new FunApp("English",[]),[],[[new Terminal("Engelskan")]]), new Rule(21, new FunApp("English",[]),[],[[new Terminal("Engelskans")]]), new Rule(20, new FunApp("English",[]),[],[[new Terminal("Engelskor")]]), new Rule(19, new FunApp("English",[]),[],[[new Terminal("Engelskors")]]), new Rule(18, new FunApp("English",[]),[],[[new Terminal("Engelskorna")]]), new Rule(17, new FunApp("English",[]),[],[[new Terminal("Engelskornas")]]), new Rule(83, new FunApp("Delete",[]),[],[[]]), new Rule(82, new FunApp("Delete",[]),[],[[new Terminal("Raderar")]]), new Rule(81, new FunApp("Delete",[]),[],[[new Terminal("Raderas")]]), new Rule(80, new FunApp("Delete",[]),[],[[new Terminal("Radera")]]), new Rule(79, new FunApp("Delete",[]),[],[[new Terminal("Raderas")]]), new Rule(78, new FunApp("Delete",[]),[],[[new Terminal("Radera")]]), new Rule(77, new FunApp("Delete",[]),[],[[new Terminal("Raderas")]]), new Rule(76, new FunApp("Delete",[]),[],[[new Terminal("Raderad")]]), new Rule(75, new FunApp("Delete",[]),[],[[new Terminal("Raderads")]]), new Rule(74, new FunApp("Delete",[]),[],[[new Terminal("Raderat")]]), new Rule(73, new FunApp("Delete",[]),[],[[new Terminal("Raderats")]]), new Rule(72, new FunApp("Delete",[]),[],[[new Terminal("Raderade")]]), new Rule(71, new FunApp("Delete",[]),[],[[new Terminal("Raderades")]]), new Rule(70, new FunApp("Delete",[]),[],[[new Terminal("Raderade")]]), new Rule(69, new FunApp("Delete",[]),[],[[new Terminal("Raderades")]]), new Rule(68, new FunApp("Delete",[]),[],[[new Terminal("Raderade")]]), new Rule(67, new FunApp("Delete",[]),[],[[new Terminal("Raderades")]]), new Rule(55, new FunApp("DefSgDet",[]),[],[[new Terminal("den")]]), new Rule(56, new FunApp("DefSgDet",[]),[],[[new Terminal("det")]]), new Rule(34, new FunApp("DefSgDet",[]),[],[[]]), new Rule(36, new FunApp("DefSgDet",[]),[],[[]]), new Rule(65, new FunApp("DefPlDet",[]),[],[[new Terminal("de")]]), new Rule(66, new FunApp("DefPlDet",[]),[],[[new Terminal("de")]]), new Rule(42, new FunApp("DefPlDet",[]),[],[[]]), new Rule(44, new FunApp("DefPlDet",[]),[],[[]]), new Rule(24, new FunApp("Danish",[]),[],[[new Terminal("Danska")]]), new Rule(23, new FunApp("Danish",[]),[],[[new Terminal("Danskas")]]), new Rule(22, new FunApp("Danish",[]),[],[[new Terminal("Danskan")]]), new Rule(21, new FunApp("Danish",[]),[],[[new Terminal("Danskans")]]), new Rule(20, new FunApp("Danish",[]),[],[[new Terminal("Danskor")]]), new Rule(19, new FunApp("Danish",[]),[],[[new Terminal("Danskors")]]), new Rule(18, new FunApp("Danish",[]),[],[[new Terminal("Danskorna")]]), new Rule(17, new FunApp("Danish",[]),[],[[new Terminal("Danskornas")]]), new Rule(83, new FunApp("Cut",[]),[],[[new Terminal("ut")]]), new Rule(82, new FunApp("Cut",[]),[],[[new Terminal("Klipper")]]), new Rule(81, new FunApp("Cut",[]),[],[[new Terminal("Klipps")]]), new Rule(80, new FunApp("Cut",[]),[],[[new Terminal("Klipp")]]), new Rule(79, new FunApp("Cut",[]),[],[[new Terminal("Klipps")]]), new Rule(78, new FunApp("Cut",[]),[],[[new Terminal("Klippa")]]), new Rule(77, new FunApp("Cut",[]),[],[[new Terminal("Klippas")]]), new Rule(76, new FunApp("Cut",[]),[],[[new Terminal("Klippt")]]), new Rule(75, new FunApp("Cut",[]),[],[[new Terminal("Klippts")]]), new Rule(74, new FunApp("Cut",[]),[],[[new Terminal("Klippt")]]), new Rule(73, new FunApp("Cut",[]),[],[[new Terminal("Klippts")]]), new Rule(72, new FunApp("Cut",[]),[],[[new Terminal("Klippta")]]), new Rule(71, new FunApp("Cut",[]),[],[[new Terminal("Klipptas")]]), new Rule(70, new FunApp("Cut",[]),[],[[new Terminal("Klippta")]]), new Rule(69, new FunApp("Cut",[]),[],[[new Terminal("Klipptas")]]), new Rule(68, new FunApp("Cut",[]),[],[[new Terminal("Klippta")]]), new Rule(67, new FunApp("Cut",[]),[],[[new Terminal("Klipptas")]]), new Rule(83, new FunApp("Copy",[]),[],[[]]), new Rule(82, new FunApp("Copy",[]),[],[[new Terminal("Kopierar")]]), new Rule(81, new FunApp("Copy",[]),[],[[new Terminal("Kopieras")]]), new Rule(80, new FunApp("Copy",[]),[],[[new Terminal("Kopiera")]]), new Rule(79, new FunApp("Copy",[]),[],[[new Terminal("Kopieras")]]), new Rule(78, new FunApp("Copy",[]),[],[[new Terminal("Kopiera")]]), new Rule(77, new FunApp("Copy",[]),[],[[new Terminal("Kopieras")]]), new Rule(76, new FunApp("Copy",[]),[],[[new Terminal("Kopierad")]]), new Rule(75, new FunApp("Copy",[]),[],[[new Terminal("Kopierads")]]), new Rule(74, new FunApp("Copy",[]),[],[[new Terminal("Kopierat")]]), new Rule(73, new FunApp("Copy",[]),[],[[new Terminal("Kopierats")]]), new Rule(72, new FunApp("Copy",[]),[],[[new Terminal("Kopierade")]]), new Rule(71, new FunApp("Copy",[]),[],[[new Terminal("Kopierades")]]), new Rule(70, new FunApp("Copy",[]),[],[[new Terminal("Kopierade")]]), new Rule(69, new FunApp("Copy",[]),[],[[new Terminal("Kopierades")]]), new Rule(68, new FunApp("Copy",[]),[],[[new Terminal("Kopierade")]]), new Rule(67, new FunApp("Copy",[]),[],[[new Terminal("Kopierades")]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[29, 66, 61, 43],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[28, 66, 61, 43],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[27, 66, 61, 43],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[29, 65, 61, 18],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[28, 65, 61, 18],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[27, 65, 61, 18],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[29, 64, 61, 38],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[28, 64, 61, 38],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[27, 64, 61, 38],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[29, 63, 61, 20],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[28, 63, 61, 20],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[27, 63, 61, 20],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(61, new Arg(0),[8],[[new ArgProj(0, 0)]]), new Rule(61, new Arg(0),[62],[[new ArgProj(0, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[29, 60, 57, 38],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[28, 60, 57, 38],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[27, 60, 57, 38],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[29, 59, 57, 20],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[28, 59, 57, 20],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[27, 59, 57, 20],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(57, new Arg(0),[12],[[new ArgProj(0, 0)]]), new Rule(57, new Arg(0),[58],[[new ArgProj(0, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[29, 56, 51, 35],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[28, 56, 51, 35],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[27, 56, 51, 35],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[29, 55, 51, 22],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[28, 55, 51, 22],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[27, 55, 51, 22],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[29, 54, 51, 30],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[28, 54, 51, 30],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[27, 54, 51, 30],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[29, 53, 51, 24],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[28, 53, 51, 24],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[27, 53, 51, 24],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(51, new Arg(0),[10],[[new ArgProj(0, 0)]]), new Rule(51, new Arg(0),[52],[[new ArgProj(0, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[29, 50, 48, 30],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[28, 50, 48, 30],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[27, 50, 48, 30],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(48, new Arg(0),[14],[[new ArgProj(0, 0)]]), new Rule(48, new Arg(0),[49],[[new ArgProj(0, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[29, 47, 45, 24],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[28, 47, 45, 24],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(25, new FunApp("CommandAdj",[new Arg(0), new Arg(1), new Arg(2), new Arg(3)]),[27, 47, 45, 24],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0), new ArgProj(3, 0)]]), new Rule(45, new Arg(0),[16],[[new ArgProj(0, 0)]]), new Rule(45, new Arg(0),[46],[[new ArgProj(0, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[29, 44, 43],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[28, 44, 43],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[27, 44, 43],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[29, 42, 18],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[28, 42, 18],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[27, 42, 18],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[29, 41, 38],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[28, 41, 38],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[27, 41, 38],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[29, 40, 20],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[28, 40, 20],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[27, 40, 20],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[29, 39, 38],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[28, 39, 38],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[27, 39, 38],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[29, 37, 20],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[28, 37, 20],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[27, 37, 20],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[29, 36, 35],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[28, 36, 35],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[27, 36, 35],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[29, 34, 22],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[28, 34, 22],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[27, 34, 22],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[29, 33, 30],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[28, 33, 30],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[27, 33, 30],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[29, 32, 24],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[28, 32, 24],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[27, 32, 24],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[29, 31, 30],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[28, 31, 30],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[27, 31, 30],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[29, 26, 24],[[new ArgProj(0, 1), new ArgProj(0, 0), new Terminal("dig"), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[28, 26, 24],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(25, new FunApp("Command",[new Arg(0), new Arg(1), new Arg(2)]),[27, 26, 24],[[new ArgProj(0, 1), new ArgProj(0, 0), new ArgProj(1, 0), new ArgProj(2, 0)]]), new Rule(24, new FunApp("Bulgarian",[]),[],[[new Terminal("Bulgariska")]]), new Rule(23, new FunApp("Bulgarian",[]),[],[[new Terminal("Bulgariskas")]]), new Rule(22, new FunApp("Bulgarian",[]),[],[[new Terminal("Bulgariskan")]]), new Rule(21, new FunApp("Bulgarian",[]),[],[[new Terminal("Bulgariskans")]]), new Rule(20, new FunApp("Bulgarian",[]),[],[[new Terminal("Bulgariskor")]]), new Rule(19, new FunApp("Bulgarian",[]),[],[[new Terminal("Bulgariskors")]]), new Rule(18, new FunApp("Bulgarian",[]),[],[[new Terminal("Bulgariskorna")]]), new Rule(17, new FunApp("Bulgarian",[]),[],[[new Terminal("Bulgariskornas")]]), new Rule(16, new FunApp("Available",[]),[],[[new Terminal("tillgänglig")]]), new Rule(15, new FunApp("Available",[]),[],[[new Terminal("tillgängligs")]]), new Rule(14, new FunApp("Available",[]),[],[[new Terminal("tillgängligt")]]), new Rule(13, new FunApp("Available",[]),[],[[new Terminal("tillgängligts")]]), new Rule(12, new FunApp("Available",[]),[],[[new Terminal("tillgängliga")]]), new Rule(11, new FunApp("Available",[]),[],[[new Terminal("tillgängligas")]]), new Rule(10, new FunApp("Available",[]),[],[[new Terminal("tillgängliga")]]), new Rule(9, new FunApp("Available",[]),[],[[new Terminal("tillgängligas")]]), new Rule(8, new FunApp("Available",[]),[],[[new Terminal("tillgängliga")]]), new Rule(7, new FunApp("Available",[]),[],[[new Terminal("tillgängligas")]]), new Rule(6, new FunApp("Available",[]),[],[[new Terminal("tillgängligare")]]), new Rule(5, new FunApp("Available",[]),[],[[new Terminal("tillgängligares")]]), new Rule(4, new FunApp("Available",[]),[],[[new Terminal("tillgängligast")]]), new Rule(3, new FunApp("Available",[]),[],[[new Terminal("tillgängligasts")]]), new Rule(2, new FunApp("Available",[]),[],[[new Terminal("tillgängligaste")]]), new Rule(1, new FunApp("Available",[]),[],[[new Terminal("tillgängligastes")]])],{Adjective:[45, 46, 16, 15, 48, 49, 14, 13, 57, 58, 12, 11, 51, 52, 10, 9, 61, 62, 8, 7, 6, 5, 4, 3, 2, 1], Determiner:[47, 59, 53, 63, 55, 65, 26, 37, 32, 40, 34, 42, 50, 60, 54, 64, 56, 66, 31, 39, 33, 41, 36, 44], Float:[-3], Int:[-2], Noun:[88, 24, 30, 20, 38, 22, 35, 18, 43, 23, 87, 19, 85, 21, 86, 17, 84], Sentence:[25], String:[-1], Verb:[83, 27, 29, 28, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67], _Var:[-4]}))}); diff --git a/lib/javascript/empty.png b/lib/javascript/empty.png new file mode 100644 index 000000000..35d9875df Binary files /dev/null and b/lib/javascript/empty.png differ diff --git a/lib/javascript/gfjseditor.js b/lib/javascript/gfjseditor.js new file mode 100644 index 000000000..4fa6d32cb --- /dev/null +++ b/lib/javascript/gfjseditor.js @@ -0,0 +1,1252 @@ + +//Variable and Constant definitions + +var expColImg = new Array(2); +expColImg[0] = new Image(12,12); +expColImg[0].src = "minus.png"; +expColImg[1] = new Image(12,12); +expColImg[1].src = "plus.png"; + +// Grammars +var grammar = undefined; +var editorGrammar = Editor; + +var selectedLanguage = "EditorEng"; +var selectedNode = ""; +var collapseBuffer = new Array(); +var abstractTree = new Fun ("?"); + +var navigationControlString = new Array(); +var undoArray = new Array(); +var redoArray = new Array(); +var clipBoard; +var refPageCounter = 0; + +var stringAbstractTree = undefined; +var myTree = undefined; +var parseTrees = undefined; + +var keys = new Array(); +keys ["Z"] = function() { clickUndo('actUndo'); } +keys ["Y"] = function() { clickRedo('actRedo'); } +keys ["R"] = function() { clickRefine('actRefine'); }; +keys ["V"] = function() { clickPaste('actPaste'); }; +keys ["X"] = function() { clickCut('actCut'); }; +keys ["C"] = function() { clickCopy('actCopy'); }; +keys ["D"] = function() { clickDelete('actDelete'); }; +keys ["E"] = function() { clickReplace('actReplace'); }; +keys ["W"] = function() { clickWrap('actWrap'); }; +keys ["P"] = function() { clickParse('actParse'); }; +keys ["N"] = function() { clickRandomNode('actRandomNode'); }; +keys ["T"] = function() { clickRandomTree('actRandomTree'); }; +keys ["%"] = function() { leftArrowKey(); }; +keys ["&"] = function() { upDownArrowKey(-1); }; +keys ["'"] = function() { rightArrowKey(); }; +keys ["("] = function() { upDownArrowKey( 1); }; +keys ["27"] = function() { clickEsc(); }; + +function state(selectedNode, tree, collapseBuffer) { + this.selectedNode = selectedNode; +// this.tree = myAbstract.copyTree(tree); + this.tree = grammar.abstract.copyTree(tree); + this.collapseBuffer = collapseBuffer; + return this; +} + +function treeNode(name, caption) { + this.name = name; + this.caption = caption; + this.cat = ""; + this.children = new Array(); + this.collapsed = false; + return this; +} + +treeNode.prototype.addChild = function (i, c) { + this.children[i] = c; +} + +treeNode.prototype.hasChildren = function() { + return this.children.length; +} + +// Creates an instance of the editor and stores it in the given HTML container. +// Previous content is destroyed. +function mkEditor(container, myGrammar) { + grammar = myGrammar; + myTree = treeFromAbstract(grammar.abstract.annotate(abstractTree, grammar.abstract.startcat), "0"); + var holder = document.getElementById(container); + holder.innerHTML = "
"; + nodeClick('0', '?'); +} + +// Generates a tree from the string representation of an abstract tree contained in the element elementToParse +function parseStringTree(elementToParse) { + stringAbstractTree = elementToParse; + abstractTree = grammar.abstract.handleLiterals(grammar.abstract.parseTree(document.getElementById(elementToParse).value, grammar.abstract.startcat)); + myTree = treeFromAbstract(abstractTree, "0"); + nodeClick("0"); +} + +// If a key is pressed and a function assigned to that key, calls the function +function hotKeys(event) { + event = (event) ? event : ((window.event) ? event : null); + if (event) { + var charCode = (event.charCode) ? event.charCode : ((event.which) ? event.which : event.keyCode); + if (keys[String.fromCharCode(charCode).toUpperCase()] && + !event.ctrlKey && !event.altKey && !event.shiftKey && !event.metaKey) { + keys[String.fromCharCode(charCode).toUpperCase()](); + } + else if (keys["" + charCode] && + !event.ctrlKey && !event.altKey && !event.shiftKey && !event.metaKey) { + keys["" + charCode](); + } + else if (charCode >= "96" && charCode <= "105" && + !event.ctrlKey && !event.altKey && !event.shiftKey && !event.metaKey) { + keys["" + (charCode - 96)](); + } + } +} + +// Clears "numeric" hotkeys +function clearHotKeys() { + for (var key in keys) { + if ((parseInt(key) + 1) && (key != "27")) { keys[key] = function() { }; } + } +} + +// Action to be performed when the up/down arrow key is pressed +function upDownArrowKey(pos) { + var nodePos = getNavPos(selectedNode); + if ((nodePos > 0 && pos < 0) || (nodePos < navigationControlString.length - 1 && pos > 0)) { + nodeClick(navigationControlString[nodePos + pos]); + } +} + +// Gets the position of a given node in the navigationControlString +function getNavPos(nodeName) { + for (var i = 0, j = navigationControlString.length; i < j; i++) { + if (navigationControlString[i] == nodeName) { return i; }; + } + return undefined; +} + +// Given a name and a tree, gets the node in the tree with that name +function getNode(nodeName, node) { + if (nodeName == node.name) { + return node; + } + else { + for (var i = 0, j = node.children.length; i < j; i++) { + var found = getNode(nodeName, node.children[i]); + if (found) { return found; } + } + } +} + +// Action to be performed when the left arrow key is pressed +function leftArrowKey() { + var node = getNode(selectedNode, myTree); + if (!node.collapsed && node.hasChildren()) { + signClick(node.name, node.caption); + } + else { + var parentNode = getParent(node.name, myTree); + if (parentNode) { nodeClick(parentNode.name); } + } +} + +// Gets the parent of the selected node +function getParent(nodeName, node) { + if (node.name == nodeName) { + return undefined; + } + else { + for (var i = 0, j = node.children.length; i < j; i++) { + if (node.children[i].name == nodeName) { return node; } + } + for (var i = 0, j = node.children.length; i < j; i++) { + var found = getParent(nodeName, node.children[i]); + if (found) { return found; } + } + } +} + +// Action to be performed when the right arrow key is pressed +function rightArrowKey() { + var node = getNode(selectedNode, myTree); + if (node.collapsed) { + signClick(node.name, node.caption); + } + else { + var firstDescendant = getfirstDescendant(node); + if (firstDescendant) { + nodeClick(firstDescendant.name); + } + } +} + +// Gets the first descendant child of a node +function getfirstDescendant(node) { + if (node.hasChildren() && !node.collapsed) { return node.children[0]; } + return undefined; +} + +// Produces and displays an HTML representation of the tree +function drawTree() { + var frame = document.getElementById("absFrame"); + navigationControlString = new Array(); + frame.innerHTML = ""; + document.getElementById("link" + selectedNode).scrollIntoView(false); +} + +// Produces an HTML representation of the tree +function getTree(tree, level) { + navigationControlString[navigationControlString.length] = tree.name; + var htmlTree = new Array(); + htmlTree.push("
  • "); + if (tree.hasChildren()) { + htmlTree.push(""); + } + else { + htmlTree.push(""); + } + htmlTree.push(""); + if (tree.cat == "String" || tree.cat == "Int" || tree.cat == "Float") { + htmlTree.push(tree.caption.substring(tree.caption.lastIndexOf("_") + 1)); + } else { + htmlTree.push(tree.caption); + } + htmlTree.push(" : ", tree.cat, "
  • "); + return htmlTree.join(""); +} + +// Linearizes and displays the abstract tree +function drawLinearizedFrame() { + var frame = document.getElementById("conFrame"); + frame.innerHTML = getLinearizedFrame(); +} + +// Linearizes the abstract tree and returns it in HTML form +function getLinearizedFrame() { + var linearizedFrame = new Array(); + for (var i in grammar.concretes) { + linearizedFrame.push("

    ", i, "

    "); + linearizedFrame.push("

    "); + var tokens = grammar.concretes[i].tagAndLinearize(abstractTree); + for (var j = 0, k = tokens.length; j < k; j++) { + linearizedFrame.push(createLinearized(tokens[j])); + } + linearizedFrame.push("

    "); + } + linearizedFrame.push("

    Abstract

    "); + linearizedFrame.push("

    ", createLinearizedFromAbstract(myTree, "0"), "

    "); + return linearizedFrame.join(""); +} + +// Creates an HTML representation of a linearization of an abstract tree +function createLinearized(token) { + var node = getNode(token.tag, myTree); + var linearized = new Array() + linearized.push(""); } + else { linearized.push(" onclick='nodeClick(\"", node.name, "\");'> ", token, " "); } + return linearized.join(""); +} + +// Creates an HTML representation of the abstract tree +function createLinearizedFromAbstract(node, path, prec) { + var linearized = new Array(); + linearized.push(""); + if (node.children.length) { linearized.push(" ("); } + if (node.cat == "String" || node.cat == "Int" || node.cat == "Float") { + linearized.push(" ", node.caption.substring(node.caption.lastIndexOf("_") + 1), " "); + } else { + linearized.push(" ", node.caption, " "); + } + for (var i = 0, j = node.children.length; i < j; i++) { + linearized.push(createLinearizedFromAbstract(node.children[i], path + "-" + i, 1)); + } + if (node.children.length) { linearized.push(") "); } + linearized.push(""); + return linearized.join(""); +} + +// Expands/Collapses node +function signClick(name, caption) { + myTree = expandCollapse(myTree, name); + nodeClick(name); +} + +// Sets the "collapsed" property of a given node +function expandCollapse(node, name) { + if (node.name == name) { + if (wasCollapsed(node.name)) { removeFromCollapseBuffer(node.name); } + else { collapseBuffer[collapseBuffer.length] = node.name; } + node.collapsed ^= true; + } + else { + for (var i = 0, j = node.children.length; i < j; i++) { + expandCollapse(node.children[i], name); + } + } + return node; +} + +// Checks if a node was collapsed on the previous cycle +function wasCollapsed(nodeName) { + for (var i = 0, j = collapseBuffer.length; i < j; i++) { + if (nodeName == collapseBuffer[i]) { + return true; + } + } + return false; +} + +// Removes a node from the collapseBuffer array +function removeFromCollapseBuffer(nodeName) { + var newBuffer = new Array(); + for (var i = 0, j = collapseBuffer.length; i < j; i++) { + if (nodeName != collapseBuffer[i]) { + newBuffer[newBuffer.length] = collapseBuffer[i]; + } + } + collapseBuffer = newBuffer; +} + +// Selects a node +function nodeClick(name) { + if ((document.getElementById("actRefine") && document.getElementById("actRefine").className == "selected") || + (document.getElementById("actReplace") && document.getElementById("actReplace").className == "selected") || + (document.getElementById("actWrap") && document.getElementById("actWrap").className == "selected") || + (document.getElementById("actTree") && document.getElementById("actTree").className == "selected")) { + return; } + selectedNode = name; + if (stringAbstractTree) { + document.getElementById(stringAbstractTree).value = abstractTree.show(); + } + document.getElementById("actFrame").innerHTML = showActions(); + document.getElementById("refFrame").innerHTML = ""; + document.getElementById("messageFrame").innerHTML = showLanguages(); + document.getElementById(selectedLanguage).className = "selected"; + applyLanguage(); + drawTree(); + drawLinearizedFrame(); +} + +// Shows the available languages for the editor +function showLanguages() { + var languages = new Array(); + languages.push("", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", +// "", + "", + "", + "
    BulgarianDanishEnglishFinnishFrenchGermanItalianNorwegianRussianSpanishSpanishSwedish
    "); + return languages.join(""); +} + +// Selects the language to use in the editor +function clickLanguage(lang) { + if (lang) { + var tdsToClear = document.getElementById("languagesTable").getElementsByTagName("td"); + for (var i = 0, j = tdsToClear.length; i < j; i++) { + if (tdsToClear[i].className == "selected") { tdsToClear[i].className = "language"; } + } + document.getElementById(lang).className = "selected"; + selectedLanguage = lang; + applyLanguage(); + } +} + +// Applies a language to the editor +function applyLanguage() { + var langsToLinearize = document.getElementById("languagesTable").getElementsByTagName("td"); + for (var i = 0, j = langsToLinearize.length; i < j; i++) { + var absStr = langsToLinearize[i].getAttribute("title"); + var lin = editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree(absStr, editorGrammar.abstract.startcat)); + if (!langsToLinearize[i].firstChild) { + var txt = document.createTextNode(lin); + langsToLinearize[i].appendChild(txt); + } + else { + langsToLinearize[i].firstChild.nodeValue = lin; + } + } + var actionsToLinearize = document.getElementById("actionsTable").getElementsByTagName("td"); + for (var i = 0, j = actionsToLinearize.length; i < j; i++) { + if (actionsToLinearize[i].getAttribute("class") == "action") { + var absStr = actionsToLinearize[i].getAttribute("title"); + var lin = editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree(absStr, editorGrammar.abstract.startcat)); + if (!actionsToLinearize[i].firstChild) { + var txt = document.createTextNode(lin); + actionsToLinearize[i].appendChild(txt); + } + else { + actionsToLinearize[i].firstChild.nodeValue = lin; + } + } + } + var messageToLinearize = document.getElementById("refgenRefRandom"); + if (messageToLinearize) { + messageToLinearize.firstChild.firstChild.nodeValue = editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree("RandomlyCommand Select IndefSgDet Refinement", editorGrammar.abstract.startcat)); + } + var messageToLinearize = document.getElementById("nextRefsNext"); + if (messageToLinearize) { + messageToLinearize.firstChild.firstChild.nodeValue = editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree("CommandAdj Show DefSgDet Next Page", editorGrammar.abstract.startcat)); + } + messageToLinearize = document.getElementById("nextRefsPrevious"); + if (messageToLinearize) { + messageToLinearize.firstChild.firstChild.nodeValue = editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree("CommandAdj Show DefSgDet Previous Page", editorGrammar.abstract.startcat)); + } + var messageToLinearize = document.getElementById("nextWrapsNext"); + if (messageToLinearize) { + messageToLinearize.firstChild.firstChild.nodeValue = editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree("CommandAdj Show DefSgDet Next Page", editorGrammar.abstract.startcat)); + } + messageToLinearize = document.getElementById("nextWrapsPrevious"); + if (messageToLinearize) { + messageToLinearize.firstChild.firstChild.nodeValue = editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree("CommandAdj Show DefSgDet Previous Page", editorGrammar.abstract.startcat)); + } +} + +// Shows the available actions for a node +function showActions(caption) { + var node = getNode(selectedNode, myTree); + var abstractNode = getNodeFromAbstract(abstractTree, node.name, "0"); + var actions = new Array(); + actions.push(""); + if (undoArray.length) { + actions.push(createAction("Undo", "action", "SingleWordCommand Undo", "Z")); } + else { actions.push(createAction("Undo", "unavailable", "SingleWordCommand Undo", "Z")); }; + if (redoArray.length) { + actions.push(createAction("Redo", "action", "SingleWordCommand Redo", "Y")); } + else { actions.push(createAction("Redo", "unavailable", "SingleWordCommand Redo", "Y")); } + if (node.caption == "?") { + actions.push(createAction("Cut", "unavailable", "SingleWordCommand Cut", "X")); + actions.push(createAction("Copy", "unavailable", "SingleWordCommand Copy", "C")); + var AbsNodeType = abstractNode.type; + if (clipBoard && (AbsNodeType == grammar.abstract.getCat(clipBoard.name))) { + actions.push(createAction("Paste", "action", "SingleWordCommand Paste", "V")); + } + else { actions.push(createAction("Paste", "unavailable", "SingleWordCommand Paste", "V")); } + actions.push(createAction("Delete", "unavailable", "SingleWordCommand Delete", "D")); + actions.push(createAction("Refine", "action", "SingleWordCommand Refine", "R")); + actions.push(createAction("Replace", "unavailable", "SingleWordCommand Replace", "E")); + actions.push(createAction("Wrap", "unavailable", "SingleWordCommand Wrap", "W")); + for (var i in grammar.concretes) { + if (grammar.concretes[i].parser) { + actions.push(createAction("Parse", "action", "Command Parse IndefSgDet String_N", "P")); + } else { actions.push(createAction("Parse", "unavailable", "Command Parse IndefSgDet String_N", "P")); } + break; + } + } + else if (node.caption) { + actions.push(createAction("Cut", "action", "SingleWordCommand Cut", "X")); + actions.push(createAction("Copy", "action", "SingleWordCommand Copy", "C")); + actions.push(createAction("Paste", "unavailable", "SingleWordCommand Paste", "V")); + actions.push(createAction("Delete", "action", "SingleWordCommand Delete", "D")); + actions.push(createAction("Refine", "unavailable", "SingleWordCommand Refine", "R")); + actions.push(createAction("Replace", "action", "SingleWordCommand Replace", "E")); + actions.push(createAction("Wrap", "action", "SingleWordCommand Wrap", "W")); + actions.push(createAction("Parse", "unavailable", "Command Parse IndefSgDet String_N", "P")); + } + if (node && !abstractNode.isComplete()) { + actions.push(createAction("RandomNode", "action", "RandomlyCommand Refine DefSgDet Node", "N")); + } + else { + actions.push(createAction("RandomNode", "unavailable", "RandomlyCommand Refine DefSgDet Node", "N")); + } + if (!abstractTree.isComplete()) { + actions.push(createAction("RandomTree", "action", "RandomlyCommand Refine DefSgDet Tree", "T")); + } + else { + actions.push(createAction("RandomTree", "unavailable", "RandomlyCommand Refine DefSgDet Tree", "T")); + } + actions.push("
    "); + return actions.join(""); + +} + +// Creates an action +function createAction(actionName, className, caption, hotKey) { + return "" + caption + "(" + hotKey + ")"; +} + +// When the "Refine" action is selected, gets the appropriate refinements for a node +function clickRefine(actName) { + if (document.getElementById(actName).className == "action") { + highlightSelectedAction(actName); + pushUndoClearRedo(); + if (selectedNode) { + refPageCounter = 0; + var node = getNodeFromAbstract(abstractTree, selectedNode, "0"); + if (node.type == "String" || node.type == "Int" || node.type == "Float") { + var newType = undefined; + var newTypeCat = node.type + "_Literal_"; + switch(node.type) + { + case "String": + newType = prompt(editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree("Command Enter IndefSgDet String_N", editorGrammar.abstract.startcat)),'String'); + if (!newType) { newType = "AutoString"; } + break; + case "Int": + while (isNaN(newType) || (newType && newType.indexOf(".") != -1)) { + newType = prompt(editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree("Command Enter IndefSgDet Integer_N", editorGrammar.abstract.startcat)),'Int'); + } + if (!newType) { newType = "8"; } + break; + case "Float": + while (isNaN(newType)) { + newType = prompt(editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree("Command Enter IndefSgDet Float_N", editorGrammar.abstract.startcat)),'Float'); + } + if (!newType) { newType = "8.0"; } + if (newType.indexOf(".") == -1) { newType += ".0"; } + break; + } + if (node.type == "String") { + newTypeCat += "\"" + newType + "\""; + } else { + newTypeCat += newType; + } + if (!grammar.abstract.types[newTypeCat]) { + grammar.abstract.addType(newTypeCat, [], node.type); + for (var i in grammar.concretes) { + grammar.concretes[i].addRule(newTypeCat, function(cs){ return new Arr(new Str(newType));}); + } + } + node.name = newTypeCat; + abstractTree = insertNode(abstractTree, selectedNode, "0", node); + document.getElementById("actFrame").innerHTML = showActions(); + document.getElementById("refFrame").innerHTML = ""; + clearHotKeys(); + concludeAction(); + } else { + document.getElementById("refFrame").innerHTML = showRefinements(selectedNode); + } + } + } +} + +// Sets the className of actName to "selected" and grays out the other selections +function highlightSelectedAction(actName) { + graySelections(actName); + document.getElementById(actName).className = "selected"; + drawTree(); +} + +// Grays out all actions except one +function graySelections(except) { + var refs = document.getElementById("actFrame").getElementsByTagName("tr"); + for (var i = 0, j = refs.length; i < j; i++) { + if (refs[i].id != except) { refs[i].className = "closed"; } + } +} + +// Pushes the abstract tree into the undo array and clears the redo array +function pushUndoClearRedo() { + undoArray.push(new state(selectedNode, abstractTree, collapseBuffer)); + redoArray.length = 0; +} + +// Gets the refinements to display +function showRefinements(nodeName) { +// var refs = getAvailableRefinements(nodeName); + var refs = getAvailableRefinements(nodeName, abstractTree, grammar); + var rowsPerPage = 9; + var pages = Math.floor(refs.length / rowsPerPage); + var upperLimit; + if (pages != refPageCounter) { upperLimit = (rowsPerPage * refPageCounter) + rowsPerPage; } + else { upperLimit = refs.length; } + var refinements = new Array(); + refinements.push(""); + var keyPos = 0; + refinements.push(ref_wrapToHtml("ref", "genRefRandom", "refinement", "", keyPos, "RandomlyCommand Select IndefSgDet Refinement")); + keys["" + keyPos] = mkRefHotKey("genRefRandom"); + keyPos++; + for (var i = (rowsPerPage * refPageCounter), j = upperLimit; i < j; i++) { + refinements.push(ref_wrapToHtml("ref", refs[i], "refinement", "", keyPos, "")); + keys["" + keyPos] = mkRefHotKey(refs[i]); + keyPos++; + } + if (((refs.length % rowsPerPage == 0) && (pages - 1) > refPageCounter) || + ((refs.length % rowsPerPage != 0) && pages > refPageCounter) ) { + refinements.push(ref_wrapNextRefsToHtml("nextRefs", "Next", "refinement", "+", editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree("CommandAdj Show DefSgDet Next Page", editorGrammar.abstract.startcat)))); + keys["107"] = mkRefNextRefsHotKey("Next"); + } + if (0 < refPageCounter) { + refinements.push(ref_wrapNextRefsToHtml("nextRefs", "Previous", "refinement", "-", editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree("CommandAdj Show DefSgDet Previous Page", editorGrammar.abstract.startcat)))); + keys["109"] = mkRefNextRefsHotKey("Previous"); + } + refinements.push("
    "); + return refinements.join(""); +} + +// Creates an HTML representation of a Refinement/Wrap +function ref_wrapToHtml(funct, name, className, arg, hotKeyPos, caption) { + var ref_wrapHtml = new Array(); + ref_wrapHtml.push(""); + if (caption) { ref_wrapHtml.push(editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree(caption, editorGrammar.abstract.startcat))); } + else { ref_wrapHtml.push(name, " : ", refArgsToHtml(name), grammar.abstract.getCat(name)); } + ref_wrapHtml.push("(", hotKeyPos, ")"); + return ref_wrapHtml.join(""); +} + +// Creates the function to be used by a "numeric" hot key +function mkRefHotKey(refName) { + return function() { if (document.getElementById("ref" + refName)) { refClick(refName); } } +} + +// Creates an HTML representation of the Next/Previous Refinement/Wrap page +function ref_wrapNextRefsToHtml(funct, name, className, hotKeyPos, caption) { + var ref_wrapHtml = new Array(); + ref_wrapHtml.push(""); + ref_wrapHtml.push(caption); + ref_wrapHtml.push("(", hotKeyPos, ")"); + return ref_wrapHtml.join(""); +} + +// Creates the function to be used by a "+"/"-" hot key +function mkRefNextRefsHotKey(refName) { + return function() { if (document.getElementById("nextRefs" + refName)) { nextRefsClick(refName); } } +} + +// Creates a string representation of the arguments of a refinement +function refArgsToHtml(fun) { + var args = new Array(); + for (var i = 0, j = grammar.abstract.types[fun].args.length; i < j; i++) { + args.push(grammar.abstract.types[fun].args[i], " -> "); + } + return args.join(""); +} + +// Gets the type of a meta variable +function getMetaType(absNode, route, currRoute) { + if (route == currRoute && absNode.isMeta()) { + return absNode.type; + } + else { + for (var i = 0, j = absNode.args.length; i < j; i++) { + var found = getMetaType(absNode.args[i], route, currRoute + "-" + i); + if (found) { return found }; + } + } +} + +// When the "Undo" action is selected, undoes the last action +function clickUndo(actName) { + if (document.getElementById(actName).className == "action" && undoArray.length) { + highlightSelectedAction(actName); + redoArray.push(new state(selectedNode, abstractTree, collapseBuffer)); + var prevState = undoArray.pop(); + selectedNode = prevState.selectedNode; + abstractTree = grammar.abstract.copyTree(prevState.tree); + collapseBuffer = prevState.collapseBuffer; + if (abstractTree.isComplete()) { selectedNode = "0"; } + abstractTree = grammar.abstract.annotate(abstractTree, grammar.abstract.startcat); + myTree = treeFromAbstract(abstractTree, "0"); + nodeClick(selectedNode); + } +} + +// When the "Redo" action is selected, redoes the last action +function clickRedo(actName) { + if (document.getElementById(actName).className == "action" && redoArray.length) { + highlightSelectedAction(actName); + undoArray.push(new state(selectedNode, abstractTree, collapseBuffer)); + var nextState = redoArray.pop(); + selectedNode = nextState.selectedNode; + abstractTree = grammar.abstract.copyTree(nextState.tree); + collapseBuffer = nextState.collapseBuffer; + abstractTree = grammar.abstract.annotate(abstractTree, grammar.abstract.startcat); + myTree = treeFromAbstract(abstractTree, "0"); + nodeClick(selectedNode); + } +} + +// When the "Copy" action is selected, copies the selected node to the clipboard +function clickCopy(actName) { + if (document.getElementById(actName).className == "action") { + highlightSelectedAction(actName); + if (selectedNode) { + clipBoard = grammar.abstract.copyTree(getNodeFromAbstract(abstractTree, selectedNode, "0")); + document.getElementById("clipboardFrame").innerHTML = clipBoard.name + " : " + grammar.abstract.getCat(clipBoard.name); + nodeClick(selectedNode); + } + } +} + +// When the "Cut" action is selected, deletes the selected node and copies it to the clipboard +function clickCut(actName) { + if (document.getElementById(actName).className == "action") { + highlightSelectedAction(actName); + pushUndoClearRedo(); + if (selectedNode) { + clipBoard = grammar.abstract.copyTree(getNodeFromAbstract(abstractTree, selectedNode, "0")); + document.getElementById("clipboardFrame").innerHTML = clipBoard.name + " : " + grammar.abstract.getCat(clipBoard.name); + abstractTree = deleteNode(abstractTree, selectedNode, "0"); + concludeAction(); + } + } +} + +// Annotates the abstract tree, creates a tree from the abstract tree and selects the next meta variable +function concludeAction() { + abstractTree = grammar.abstract.annotate(abstractTree, grammar.abstract.startcat); + myTree = treeFromAbstract(abstractTree, "0"); + selectNextMeta(); +} + +// Selects the next meta variable available +function selectNextMeta() { + nodeClick(selectedNode); + if (!abstractTree.isComplete()) { + var pathToNextMeta = ""; + var nodePos = getNavPos(selectedNode); + while (1) { + if (nodePos == navigationControlString.length) { nodePos = 0; } + var node = getNode(navigationControlString[nodePos], myTree); + if (node.caption == "?") { pathToNextMeta = node.name; break; } + nodePos++; + } + expandAscendants(pathToNextMeta); + nodeClick(pathToNextMeta); + } +} + +// Expands the ascendants of a given node +function expandAscendants(nodeName) { + var nodePath = nodeName.split("-"); + var currAscendant = nodePath.shift(); + while (nodePath.length > 0) { + var node = getNode(currAscendant, myTree); + if (node.collapsed) { + myTree = expandCollapse(myTree, currAscendant); + } + currAscendant += "-" + nodePath.shift(); + } +} + +// When the "Paste" action is selected, pastes the contents of the clipboard into the selected node +function clickPaste(actName) { + if (document.getElementById(actName).className == "action") { + highlightSelectedAction(actName); + pushUndoClearRedo(); + if (selectedNode) { + abstractTree = insertNode(abstractTree, selectedNode, "0", grammar.abstract.copyTree(clipBoard)); + concludeAction(); + } + } +} + +// When the "Delete" action is selected, deletes the selected node +function clickDelete(actName) { + if (document.getElementById(actName).className == "action") { + highlightSelectedAction(actName); + pushUndoClearRedo(); + if (selectedNode) { + abstractTree = deleteNode(abstractTree, selectedNode, "0"); + abstractTree = grammar.abstract.annotate(abstractTree, grammar.abstract.startcat); + myTree = treeFromAbstract(abstractTree, "0"); + nodeClick(selectedNode); + } + } +} + +// When the "Replace" action is selected, replaces the selected node with another refinement +function clickReplace(actName) { + if (document.getElementById(actName).className == "action") { + highlightSelectedAction(actName); + pushUndoClearRedo(); + if (selectedNode) { + refPageCounter = 0; + abstractTree = deleteNode(abstractTree, selectedNode, "0"); + abstractTree = grammar.abstract.annotate(abstractTree, grammar.abstract.startcat); + myTree = treeFromAbstract(abstractTree, "0"); + drawTree(); + document.getElementById("refFrame").innerHTML = showRefinements(selectedNode); + } + } +} + +// When the "Wrap" action is selected, wraps around the selected node with another refinement +function clickWrap(actName) { + if (document.getElementById(actName).className == "action") { + highlightSelectedAction(actName); + pushUndoClearRedo(); + var node = getNode(selectedNode, myTree); + if (selectedNode) { + refPageCounter = 0; + var wrappers = showWrappers(node.caption); + document.getElementById("refFrame").innerHTML = wrappers; + if (wrappers.length <= 31) { + alert(editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree("ErrorMessage Available Wrapper", editorGrammar.abstract.startcat))); + document.getElementById("actFrame").innerHTML = showActions(); + nodeClick(selectedNode); + } + } + } +} + +// Gets the wrappers to display +function showWrappers(nodeCaption) { + var nodeType = grammar.abstract.types[nodeCaption].cat; + var rowsPerPage = 10; +// var availWrappers = getAvailableWrappers(nodeType); + var availWrappers = getAvailableWrappers(nodeType, grammar, selectedNode); + var pages = Math.floor(availWrappers.length / rowsPerPage); + var upperLimit; + if (pages != refPageCounter) { upperLimit = (rowsPerPage * refPageCounter) + rowsPerPage; } + else { upperLimit = availWrappers.length; } + var wrappers = new Array(); + wrappers.push(""); + var keyPos = 0; + for (var i = (rowsPerPage * refPageCounter), j = upperLimit; i < j; i++) { + wrappers.push(ref_wrapToHtml("wrap", availWrappers[i][0], "wrapper", ", " + availWrappers[i][1], keyPos, "")); + keys["" + keyPos] = mkWrapHotKey(availWrappers[i][0], availWrappers[i][1]); + keyPos++; + } + if (((availWrappers.length % rowsPerPage == 0) && (pages - 1) > refPageCounter) || + ((availWrappers.length % rowsPerPage != 0) && pages > refPageCounter) ) { + wrappers.push(ref_wrapNextRefsToHtml("nextWraps", "Next", "wrapper", "+", editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree("CommandAdj Show DefSgDet Next Page", editorGrammar.abstract.startcat)))); + keys["107"] = mkWrapNextRefsHotKey("Next"); + } + if (0 < refPageCounter) { + wrappers.push(ref_wrapNextRefsToHtml("nextWraps", "Previous", "wrapper", "-", editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree("CommandAdj Show DefSgDet Previous Page", editorGrammar.abstract.startcat)))); + keys["109"] = mkWrapNextRefsHotKey("Previous"); + } + wrappers.push("
    "); + return wrappers.join(""); +} + +// Creates the function to be used by a "numeric" hot key +function mkWrapHotKey(wrapName, argPos) { + return function() { if (document.getElementById("wrap" + wrapName)) { wrapClick(wrapName, argPos); } } +} + +// Creates the function to be used by a "+"/"-" hot key +function mkWrapNextRefsHotKey(wrapName) { + return function() { if (document.getElementById("nextWraps" + wrapName)) { nextWrapsClick(wrapName); } } +} + +// When the "Parse" action is selected, asks the user for a string and parses it +// to generate the subnode +function clickParse(actName) { + if (document.getElementById(actName).className == "action") { + highlightSelectedAction(actName); + var node = getNode(selectedNode, myTree); + if (selectedNode) { + refPageCounter = 0; + parseTrees = undefined; + var string = prompt(editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree("Command Enter IndefSgDet String_N", editorGrammar.abstract.startcat)),'String'); + if (string || string == "") { + for (var i in grammar.concretes) { + parseTrees = grammar.concretes[i].parser.parseString(string, node.cat); + if (parseTrees.length == 1) { + pushUndoClearRedo(); + abstractTree = insertNode(abstractTree, selectedNode, "0", grammar.abstract.copyTree(grammar.abstract.handleLiterals(parseTrees[0], node.cat))); + document.getElementById("actFrame").innerHTML = showActions(); + document.getElementById("refFrame").innerHTML = ""; + clearHotKeys(); + concludeAction(); + return false; + } else if (parseTrees.length > 1) { + document.getElementById("refFrame").innerHTML = showTrees(); + return false; + } + } + } else { nodeClick(selectedNode); return false; } + alert(editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree("ErrorMessage Available Tree", editorGrammar.abstract.startcat))); + } + nodeClick(selectedNode); + } +} + +// Displays the parse trees in the refinements panel +function showTrees() { + var rowsPerPage = 10; + var pages = Math.floor(parseTrees.length / rowsPerPage); + var upperLimit; + if (pages != refPageCounter) { upperLimit = (rowsPerPage * refPageCounter) + rowsPerPage; } + else { upperLimit = parseTrees.length; } + var htmlTrees = new Array(); + htmlTrees.push(""); + var keyPos = 0; + for (var i = (rowsPerPage * refPageCounter), j = upperLimit; i < j; i++) { + htmlTrees.push(treeToHtml(i, keyPos, "")); + keys["" + keyPos] = mkTreeHotKey(i, keyPos); + keyPos++; + } + if (((parseTrees.length % rowsPerPage == 0) && (pages - 1) > refPageCounter) || + ((parseTrees.length % rowsPerPage != 0) && pages > refPageCounter) ) { + htmlTrees.push(ref_wrapNextRefsToHtml("nextTrees", "Next", "tree", "+", editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree("CommandAdj Show DefSgDet Next Page", editorGrammar.abstract.startcat)))); + keys["107"] = mkTreeNextRefsHotKey("Next"); + } + if (refPageCounter > 0) { + htmlTrees.push(ref_wrapNextRefsToHtml("nextTrees", "Previous", "tree", "-", editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree("CommandAdj Show DefSgDet Previous Page", editorGrammar.abstract.startcat)))); + keys["109"] = mkTreeNextRefsHotKey("Previous"); + } + htmlTrees.push("
    "); + return htmlTrees.join(""); +} + +// Creates an HTML representation of a parse Tree to be shown in the refinements panel +function treeToHtml(i, hotKeyPos, caption) { + var htmlTree = new Array(); + htmlTree.push(""); + if (caption) { htmlTree.push(editorGrammar.concretes[selectedLanguage].linearize(editorGrammar.abstract.parseTree(caption, editorGrammar.abstract.startcat))); } + else { htmlTree.push(parseTrees[i].show()); } + htmlTree.push("(", hotKeyPos, ")"); + return htmlTree.join(""); +} + +// Creates the function to be used by a "numeric" hot key +function mkTreeHotKey(i, keyPos) { + return function() { if (document.getElementById("tree" + keyPos)) { treeClick(i); } } +} + +// Creates the function to be used by a "+"/"-" hot key +function mkTreeNextRefsHotKey(treeName) { + return function() { if (document.getElementById("nextTrees" + treeName)) { nextTreesClick(treeName); } } +} + + +// When the "RandomNode" action is selected, refines the node at random +function clickRandomNode(actName) { + if (document.getElementById(actName).className == "action") { + highlightSelectedAction(actName); + pushUndoClearRedo(); + if (selectedNode) { + var tempTree = grammar.abstract.copyTree(abstractTree); + abstractTree = insertNode(tempTree, selectedNode, "0", grammar.abstract.copyTree(fillSubTree(grammar.abstract.copyTree(getNodeFromAbstract(abstractTree, selectedNode, "0")), grammar))); + concludeAction(); + } + } +} + +// When the "RandomTree" action is selected, refines the tree at random +function clickRandomTree(actName) { + if (document.getElementById(actName).className == "action") { + highlightSelectedAction(actName); + pushUndoClearRedo(); + abstractTree = grammar.abstract.copyTree(fillSubTree(abstractTree, grammar)); + concludeAction(); + } +} + +// If a node is selected and is of type meta, it refines the node with a type refName +function refClick(refName) { + if (selectedNode) { + if (refName == "genRefRandom") { +// var refs = getAvailableRefinements(selectedNode); + var refs = getAvailableRefinements(selectedNode, abstractTree, grammar); + refName = refs[Math.floor(refs.length * Math.random())]; + } + abstractTree = refineAbstractTree(abstractTree, selectedNode, "0", refName); + document.getElementById("actFrame").innerHTML = showActions(); + document.getElementById("refFrame").innerHTML = ""; + clearHotKeys(); + concludeAction(); + } +} + +// Creates a tree from an abstract tree +function treeFromAbstract(abstractNode, name) { + var node = new treeNode(name, abstractNode.name); + if (node.caption == "?") { + node.cat = abstractNode.type; } + else { + if (grammar.abstract.types[node.caption]) { + node.cat = grammar.abstract.getCat(node.caption); + } else { + node.cat = node.caption.substring(0, node.caption.indexOf("_")); + grammar.abstract.addType(node.caption, [], node.cat); + var linStr = undefined; + if (node.cat == "String") { + linStr = node.caption.substring(node.caption.indexOf("\"") + 1, node.caption.length - 1); + } else { + linStr = node.caption.substring(node.caption.lastIndexOf("_") + 1) + } + for (var i in grammar.concretes) { + grammar.concretes[i].addRule(node.caption, function(cs){ return new Arr(new Str(linStr));}); + } + } + } + if (wasCollapsed(node.name)) { node.collapsed = true; } + for (var i = 0, j = abstractNode.args.length; i < j; i++) { + node.addChild(i, treeFromAbstract(abstractNode.args[i], name + "-" + i)); + } + return node +} + +// Wraps a refinement around a node +function wrapClick(wrapName, argPos) { + if (selectedNode) { + var tempNode = createRefinement(wrapName); + tempNode.setArg(argPos, grammar.abstract.copyTree(getNodeFromAbstract(abstractTree, selectedNode, "0"))); + abstractTree = insertNode(abstractTree, selectedNode, "0", tempNode); + var cat = grammar.abstract.getCat(tempNode.name); + if (selectedNode == "0" && cat != grammar.abstract.startcat) { + grammar.abstract.startcat = cat; + } + document.getElementById("actFrame").innerHTML = showActions(); + document.getElementById("refFrame").innerHTML = ""; + clearHotKeys(); + concludeAction(); + } +} + +// Wraps a refinement around a node +function treeClick(i) { + if (selectedNode) { + pushUndoClearRedo(); + var node = getNode(selectedNode, myTree); + var tempNode = grammar.abstract.copyTree(grammar.abstract.handleLiterals(parseTrees[i], node.cat)); + abstractTree = insertNode(abstractTree, selectedNode, "0", tempNode); + document.getElementById("actFrame").innerHTML = showActions(); + document.getElementById("refFrame").innerHTML = ""; + clearHotKeys(); + concludeAction(); + } +} + +// Handler for the escape key +function clickEsc() { + if ((document.getElementById("actRefine").className == "selected" || + document.getElementById("actReplace").className == "selected" || + document.getElementById("actWrap").className == "selected" || + document.getElementById("actParse").className == "selected") && undoArray.length) { + var prevState = undoArray.pop(); + selectedNode = prevState.selectedNode; + abstractTree = grammar.abstract.copyTree(prevState.tree); + collapseBuffer = prevState.collapseBuffer; + abstractTree = grammar.abstract.annotate(abstractTree, grammar.abstract.startcat); + myTree = treeFromAbstract(abstractTree, "0"); + document.getElementById("actFrame").innerHTML = showActions(); + if (selectedNode) { nodeClick(selectedNode) } + } +} + +// If there are over ten refinements available shows only the selected nine +function nextRefsClick(refName) { + if (refName == "Next") { refPageCounter++; } else { refPageCounter--; } + clearHotKeys(); + document.getElementById("refFrame").innerHTML = showRefinements(selectedNode); +} + +// If there are over ten wrappers available shows only the selected nine +function nextWrapsClick(wrapName) { + if (wrapName == "Next") { refPageCounter++; } else { refPageCounter--; } + clearHotKeys(); + var node = getNode(selectedNode, myTree); + document.getElementById("refFrame").innerHTML = showWrappers(node.caption); +} + +// If there are over ten parse trees available shows only the selected nine +function nextTreesClick(treeName) { + if (treeName == "Next") { refPageCounter++; } else { refPageCounter--; } + clearHotKeys(); + document.getElementById("refFrame").innerHTML = showTrees(); +} + +/* -------------------------------------------------------------------------- */ +/* ---------- GUI independent functions to handle syntax editing ---------- */ +/* -------------------------------------------------------------------------- */ + +// Gets the node rooted at the indicated path (route) in the tree absNode +function getNodeFromAbstract(absNode, route, currRoute) { + if (route == currRoute) { + return absNode; + } + else { + for (var i = 0, j = absNode.args.length; i < j; i++) { + var found = getNodeFromAbstract(absNode.args[i], route, currRoute + "-" + i); + if (found) { return found; } + } + } +} + +// Gets the first metavariable from the abstract tree rooted at the path route +function getNextMetaFromAbstract(node, route) { + if (node.isMeta()) { return route; } + for (var i = 0, j = node.args.length; i < j; i++) { + var found = getNextMetaFromAbstract(node.args[i], route + "-" + i); + if (found) { return found; } + } +} + +// Inserts the node into the abstract tree absNode at the path route +function insertNode(absNode, route, currRoute, node) { + if (route == currRoute) { + return node; + } + else { + for (var i = 0, j = absNode.args.length; i < j; i++) { + absNode.setArg(i, insertNode(absNode.args[i], route, currRoute + "-" + i, node)); + } + return absNode; + } +} + +// Deletes the node rooted at the path route from the abstract tree absNode +function deleteNode(absNode, route, currRoute) { + if (route == currRoute) { + return new Fun("?"); + } + else { + for (var i = 0, j = absNode.args.length; i < j; i++) { + absNode.setArg(i, deleteNode(absNode.args[i], route, currRoute + "-" + i)); + } + return absNode; + } +} + +// Gets the available refinements for the node nodeName, which is in the tree +// abstractTree, from those found in the grammar. +function getAvailableRefinements(nodeName, abstractTree, grammar) { + var node = getNodeFromAbstract(abstractTree, nodeName, "0"); + var metaType = node.type; + var refinements = new Array(); + for (var fun in grammar.abstract.types) { + if (grammar.abstract.types[fun].cat == metaType) { + refinements[refinements.length] = fun; + } + } + return refinements; +} + +// It refines the node rooted at the path route in the abstract tree absNode +// with the refinement refName. Returns the refined abstract tree. +function refineAbstractTree(absNode, route, currRoute, refName) { + if (route == currRoute && absNode.isMeta()) { + return createRefinement(refName); + } + else { + for (var i = 0, j = absNode.args.length; i < j; i++) { + absNode.setArg(i, refineAbstractTree(absNode.args[i], route, currRoute + "-" + i, refName)); + } + return absNode; + } +} + +// Creates a node of type refName object with the appropriate number of arguments +function createRefinement(refName) { + var newRef = new Fun(refName); + for (var i = 0, j = grammar.abstract.types[refName].args.length; i < j; i++) { + newRef.setArg(i, new Fun("?")); + } + return newRef; +} + +// Gets the available wrappers for a node of type nodeType found in the grammar +function getAvailableWrappers(nodeType, grammar, top) { + var wrappers = new Array(); + for (var fun in grammar.abstract.types) { + for (var i = 0, j = grammar.abstract.types[fun].args.length; i < j; i++) { + if (top != "0") { + if (grammar.abstract.types[fun].args[i] == nodeType && grammar.abstract.types[fun].cat == nodeType) { + wrappers[wrappers.length] = new Array(fun, i); + break; + } + } else { + if (grammar.abstract.types[fun].args[i] == nodeType) { + wrappers[wrappers.length] = new Array(fun, i); + break; + } + } + } + } + return wrappers; +} + +// Instantiates metavariables found in the tree abstractTree with refinements +// selected at random from those found in the grammar +function fillSubTree(abstractTree, grammar) { + while (!abstractTree.isComplete()) { + var nodeToRefine = getNextMetaFromAbstract(abstractTree, "0"); + if (nodeToRefine) { + var refs = getAvailableRefinements(nodeToRefine, abstractTree, grammar); + if (refs.length == 0) { + var node = getNodeFromAbstract(abstractTree, nodeToRefine, "0"); + if (node.type == "String" || node.type == "Int" || node.type == "Float") { + var newType = undefined; + var newTypeCat = node.type + "_Literal_"; + switch(node.type) + { + case "String": + newType = "AutoString"; + break; + case "Int": + newType = "8"; + break; + case "Float": + newType = "8.0"; + break; + } + if (node.type == "String") { + newTypeCat += "\"" + newType + "\""; + } else { + newTypeCat += newType; + } + if (!grammar.abstract.types[newTypeCat]) { + grammar.abstract.addType(newTypeCat, [], node.type); + for (var i in grammar.concretes) { + grammar.concretes[i].addRule(newTypeCat, function(cs){ return new Arr(new Str(newType));}); + } + } + node.name = newTypeCat; + abstractTree = insertNode(abstractTree, nodeToRefine, "0", node); + abstractTree = grammar.abstract.annotate(abstractTree, grammar.abstract.startcat); + } + } + else { + var selectedRef = refs[Math.floor(refs.length * Math.random())]; + abstractTree = refineAbstractTree(abstractTree, nodeToRefine, "0", selectedRef); + abstractTree = grammar.abstract.annotate(abstractTree, grammar.abstract.startcat); + } + } + } + return abstractTree; +} diff --git a/lib/javascript/gflib.js b/lib/javascript/gflib.js index e3f30b42f..6c5b77c66 100644 --- a/lib/javascript/gflib.js +++ b/lib/javascript/gflib.js @@ -1,3 +1,18 @@ + +function GFGrammar(abstract, concretes) { + this.abstract = abstract; + this.concretes = concretes; +} + +/* ------------------------------------------------------------------------- */ +/* ----------------------------- LINEARIZATION ----------------------------- */ +/* ------------------------------------------------------------------------- */ + +/* Extension to the String object */ + +String.prototype.tag = ""; +String.prototype.setTag = function (tag) { this.tag = tag; }; + /* Abstract syntax trees */ function Fun(name) { this.name = name; @@ -40,8 +55,8 @@ Fun.prototype.isComplete = function() { if (this.isMeta()) { return false; } else { - for (var i in tree.args) { - if (!tree.args[i].isComplete()) { + for (var i in this.args) { + if (!this.args[i].isComplete()) { return false; } } @@ -54,6 +69,11 @@ Fun.prototype.isComplete = function() { function Arr() { this.arr = copy_arguments(arguments, 0); } Arr.prototype.tokens = function() { return this.arr[0].tokens(); }; Arr.prototype.sel = function(i) { return this.arr[i.toIndex()]; }; +Arr.prototype.setTag = function(tag) { + for (var i = 0, j = this.arr.length; i < j; i++) { + this.arr[i].setTag(tag); + } +}; function Seq() { this.seq = copy_arguments(arguments, 0); } Seq.prototype.tokens = function() { @@ -66,45 +86,93 @@ Seq.prototype.tokens = function() { } return xs; }; +Seq.prototype.setTag = function(tag) { + for (var i = 0, j = this.seq.length; i < j; i++) { + this.seq[i].setTag(tag); + } +}; function Variants() { this.variants = copy_arguments(arguments, 0); } Variants.prototype.tokens = function() { return this.variants[0].tokens(); }; +Variants.prototype.sel = function(i) { return this.variants[0].sel(i); }; +Variants.prototype.toIndex = function() { return this.variants[0].toIndex(); }; +Variants.prototype.setTag = function(tag) { + for (var i = 0, j = this.variants.length; i < j; i++) { + this.variants[i].setTag(tag); + } +}; function Rp(index,value) { this.index = index; this.value = value; } -Rp.prototype.tokens = function() { return new Array(this.index); }; +Rp.prototype.tokens = function() { return new Array(this.index.tokens()); }; +Rp.prototype.sel = function(i) { return this.value.arr[i.toIndex()]; }; Rp.prototype.toIndex = function() { return this.index.toIndex(); }; +Rp.prototype.setTag = function(tag) { this.index.setTag(tag) }; -function Suffix(prefix,suffix) { this.prefix = prefix; this.suffix = suffix; }; +function Suffix(prefix,suffix) { + this.prefix = new String(prefix); + if (prefix.tag) { this.prefix.tag = prefix.tag; } + this.suffix = suffix; +}; Suffix.prototype.tokens = function() { var xs = this.suffix.tokens(); for (var i in xs) { - xs[i] = this.prefix + xs[i]; + xs[i] = new String(this.prefix + xs[i]); + xs[i].setTag(this.prefix.tag); } return xs; }; Suffix.prototype.sel = function(i) { return new Suffix(this.prefix, this.suffix.sel(i)); }; +Suffix.prototype.setTag = function(tag) { if (!this.prefix.tag) { this.prefix.setTag(tag); } }; function Meta() { } -Meta.prototype.tokens = function() { return new Array("?"); }; +Meta.prototype.tokens = function() { + var newString = new String("?"); + newString.setTag(this.tag); + return new Array(newString); +}; Meta.prototype.toIndex = function() { return 0; }; Meta.prototype.sel = function(i) { return this; }; +Meta.prototype.setTag = function(tag) { if (!this.tag) { this.tag = tag; } }; function Str(value) { this.value = value; } -Str.prototype.tokens = function() { return new Array(this.value); }; +Str.prototype.tokens = function() { + var newString = new String(this.value); + newString.setTag(this.tag); + return new Array(newString); +}; +Str.prototype.setTag = function(tag) { if (!this.tag) { this.tag = tag; } }; function Int(value) { this.value = value; } -Int.prototype.tokens = function() { return new Array(this.value.toString()); }; +Int.prototype.tokens = function() { + var newString = new String(this.value.toString()); + newString.setTag(this.tag); + return new Array(newString); +}; Int.prototype.toIndex = function() { return this.value; }; +Int.prototype.setTag = function(tag) { if (!this.tag) { this.tag = tag; } }; /* Type annotation */ -function Abstract() { +/* +function Abstract(startcat) { this.types = new Array(); + this.startcat = startcat; } -Abstract.prototype.addType = function(fun, args, cat) { +*/ +function GFAbstract(startcat, types) { + this.startcat = startcat; + this.types = types; +} +GFAbstract.prototype.addType = function(fun, args, cat) { this.types[fun] = new Type(args, cat); } ; -Abstract.prototype.annotate = function(tree, type) { +GFAbstract.prototype.getArgs = function(fun) { + return this.types[fun].args; +} +GFAbstract.prototype.getCat = function(fun) { + return this.types[fun].cat; +}; +GFAbstract.prototype.annotate = function(tree, type) { if (tree.name == '?') { tree.type = type; } else { @@ -115,8 +183,21 @@ Abstract.prototype.annotate = function(tree, type) { } return tree; } ; +GFAbstract.prototype.handleLiterals = function(tree, type) { + if (tree.name != '?') { + if (type == "String" || type == "Int" || type == "Float") { + tree.name = type + "_Literal_" + tree.name; + } else { + var typ = this.types[tree.name]; + for (var i in tree.args) { + this.handleLiterals(tree.args[i], typ.args[i]); + } + } + } + return tree; +} ; /* Hack to get around the fact that our SISR doesn't build real Fun objects. */ -Abstract.prototype.copyTree = function(x) { +GFAbstract.prototype.copyTree = function(x) { var t = new Fun(x.name); if (!isUndefined(x.type)) { t.type = x.type; @@ -129,10 +210,10 @@ Abstract.prototype.copyTree = function(x) { } return t; } ; -Abstract.prototype.parseTree = function(str, type) { - return this.annotate(this.parseTree_(str.match(/[\w\']+|\(|\)|\?/g), 0), type); +GFAbstract.prototype.parseTree = function(str, type) { + return this.annotate(this.parseTree_(str.match(/[\w\'\.\"]+|\(|\)|\?|\:/g), 0), type); } ; -Abstract.prototype.parseTree_ = function(tokens, prec) { +GFAbstract.prototype.parseTree_ = function(tokens, prec) { if (tokens.length == 0 || tokens[0] == ")") { return null; } var t = tokens.shift(); if (t == "(") { @@ -140,6 +221,7 @@ Abstract.prototype.parseTree_ = function(tokens, prec) { tokens.shift(); return tree; } else if (t == '?') { + var tree = this.parseTree_(tokens, 0); return new Fun('?'); } else { var tree = new Fun(t); @@ -159,18 +241,28 @@ function Type(args, cat) { } /* Linearization */ - +/* function Concrete(abstr) { this.abstr = abstr; this.rules = new Array(); + this.parser = undefined; } -Concrete.prototype.rule = function (name, cs) { return this.rules[name](cs); }; -Concrete.prototype.addRule = function (name, f) { this.rules[name] = f; }; -Concrete.prototype.lindef = function (cat, v) { return this.rules["_d"+cat]([new Str(v)]); } ; -Concrete.prototype.linearize = function (tree) { +*/ +function GFConcrete(rules, parser) { + this.rules = rules; + if (parser) { + this.parser = parser; + } else { + this.parser = undefined; + } +} +GFConcrete.prototype.rule = function (name, cs) { return this.rules[name](cs); }; +GFConcrete.prototype.addRule = function (name, f) { this.rules[name] = f; }; +GFConcrete.prototype.lindef = function (cat, v) { return this.rules[cat]([new Str(v)]); } ; +GFConcrete.prototype.linearize = function (tree) { return this.unlex(this.linearizeToTerm(tree).tokens()); }; -Concrete.prototype.linearizeToTerm = function (tree) { +GFConcrete.prototype.linearizeToTerm = function (tree) { if (tree.isMeta()) { if (isUndefined(tree.type)) { return new Meta(); @@ -178,14 +270,15 @@ Concrete.prototype.linearizeToTerm = function (tree) { return this.lindef(tree.type, tree.name); } } else { - var cs = new Array(); + var cs = new Array(); for (var i in tree.args) { cs.push(this.linearizeToTerm(tree.args[i])); } - return this.rule(tree.name, cs); + var newTerm = this.rule(tree.name, cs); + return newTerm; } }; -Concrete.prototype.unlex = function (ts) { +GFConcrete.prototype.unlex = function (ts) { if (ts.length == 0) { return ""; } @@ -205,7 +298,30 @@ Concrete.prototype.unlex = function (ts) { } return s; }; - +GFConcrete.prototype.tagAndLinearize = function (tree) { + return this.tagAndLinearizeToTerm(tree, "0").tokens(); +}; +GFConcrete.prototype.tagAndLinearizeToTerm = function (tree, route) { + if (tree.isMeta()) { + if (isUndefined(tree.type)) { + var newMeta = new Meta(); + newMeta.setTag(route); + return newMeta; + } else { + var newTerm = this.lindef(tree.type, tree.name); + newTerm.setTag(route); + return newTerm; + } + } else { + var cs = new Array(); + for (var i in tree.args) { + cs.push(this.tagAndLinearizeToTerm(tree.args[i], route + "-" + i)); + } + var newTerm = this.rule(tree.name, cs); + newTerm.setTag(route); + return newTerm; + } +}; /* Utilities */ @@ -250,3 +366,739 @@ function copy_arguments(args, start) { } return arr; } + +/* ------------------------------------------------------------------------- */ +/* -------------------------------- PARSING -------------------------------- */ +/* ------------------------------------------------------------------------- */ + + +// Parser Object Definition +/* +function Parser(startcat) { + this.startcat = startcat; + this.rules = new Array(); + this.cats = new Array(); +} +*/ +function Parser(startcat, rules, cats) { + this.startcat = startcat; + this.rules = rules; + this.cats = cats; +} +/* +Parser.prototype.addRule = function (rule) { + this.rules.push(rule); +}; +Parser.prototype.addCat = function (name, refs) { + this.cats[name] = refs.slice(0); +}; +*/ +Parser.prototype.showRules = function () { + var ruleStr = new Array(); + ruleStr.push(""); + for (i = 0, j = this.rules.length; i < j; i++) { + ruleStr.push(this.rules[i].show()); + } + return ruleStr.join(""); +}; +Parser.prototype.parseString = function (string, cat) { + var tokens = string.split(" "); + chart = new Chart(true); + predict(this.rules, tokens); + while (chart.updated) { + chart.updated = false; + completeAndConvert(); + scan(); + combine(); + } + var catToParse = this.startcat; + if (cat) { catToParse = cat; } + var goalRange = new Range(0, tokens.length); + if (tokens.length == 1 && tokens[0] == "") { goalRange = new EmptyRange(); } + var activeEdges = filterActiveEdges(); + var trees = new Array(); + for (var i = 0, j = this.cats[catToParse].length; i < j; i++) { + if (foundTarget(this.cats[catToParse][i], new Array(new Array(goalRange)))) { + trees = trees.concat(extractTrees(this.cats[catToParse][i], new Array(new Array(goalRange)), activeEdges, "")); + } + } + for (var i = trees.length - 1; i >= 0; i--) { + if (trees[i] == undefined) { trees.splice(i, 1); } + } + return trees; +}; + +// Rule Object Definition + +function Rule(cat, profile, args, linRec) { + this.cat = cat; + this.profile = profile; + this.args = args; + this.linRec = linRec; +} +Rule.prototype.show = function () { + var recStr = new Array(); + recStr.push(this.cat, " -> ", this.profile.show(), " [", this.args, "] = ", showLinRec(this.linRec, "")); + return recStr.join(""); +}; + +// Profile definitions + +// Function application +// The function (name) is applied to its arguments (args) +function FunApp(name, args) { + this.id = "FunApp"; + this.name = name; + this.args = args.slice(0); +} +FunApp.prototype.show = function () { + var funAppStr = new Array(); + funAppStr.push("(", this.name); + for (var i = 0, j = this.args.length; i < j; i++) { + funAppStr.push(this.args[i].show()); + } + funAppStr.push(")"); + return funAppStr.join(" "); +}; + +// Literal +function Lit(name) { + this.id = "Lit"; + this.name = name; +} +Lit.prototype.show = function () { return this.name; }; + +// Metavariable +function MetaVar() { this.id = "MetaVar"; } +MetaVar.prototype.show = function () { return "?"; }; + +// Argument +function Arg(i) { + this.id = "Arg"; + this.name = "_"; + this.i = i; +} +Arg.prototype.show = function () { + var argStr = new Array(); + argStr.push(this.id, "(", this.i, ")"); + return argStr.join(""); +}; + +// Unification +// The arguments (args) must be unified +function Unify(args){ + this.id = "Unify"; + this.args = args.slice(0); +} +Unify.prototype.show = function () { + var unifyStr = new Array(); + unifyStr.push("(", this.id); + for (var i = 0, j = this.args.length; i < j; i++) { + unifyStr.push(this.args[i].show()); + } + unifyStr.push(")"); + return unifyStr.join(" "); +}; + +// Definition of symbols present in linearization records + +// Object to represent argument projections in grammar rules +function ArgProj(i, label) { + this.id = "argProj"; + this.i = i; + this.label = label; +} +ArgProj.prototype.getId = function () { return this.id; }; +ArgProj.prototype.getArgNum = function () { return this.i }; +ArgProj.prototype.show = function () { + var argStr = new Array(); + argStr.push(this.i, this.label); + return argStr.join("."); +}; +ArgProj.prototype.isEqual = function (obj) { + return (this.id == obj.id && this.i == obj.i && this.label == obj.label); +} + +// Object to represent terminals in grammar rules +function Terminal (str) { + this.id = "terminal"; + this.str = str; +} +Terminal.prototype.getId = function () { return this.id; }; +Terminal.prototype.show = function () { + var terminalStr = new Array(); + terminalStr.push('"', this.str, '"'); + return terminalStr.join(""); +}; +Terminal.prototype.isEqual = function (obj) { + return (this.id == obj.id && this.str == obj.str); +} + +// Object to represent ranges in grammar rules +function Range (i, j) { + this.id = "range"; + this.i = i; + this.j = j; +} +Range.prototype.getId = function () { return this.id; }; +Range.prototype.show = function () { + var terminalStr = new Array(); + terminalStr.push("(", this.i, ",", this.j, ")"); + return terminalStr.join(""); +}; +Range.prototype.isEqual = function (obj) { + return (this.id == obj.id && this.i == obj.i && this.j == obj.j); +} + +// Object to represent the empty range in grammar rules +function EmptyRange () { + this.id = "emptyRange"; +} +EmptyRange.prototype.getId = function () { return this.id; }; +EmptyRange.prototype.show = function () { return "emptyRange" }; +EmptyRange.prototype.isEqual = function (obj) { + return (this.id == obj.id); +} + +// Chart Object Definition +function Chart(updated) { + this.passive = new Array(); + this.active = new Array(); + this.updated = updated; +} +Chart.prototype.show = function () { + var chartStr = new Array(); + chartStr.push("(", this.showPassive(), ", ", this.showActive(), ")"); + return chartStr.join(""); +}; +Chart.prototype.addPassiveEdge = function (cat, linRec) { + if (!this.passive[cat] || !this.passive[cat].length) { + this.passive[cat] = new Array(); + } + this.passive[cat].push(linRec); +}; +Chart.prototype.isPassiveElem = function (cat, linRec) { + if (this.passive[cat]) { + for (var i = 0, j = this.passive[cat].length; i < j; i++) { + if (linRecsAreEqual(this.passive[cat][i], linRec)) { + return true; + } + } + } + return false; +}; +Chart.prototype.showPassive = function () { + var edgesStr = new Array(); + edgesStr.push("[ "); + for (var cat in this.passive) { + for (var i = 0, j = this.passive[cat].length; i < j; i++) { + edgesStr.push("( ", cat, ", ", showLinRec(this.passive[cat][i], ""), ")"); + if (i != j - 1) { edgesStr.push(", "); }; + } + edgesStr.push(", "); + } + edgesStr.push(" ]"); + return edgesStr.join(""); + return edgesStr.join("") + "
    "; +}; +Chart.prototype.addActiveEdge = function (cat, edge) { + if (!this.active[cat] || !this.active[cat].length) { + this.active[cat] = new Array(); + } + this.active[cat].push(edge); +}; +Chart.prototype.isActiveElem = function (cat, edge) { + if (this.active[cat]) { + for (var i = 0, j = this.active[cat].length; i < j; i++) { + var currentEdge = this.active[cat][i]; + if (currentEdge.name == edge.name && (areArgsEqual(currentEdge.args, edge.args)) && + currentEdge.currLabel == edge.currLabel && currentEdge.currLin.isEqual(edge.currLin) && + linRecsAreEqual(currentEdge.linFound, edge.linFound) && linRowsAreEqual(currentEdge.remLin, edge.remLin) && + linRecsAreEqual(currentEdge.remLinRows, edge.remLinRows) && + arraysOfLinRecsAreEqual(currentEdge.children, edge.children)) { + return true; + } + } + } + return false; +}; +Chart.prototype.showActive = function () { + var edgesStr = new Array() + edgesStr.push("[ "); + for (var cat in this.active) { + for (var i = 0, j = this.active[cat].length; i < j; i++) { + edgesStr.push("( ", this.active[cat][i].show(), " )"); + if (i != j - 1) { edgesStr.push(", "); }; + } + edgesStr.push(", "); + } + edgesStr.push(" ]"); + return edgesStr.join(""); +}; + +// Object to represent the active edges in a chart +function ActiveEdge(profile, cat, name, args, linFound, currLabel, currLin, remLin, remLinRows, children) { + this.profile = profile; + this.cat = cat; + this.name = name; + this.args = args; + this.linFound = linFound; + this.currLabel = currLabel; + this.currLin = currLin; + this.remLin = remLin; + this.remLinRows = remLinRows; + this.children = children.slice(0); +} +ActiveEdge.prototype.show = function () { + var linRecStr = new Array(); + linRecStr.push(this.profile.show(), ", ", this.cat, ", ", this.name, ", [ ", this.args, " ], ", showLinRec(this.linFound, ""), + ", ", this.currLabel, ", ", this.currLin.show(), ", ", showLinRow(this.remLin, " ++ "), + ", ", showLinRec(this.remLinRows, ""), ", [ "); + for (var i = 0, j = this.children.length; i < j; i++) { + linRecStr.push(showLinRec(this.children[i], "")); + if (i != j - 1) { linRecStr.push(", "); }; + } + linRecStr.push(" ]"); + return linRecStr.join(""); +}; + +function areArgsEqual(args1, args2) { + if (args1.length == args1.length && args1.join() == args2.join()) { + return true + } + return false; +} + +// Functions to manipulate linearization records + +// Returns a string representation of a linearization row +function showLinRow(linRow, separator) { + var linRowStr = new Array(); + linRowStr.push(" [ "); + for (var i = 0, j = linRow.length; i < j; i ++) { + linRowStr.push(linRow[i].show()); + if (i != j - 1) { linRowStr.push(separator) }; + } + linRowStr.push(" ] "); + return linRowStr.join(""); +} + +// Returns a string representation of a linearization record +function showLinRec(linRec, separator) { + var linRecStr = new Array(); + linRecStr.push(" [ "); + for (var i = 0, j = linRec.length; i < j; i ++) { + linRecStr.push(showLinRow(linRec[i], " ++ ")); + if (i != j - 1) { linRecStr.push(separator); }; + } + linRecStr.push(" ] "); + return linRecStr.join(""); +} + +// Checks if two linearization rows are equal +function linRowsAreEqual(linRow1, linRow2) { + if (linRow1.length == linRow2.length) { + for (var i = 0, j = linRow1.length; i < j; i++) { + if (linRow1[i].id && linRow2[i].id && !linRow1[i].isEqual(linRow2[i])) { + return false; + } + } + return true; + } + return false; +} + +// Checks if two linearization records are equal +function linRecsAreEqual(linRec1, linRec2) { + if (linRec1.length == linRec2.length) { + for (var i = 0, j = linRec1.length; i < j; i++) { + if (!linRowsAreEqual(linRec1[i], linRec2[i])) { return false; } + } + return true; + } + return false; +} + +// Checks if two arrays of linearization records are equal +function arraysOfLinRecsAreEqual(array1, array2) { + if (array1.length == array2.length) { + for (var i = 0, j = array1.length; i < j; i++) { + if (!linRecsAreEqual(array1[i], array2[i])) { return false; } + } + return true; + } + return false; +} + +// Functions to manipulate ranges (restriction and concatenation) + +// Concatenates two ranges +function rangeConcatLin (lin1, lin2) { + if (lin1.id == "range" && lin2.id == "range") { + if (lin1.j == lin2.i) { return (new Range(lin1.i, lin2.j)) } + } else if (lin1.id == "range" && lin2.id == "emptyRange") { return lin1; } + else if (lin1.id == "emptyRange" && lin2.id == "range") { return lin2; } + else if (lin1.id == "emptyRange" && lin2.id == "emptyRange") { return lin1; } + return undefined; +} + +// Performs range concatenation on a linarization row +function rangeConcatLins (lins) { + var newLins = new Array(); + newLins.push(lins.shift()); + while (lins.length > 0) { + if (!newLins[newLins.length - 1]) { return new Array(); } + if (newLins[newLins.length - 1].id == "range" && lins[0].id == "range") { + var rangeConcat = rangeConcatLin(newLins.pop(), lins[0]); + if (typeof rangeConcat == 'undefined') { return new Array(); } + newLins.push(rangeConcat); + lins.shift(); + } else { + newLins.push(lins.shift()); + } + } + return newLins; +} + +// Performs range restriction on an element of a linarization row +// while keeping track of the tokens that have been used +function rangeRestLinTerm(tokens, lin, rangesNotConsumed) { + if (lin.id == "argProj") { return new Array(lin); } + else if (lin.id == "terminal") { + var ranges = new Array(); + for (var i = 0, j = tokens.length; i < j; i++) { + if (tokens[i] == lin.str) { + ranges.push(new Range(i, i + 1)); + rangesNotConsumed[i] = undefined; + } + } + if (ranges.length == 0) { + return undefined; + } else { + return ranges; + } + } + else { return new Array(); } +} + +// Performs range restriction on a linearization record +// while keeping track of the tokens that have been used +function rangeRestRecTerm(linRec, tokens, rangesNotConsumed) { + var ranges = new Array(); + for (var i = 0, j = linRec.length; i < j; i++) { + var rangeRestLins = new Array(); + for (var k = 0, l = linRec[i].length; k < l; k++) { + rangeRestLins.push(rangeRestLinTerm(tokens, linRec[i][k], rangesNotConsumed)); + } + var combinedLins = combineLins(rangeRestLins); + if (typeof combinedLins != 'undefined') { + var filteredLins = new Array(); + if (combinedLins.length == 0) { + filteredLins.push(new Array()); + } else { + for (var m = 0, n = combinedLins.length; m < n; m++) { + var temp = rangeConcatLins(combinedLins[m]); + if (temp.length != 0) { + filteredLins.push(temp); + } + } + } + ranges.push(filteredLins); + } else { ranges.push(undefined); } + } + for (var k = 0, l = ranges.length; k < l; k++) { + if (ranges[k] == undefined) { return undefined; } + } + return combineLins(ranges); +} + +// Returns the combinations of the elements of an array of arrays +function combineLins(linss) { + if (linss.length > 0) { + var combinedLins = new Array(); + var lins = linss.shift(); + if (lins) { + if (lins.length != 0) { + var tail = combineLins(linss); + if (typeof tail == 'undefined') { return undefined; } + for (var i = 0, j = lins.length; i < j; i++) { + var head = new Array(); + head.push(lins[i]); + if (tail.length == 0) { combinedLins.push(head); } + else { + for (var k = 0, l = tail.length; k < l; k++) { + combinedLins.push(head.concat(tail[k])); + } + } + } + } else { return new Array(); } + } else { return undefined; } + return combinedLins; + } else { return new Array(); } +} + +// Inference Rules + +function predict(rules, tokens) { + var rangesNotConsumed = genRanges(tokens.length); + for (var i = 0, j = rules.length; i < j; i++) { + var currentRule = rules[i]; + var linRec = rangeRestRecTerm(currentRule.linRec, tokens, rangesNotConsumed); + if (linRec) { + for (var k = 0, l = linRec.length; k < l; k++) { + var currentRow = linRec[k].shift(); + var remlinRows = linRec[k]; + var children = new Array(); + for (var m = 0, n = currentRule.args.length; m < n; m++) { + children.push(new Array()); + } + var newActive = new ActiveEdge(currentRule.profile, currentRule.cat, currentRule.profile.name, currentRule.args, new Array(), 0, new EmptyRange(), currentRow, remlinRows, children); + if (!chart.isActiveElem(currentRule.cat, newActive)) { + chart.addActiveEdge(currentRule.cat, newActive); + chart.updated = true; + } + } + } + } + for (var i = 0, j = rangesNotConsumed.length; i < j; i++) { + if (rangesNotConsumed[i] != undefined) { + var cat = undefined; + if (isNaN(tokens[i])) { + cat = "-1"; + } else if (tokens[i].lastIndexOf(".") == -1) { + cat = "-2"; + } else { + cat = "-3"; + } + var lit = undefined; + if (cat == "-1") { + lit = "\"" + tokens[i] + "\""; + } else { + lit = tokens[i]; + } + var newActive = new ActiveEdge(new Lit(lit), cat, tokens[i], new Array(), new Array(), 0, new Range(i, i + 1), new Array(), new Array(), new Array()); + if (!chart.isActiveElem(cat, newActive)) { + chart.addActiveEdge(cat, newActive); + chart.updated = true; + } + } + } +} + +function genRanges(inputLength) { + var ranges = new Array(); + for (var i = 0; i < inputLength; i++) { + ranges.push(i); + } + return ranges; +} + +function completeAndConvert() { + for (var cat in chart.active) { + var currentEdge = chart.active[cat]; + for (var i = 0, j = currentEdge.length; i < j; i++) { + if (currentEdge[i].remLin.length == 0) { + if (currentEdge[i].remLinRows.length == 0) { + var linFound = currentEdge[i].linFound.slice(0); + linFound.push(new Array(currentEdge[i].currLin)); + if (!chart.isPassiveElem(cat, linFound)) { + chart.addPassiveEdge(cat, linFound); + chart.updated = true; + } + } else { + var linFound = currentEdge[i].linFound.slice(0); + linFound.push(new Array(currentEdge[i].currLin)); + var remLinRows = currentEdge[i].remLinRows.slice(0); + var currentRow = remLinRows.shift(); + var newActive = new ActiveEdge(currentEdge[i].profile, cat, currentEdge[i].name, currentEdge[i].args, linFound, linFound.length, new EmptyRange(), currentRow, remLinRows, currentEdge[i].children); + if (!chart.isActiveElem(cat, newActive)) { + chart.active[cat].push(newActive); + chart.updated = true; + } + } + } + } + } +} + +function scan() { + for (var cat in chart.active) { + var currentEdge = chart.active[cat]; + for (var i = 0, j = currentEdge.length; i < j; i++) { + if (currentEdge[i].remLin.length > 0 && currentEdge[i].remLin[0].id == "range") { + var newRange = rangeConcatLin(currentEdge[i].currLin, currentEdge[i].remLin[0]); + if (typeof newRange != 'undefined') { + var remLin = currentEdge[i].remLin.slice(0); + remLin.shift(); + var newActive = new ActiveEdge(currentEdge[i].profile, cat, currentEdge[i].name, currentEdge[i].args, currentEdge[i].linFound, currentEdge[i].currLabel, newRange, remLin, currentEdge[i].remLinRows, currentEdge[i].children); + if (!chart.isActiveElem(cat, newActive)) { + chart.active[cat].push(newActive); + chart.updated = true; + } + } + } + } + } +} + +function combine() { + for (var cat in chart.active) { + for (var i = 0; i < chart.active[cat].length; i++) { + var currentEdge = chart.active[cat][i]; + if (currentEdge.remLin.length && currentEdge.remLin[0].id == "argProj") { + var argNumber = currentEdge.remLin[0].i; + var catToCombine = currentEdge.args[argNumber]; + if (chart.passive[catToCombine]) { + for (var k = 0, l = chart.passive[catToCombine].length; k < l; k++) { + var currentPassive = chart.passive[catToCombine][k]; + var remLin = currentEdge.remLin.slice(0); + var linRow = currentPassive[remLin[0].label]; + if (typeof linRow != 'undefined') { + var newLinRow = linRow.slice(0); + if (currentEdge.children[argNumber].length == 0) { + var newRange = rangeConcatLin(currentEdge.currLin, newLinRow.shift()); + if (typeof newRange != 'undefined') { + remLin.shift(); + var children = currentEdge.children.slice(0); + children[argNumber] = currentPassive.slice(0); + var newActive = new ActiveEdge(currentEdge.profile, currentEdge.cat, currentEdge.name, currentEdge.args, currentEdge.linFound, currentEdge.currLabel, newRange, remLin, currentEdge.remLinRows, children); + if (!chart.isActiveElem(cat, newActive)) { + chart.active[cat].push(newActive); + chart.updated = true; + } + } + } else { + var child = currentEdge.children[argNumber]; + if (linRecsAreEqual(currentPassive, child)) { + var newRange = rangeConcatLin(currentEdge.currLin, newLinRow.shift()); + if (typeof newRange != 'undefined') { + remLin.shift(); + var children = currentEdge.children.slice(0); + children[argNumber] = currentPassive.slice(0); + var newActive = new ActiveEdge(currentEdge.profile, currentEdge.cat, currentEdge.name, currentEdge.args, currentEdge.linFound, currentEdge.currLabel, newRange, remLin, currentEdge.remLinRows, children); + if (!chart.isActiveElem(cat, newActive)) { + chart.active[cat].push(newActive); + chart.updated = true; + } + } + } + } + } + } + } + } + } + } +} + +// Checks if the parsing goal is in the chart +function foundTarget(cat, linRec) { + if (chart.passive[cat]) { + for (var i = 0, j = chart.passive[cat].length; i < j; i++) { + if (linRecsAreEqual(linRec, chart.passive[cat][i])) { + return true; + } + } + } + return false; +} + +// Filters the active edges that are relevant for tree extraction +function filterActiveEdges() { + var activeEdges = new Array(); + for (var cat in chart.active) { + activeEdges[cat] = new Array(); + for (var i = 0, j = chart.active[cat].length; i < j; i++) { + var currentEdge = chart.active[cat][i]; + if (currentEdge.remLin.length == 0 && currentEdge.remLinRows.length == 0) { + var linFound = currentEdge.linFound.slice(0); + linFound.push(new Array(currentEdge.currLin)); + var newActive = new ActiveEdge(currentEdge.profile, currentEdge.cat, currentEdge.name, currentEdge.args, linFound, "", "", "", "", currentEdge.children); + activeEdges[cat].push(newActive); + } + } + } + return activeEdges; +} + +// Extracts the parse trees from the chart +function extractTrees(cat, linRec, activeEdges, currentTree) { + var trees = new Array(); + for (var i = 0, j = activeEdges[cat].length; i < j; i++) { + var currentEdge = activeEdges[cat][i]; + var currentNode = "(" + cat + "-" + i + ")"; + if (currentTree.indexOf(currentNode) == -1 && cat == currentEdge.cat && linRecsAreEqual(linRec, currentEdge.linFound)) { + var subTrees = new Array(); + for (var k = 0, l = currentEdge.children.length; k < l; k++) { + subTrees.push(extractTrees(currentEdge.args[k], currentEdge.children[k].slice(0), activeEdges, currentTree + currentNode)); + } + var combinedSubTrees = combineLins(subTrees); + if (combinedSubTrees) { + if (currentEdge.children.length == 0) { combinedSubTrees.push(new Array()); } + for (var m = 0, n = combinedSubTrees.length; m < n; m++) { + var tree = buildTree(currentEdge.profile, combinedSubTrees[m]); + if (tree) { + trees.push(tree); + } + } + } + } + } + if (trees.length == 0) { + return undefined; + } else { + return trees; + } +} + +// Builds a tree according to the profile +function buildTree(profile, args) { + switch(profile.id) + { + case "FunApp": + var tree = new Fun(profile.name); + for (var i = 0, j = profile.args.length; i < j; i++) { + var subTree = buildTree(profile.args[i], args); + if (subTree) { + tree.setArg(i, subTree); + } else { + return undefined; + } + } + return tree; + case "Lit": + return new Fun(profile.name); + case "MetaVar": + return new Fun("?"); + case "Arg": + return args[profile.i]; + case "Unify": + var subTrees = new Array(); + for (var i = 0, j = profile.args.length; i < j; i++) { + subTrees.push(buildTree(profile.args[i], args)) + } + return unifySubTrees(subTrees); + } +} + +// Tree unification functions +function unifySubTrees(subTrees) { + var t = subTrees[0]; + for (var i = 1, j = subTrees.length; i < j; i++) { + t = unify(t, subTrees[i]); + if (!t) { return undefined; } + } + return t; +} + +function unify(a, b) { + if (a.isMeta()) { return b }; + if (b.isMeta()) { return a }; + if (a.name == b.name && a.args.length == b.args.length) { + for (var i = 0, j = a.args.length; i < j; i++) { + if (!unify(a.args[i], b.args[i])) { return undefined; } + } + return a + }; + return undefined; +} diff --git a/lib/javascript/grammar.js b/lib/javascript/grammar.js new file mode 100644 index 000000000..dd9043c52 --- /dev/null +++ b/lib/javascript/grammar.js @@ -0,0 +1 @@ +var Literals = new GFGrammar(new GFAbstract("Exp",{Name: new Type(["String"], "Exp"), Welcome: new Type(["Exp"], "Exp")}),{LiteralsEng: new GFConcrete({Name: function(cs){return new Arr(Literals.concretes["LiteralsEng"].rule("_0", cs));}, Welcome: function(cs){return new Arr(new Seq(new Str("Welcome"), new Str(","), Literals.concretes["LiteralsEng"].rule("_0", cs)));}, _0: function(cs){return cs[0].sel(new Int(0));}, Exp: function(cs){return new Arr(cs[0]);}, Int: function(cs){return new Arr(cs[0]);}, Float: function(cs){return new Arr(cs[0]);}, String: function(cs){return new Arr(cs[0]);}}, new Parser("Exp",[new Rule(1, new FunApp("Welcome",[new Arg(0)]),[1],[[new Terminal("Welcome"), new Terminal(","), new ArgProj(0, 0)]]), new Rule(1, new FunApp("Name",[new Arg(0)]),[-1],[[new ArgProj(0, 0)]])],{Exp:[1], Float:[-3], Int:[-2], String:[-1], _Var:[-4]}))}); diff --git a/lib/javascript/minus.png b/lib/javascript/minus.png new file mode 100644 index 000000000..84cc2a9ba Binary files /dev/null and b/lib/javascript/minus.png differ diff --git a/lib/javascript/plus.png b/lib/javascript/plus.png new file mode 100644 index 000000000..4d2e8ee83 Binary files /dev/null and b/lib/javascript/plus.png differ diff --git a/lib/javascript/style.css b/lib/javascript/style.css new file mode 100644 index 000000000..63ac71dd5 --- /dev/null +++ b/lib/javascript/style.css @@ -0,0 +1,234 @@ +body { + font-family:arial,helvetica,sans-serif; + font-size:12px; + background-color: white; +} + +#wrapper { + width:740px; + height:520px; + margin:auto 50px; + border:1px solid gray; + padding:10px; + +} + +#absFrame { + width:250px; + height:250px; + padding:10px; + border:1px solid gray; + float:left; + white-space: nowrap; +} + +#conFrame { + width:436px; + height:250px; + margin-left:10px; + padding:10px; + border:1px solid gray; + float:left; + white-space: normal; + overflow:auto; +} + +#actFrame { + width:250px; + height:170px; + margin-top:10px; + padding:10px; + border:1px solid gray; + float:left; + overflow:auto; +} + +#refFrame { + width:436px; + height:170px; + margin-left:10px; + margin-top:10px; + padding:10px; + border:1px solid gray; + float:left; + overflow:auto; +} + +#messageFrame { + width:506px; + height:15px; + margin-top:10px; + margin-right:10px; + padding:10px; + border:1px solid gray; + float:left; + overflow:hidden; +} + +#clipboardFrame { + width:180px; + height:15px; + margin-top:10px; + padding:10px; + border:1px solid gray; + float:left; + overflow:auto; +} + +#tree { + left: -10px; + top: -10px; + width: 230px; + height: 250px; + margin: 0px; + padding: 10px; + overflow: auto; +} + +ul { + position: relative; + list-style: none; + margin-left: 20px; + padding: 0px; +} + +li { + position: relative; +} + +img.tree-menu { + margin-right: 5px; +} + +a.tree:link, a.tree:visited, a.tree:active { + color: black; + background-color: white; + text-decoration: none; + margin-right:10px; +} + +a.tree:hover { + color: blue; + background-color: white; + text-decoration: underline; + margin-right:10px; +} + +a.treeSelected:link, a.treeSelected:visited, a.treeSelected:active { + color: white; + background-color: #3366CC; + text-decoration: none; + margin-right:10px; +} + +a.treeSelected:hover { + color: white; + background-color: #3366CC; + text-decoration: underline; + margin-right:10px; +} + +a.treeGray:link, a.treeGray:visited, a.treeGray:active { + color: silver; + background-color: white; + text-decoration: none; + margin-right:10px; +} + +a.treeGray:hover { + color: silver; + background-color: white; + text-decoration: none; + margin-right:10px; +} + +table.action, table.refinement, table.wrapper, table.tree, table.language { + margin: 0px; + padding: 0px; + border-style: none; + border-collapse: collapse; + border-spacing: 0px; +} + +tr.selected { + color: white; + background-color: #3366CC; +} + +tr.unavailable, tr.closed { + color: silver; + background-color: white; +} + +tr.unavailable:hover { + color: silver; + background-color: #3366CC; +} + +tr.action, tr.refinement, tr.wrapper, tr.tree { + color: black; + background-color: white; +} + +tr.action:hover, tr.refinement:hover, tr.wrapper:hover, tr.tree:hover { + color: white; + background-color: #3366CC; +} + +td.action { + width: 220px; + margin: 0px; + padding: 0px; +} + +td.refinement, td.wrapper, td.tree { + width: 515px; + margin: 0px; + padding: 0px; +} + +td.hotKey { + width: 30px; + margin: 0px; + padding: 0px; + text-align: right; +} + +td.language { + color: black; + background-color: white; +} + +td.language:hover { + color: blue; + background-color: white; + text-decoration: underline; +} + +td.selected { + color: white; + background-color: #3366CC; +} + +td.selected:hover { + color: white; + background-color: #3366CC; + text-decoration: underline; +} + +p { + margin-bottom: 40px; + text-align: justify; +} + +span.normal { + color: black; + background-color: white; + text-decoration: none; +} + +span.selected { + color: white; + background-color: #3366CC; + text-decoration: none; +}