/// <summary> /// To be executed before the visit starts /// </summary> public void PreVisit(Parse.Parser parser) { _parser = parser; // if this document is in the Saved parsed visitors, we remove it now and we will add it back when it is parsed if (_isBaseFile) { if (SavedPersistent.ContainsKey(_parser.FilePathBeingParsed)) { SavedPersistent.Remove(_parser.FilePathBeingParsed); } } }
/// <summary> /// To be executed after the visit ends /// </summary> public void PostVisit() { // save the info for uses in an another file, where this file is run in persistent if (!SavedPersistent.ContainsKey(_parser.FilePathBeingParsed)) { SavedPersistent.Add(_parser.FilePathBeingParsed, this); } else { SavedPersistent[_parser.FilePathBeingParsed] = this; } // lose parser reference _parser = null; }
/// <summary> /// Parses a file. /// Remarks : it doesn't parse the document against known words since this is only useful for /// the CURRENT document and not for the others /// </summary> private static ParserVisitor ParseFile(string filePath, ParsedScopeBlock scopeItem) { ParserVisitor parserVisitor; // did we already parsed this file in a previous parse session? (if we are in CodeExplorerDisplayExternalItems mode we need to parse it again anyway) if (SavedPersistent.ContainsKey(filePath)) { parserVisitor = SavedPersistent[filePath]; } else { // Parse it var ablParser = new Parse.Parser(Utils.ReadAllText(filePath), filePath, scopeItem, false); parserVisitor = new ParserVisitor(false); ablParser.Accept(parserVisitor); } return(parserVisitor); }
//if arg's length = 1 private Node apply1(Node arg1) { string name = this.symbol.getName(); bool flag = name.Equals("car"); Node result; if (flag) { result = arg1.getCar(); }//end if else { bool flag2 = name.Equals("cdr"); if (flag2) { result = arg1.getCdr(); }//end if else { bool flag3 = name.Equals("number?"); if (flag3) { result = BoolLit.getInstance(arg1.isNumber()); }//end if else { bool flag4 = name.Equals("symbol?"); if (flag4) { result = BoolLit.getInstance(arg1.isSymbol()); }//end if else { bool flag5 = name.Equals("null?"); if (flag5) { result = BoolLit.getInstance(arg1.isNull()); }//end if else { bool flag6 = name.Equals("pair?"); if (flag6) { result = BoolLit.getInstance(arg1.isPair()); }//end if else { bool flag7 = name.Equals("procedure?"); if (flag7) { result = BoolLit.getInstance(arg1.isProcedure()); }//end if else { bool flag8 = name.Equals("write");// i am not sure if im handling this correctly if (flag8) { arg1.print(-1); result = Unspecific.getInstance(); }//end if else { bool flag9 = name.Equals("display"); // i am not sure if im handling this correctly if (flag9) { StringLit.printDoubleQuotes = false; arg1.print(-1); StringLit.printDoubleQuotes = true; result = Unspecific.getInstance(); }//end if else { bool flag10 = name.Equals("load"); if (flag10) { bool flag11 = !arg1.isString(); if (flag11) { Console.Error.WriteLine("Error: wrong type of argument"); result = Nil.getInstance(); } else { string stringVal = arg1.getStringVal(); try { //not sure why it has to be Parse.Scanner to call this Parse.Scanner s = new Parse.Scanner(File.OpenText(stringVal)); TreeBuilder b = new TreeBuilder(); Parse.Parser parser = new Parse.Parser(s, b); for (Node node = (Node)parser.parseExp(); node != null; node = (Node)parser.parseExp()) { node.eval(Scheme4101.env); } } catch (SystemException) { Console.Error.WriteLine("Could not find file " + stringVal); } result = Unspecific.getInstance(); } }//end if else { Console.Error.WriteLine("Error: wrong number of arguments"); result = Nil.getInstance(); } } } } } } }//end inner sub sub sub else }//end inner sub sub else }//end inner sub else }//end outer else return result; }
//if arg length = 0 private Node apply0() { string name = this.symbol.getName(); bool flag = name.Equals("read"); Node result; if (flag) { Parse.Scanner s = new Parse.Scanner(Console.In); Parse.Parser parser = new Parse.Parser(s, new TreeBuilder()); Node node = (Node)parser.parseExp(); bool flag2 = node != null; if (flag2) { result = node; } else { result = new Ident("end-of-file"); } }//end outer if else { bool flag3 = name.Equals("newline"); if (flag3) { Console.WriteLine(); result = Unspecific.getInstance(); } else { bool flag4 = name.Equals("interaction-environment"); if (flag4) { result = Scheme4101.env; } else { Console.Error.WriteLine("Error: wrong number of arguments"); result = Nil.getInstance(); } } }//end outer else return result; }
private void DefinePrimitives(Environment env) { foreach (KeyValuePair<string, Primitive> kvp in PrimitiveFactory.Primitives) { ScheminAtom symbol = new ScheminAtom(kvp.Key); ScheminPrimitive prim = new ScheminPrimitive(kvp.Key); env.AddBinding(symbol, prim); } var prebound_schemin = new List<string>(); prebound_schemin.Add(ScheminPrimitives.Map); prebound_schemin.Add(ScheminPrimitives.Filter); prebound_schemin.Add(ScheminPrimitives.Foldl); prebound_schemin.Add(ScheminPrimitives.Foldr); prebound_schemin.Add(ScheminPrimitives.Not); prebound_schemin.Add(ScheminPrimitives.Id); prebound_schemin.Add(ScheminPrimitives.Flip); prebound_schemin.Add(ScheminPrimitives.Fold); prebound_schemin.Add(ScheminPrimitives.Unfold); prebound_schemin.Add(ScheminPrimitives.Reverse); prebound_schemin.Add(ScheminPrimitives.Curry); prebound_schemin.Add(ScheminPrimitives.Compose); prebound_schemin.Add(ScheminPrimitives.Zero); prebound_schemin.Add(ScheminPrimitives.Positive); prebound_schemin.Add(ScheminPrimitives.Negative); prebound_schemin.Add(ScheminPrimitives.Odd); prebound_schemin.Add(ScheminPrimitives.Even); prebound_schemin.Add(ScheminPrimitives.CallWithCC); prebound_schemin.Add(ScheminPrimitives.Error); prebound_schemin.Add(ScheminPrimitives.Sum); prebound_schemin.Add(ScheminPrimitives.Product); prebound_schemin.Add(ScheminPrimitives.Max); prebound_schemin.Add(ScheminPrimitives.Min); prebound_schemin.Add(ScheminPrimitives.Caddr); prebound_schemin.Add(ScheminPrimitives.DefineMacro); Tokenize.Tokenizer t = new Tokenize.Tokenizer(); Schemin.Parse.Parser p = new Parse.Parser(); foreach (string primitive in prebound_schemin) { var tokens = t.Tokenize(primitive); var ast = p.Parse(tokens, false); Evaluate(ast); } }