public void AddNativeProperty(string propertyDesc, ScriptCallbackCB callbackCB, object userData) { var oldLex = currentLexer; currentLexer = new ScriptLex(propertyDesc); var baseVar = Root; var propName = currentLexer.TokenString; currentLexer.Match(ScriptLex.LexTypes.Id); while (currentLexer.TokenType == (ScriptLex.LexTypes) '.') { currentLexer.Match((ScriptLex.LexTypes) '.'); var link = baseVar.FindChild(propName); if (link == null) { link = baseVar.AddChild(propName, new ScriptVar(null, ScriptVar.Flags.Object)); } baseVar = link.Var; propName = currentLexer.TokenString; currentLexer.Match(ScriptLex.LexTypes.Id); } var propVar = new ScriptVar(); callbackCB.Invoke(propVar, null); currentLexer = oldLex; baseVar.AddChild(propName, propVar); }
private ScriptVarLink ParseDefinition(ScriptLex.LexTypes lexType) { currentLexer.Match(lexType); var funcName = string.Empty; //named function if (currentLexer.TokenType == ScriptLex.LexTypes.Id) { funcName = currentLexer.TokenString; currentLexer.Match(ScriptLex.LexTypes.Id); } var funcVar = new ScriptVarLink(new ScriptVar(null, ScriptVar.Flags.Function), funcName); if (lexType == ScriptLex.LexTypes.RFunction || lexType == ScriptLex.LexTypes.RCatch) { ParseFunctionArguments(funcVar.Var); } var funcBegin = currentLexer.TokenStart; var noExecute = false; Block(ref noExecute); funcVar.Var.SetData(currentLexer.GetSubString(funcBegin)); return(funcVar); }
public ScriptVarLink EvalComplex(String code) { ScriptLex oldLex = _currentLexer; Stack <ScriptVar> oldScopes = _scopes; _currentLexer = new ScriptLex(code); _callStack.Clear(); _scopes.Clear(); _scopes.Push(Root); ScriptVarLink v = null; try { bool execute = true; do { v = Base(ref execute); if (_currentLexer.TokenType != ScriptLex.LexTypes.Eof) { _currentLexer.Match((ScriptLex.LexTypes) ';'); } } while (_currentLexer.TokenType != ScriptLex.LexTypes.Eof); } catch (ScriptException ex) { String errorMessage = ex.Message; int i = 0; foreach (ScriptVar scriptVar in _scopes) { errorMessage += "\n" + i++ + ": " + scriptVar; } #if WINDOWS_UWP Debug.WriteLine(errorMessage); #else Console.Write(errorMessage); #endif } _currentLexer = oldLex; _scopes = oldScopes; if (v != null) { return(v); } return(new ScriptVarLink(new ScriptVar(null), null)); }
public void AddMethod(String funcProto, ScriptCallbackCB callback, Object userdata) { ScriptLex oldLex = _currentLexer; using (_currentLexer = new ScriptLex(funcProto)) { ScriptVar baseVar = Root; _currentLexer.Match(ScriptLex.LexTypes.RFunction); String funcName = _currentLexer.TokenString; _currentLexer.Match(ScriptLex.LexTypes.Id); while (_currentLexer.TokenType == (ScriptLex.LexTypes) '.') { _currentLexer.Match((ScriptLex.LexTypes) '.'); ScriptVarLink link = baseVar.FindChild(funcName); if (link == null) { link = baseVar.AddChild(funcName, new ScriptVar(null, ScriptVar.Flags.Object)); } baseVar = link.Var; funcName = _currentLexer.TokenString; _currentLexer.Match(ScriptLex.LexTypes.Id); } ScriptVar funcVar = new ScriptVar(null, ScriptVar.Flags.Function | ScriptVar.Flags.Native); funcVar.SetCallback(callback, userdata); ParseFunctionArguments(funcVar); baseVar.AddChild(funcName, funcVar); } _currentLexer = oldLex; }
public ScriptVarLink EvalComplex(string code) { var oldLex = currentLexer; var oldScopes = scopes; currentLexer = new ScriptLex(code); scopes = new List <ScriptVar>(); //callStack.Clear(); scopes.Clear(); scopes.PushBack(Root); ScriptVarLink v = null; try { var execute = true; do { v = Base(ref execute); if (currentLexer.TokenType != ScriptLex.LexTypes.Eof) { currentLexer.Match((ScriptLex.LexTypes) ';'); } } while (currentLexer.TokenType != ScriptLex.LexTypes.Eof); } catch (ScriptException ex) { var errorMessage = new StringBuilder(string.Format("ERROR on line {0} column {1} [{2}]", currentLexer.LineNumber, currentLexer.ColumnNumber, ex.Message)); int i = 0; foreach (ScriptVar scriptVar in scopes) { errorMessage.AppendLine(); errorMessage.Append(i++ + ": " + scriptVar); } Console.Error.WriteLine(errorMessage.ToString()); } currentLexer = oldLex; scopes = oldScopes; if (v != null) { return(v); } return(new ScriptVarLink(new ScriptVar(null), null)); }
public void AddNative(string funcDesc, ScriptCallbackCB callbackCB, object userData) { var oldLex = currentLexer; currentLexer = new ScriptLex(funcDesc); var baseVar = Root; currentLexer.Match(ScriptLex.LexTypes.RFunction); var funcName = currentLexer.TokenString; currentLexer.Match(ScriptLex.LexTypes.Id); while (currentLexer.TokenType == (ScriptLex.LexTypes) '.') { currentLexer.Match((ScriptLex.LexTypes) '.'); var link = baseVar.FindChild(funcName); if (link == null) { link = baseVar.AddChild(funcName, new ScriptVar(null, ScriptVar.Flags.Object)); } baseVar = link.Var; funcName = currentLexer.TokenString; currentLexer.Match(ScriptLex.LexTypes.Id); } var funcVar = new ScriptVar(null, ScriptVar.Flags.Function | ScriptVar.Flags.Native); funcVar.SetCallback(callbackCB, userData); ParseFunctionArguments(funcVar); currentLexer = oldLex; baseVar.AddChild(funcName, funcVar); }
private ScriptVarLink ParseFunctionDefinition() { _currentLexer.Match(ScriptLex.LexTypes.RFunction); String funcName = String.Empty; //named function if (_currentLexer.TokenType == ScriptLex.LexTypes.Id) { funcName = _currentLexer.TokenString; _currentLexer.Match(ScriptLex.LexTypes.Id); } ScriptVarLink funcVar = new ScriptVarLink(new ScriptVar(null, ScriptVar.Flags.Function), funcName); ParseFunctionArguments(funcVar.Var); Int32 funcBegin = _currentLexer.TokenStart; bool execute = false; Block(ref execute); funcVar.Var.SetData(_currentLexer.GetSubString(funcBegin)); return(funcVar); }