private ExpressionGroup Parse(string input) { var tokenizer = Tokenizer.CreateTokenizer(input); var parser = new AchievementScriptParser(); return(parser.Parse(tokenizer)); }
/// <summary> /// Processes the provided script. /// </summary> /// <returns> /// <c>true</c> if the script was successfully processed, /// <c>false</c> if not - in which case <see cref="ErrorMessage"/> will indicate why. /// </returns> public bool Run(Tokenizer input) { var expressionGroup = new AchievementScriptParser().Parse(input); if (expressionGroup.Comments.Count > 0) { GameTitle = expressionGroup.Comments[0].Value.Substring(2).Trim(); foreach (var comment in expressionGroup.Comments) { if (comment.Value.Contains("#ID")) { ExtractGameId(new Token(comment.Value, 0, comment.Value.Length)); break; } } } InterpreterScope scope; return(Run(expressionGroup, out scope)); }
protected override void OnUpdateSyntax(ContentChangedEventArgs e) { var parser = new AchievementScriptParser(); _parsedContent = parser.Parse(Tokenizer.CreateTokenizer(e.Content)); if (e.IsAborted) { return; } var interpreter = new AchievementScriptInterpreter(); interpreter.Run(_parsedContent, out _scope); if (e.IsAborted) { return; } ServiceRepository.Instance.FindService <IBackgroundWorkerService>().InvokeOnUiThread(() => { ErrorsToolWindow.References.Clear(); foreach (var error in _parsedContent.Errors) { string message = error.Message; var innerError = error; if (innerError.InnerError != null) { do { innerError = innerError.InnerError; } while (innerError.InnerError != null); if (error.Line != innerError.Line || error.Column != innerError.Column) { message += String.Format(" (called from {0}:{1})", error.Line, error.Column); } } ErrorsToolWindow.References.Add(new CodeReferenceViewModel { StartLine = innerError.Line, StartColumn = innerError.Column, EndLine = innerError.EndLine, EndColumn = innerError.EndColumn, Message = message }); } }); if (e.IsAborted) { return; } if (e.IsWhitespaceOnlyChange) { return; } // wait a short while before updating the editor list ServiceRepository.Instance.FindService <ITimerService>().Schedule(() => { if (e.IsAborted) { return; } _owner.PopulateEditorList(interpreter); }, TimeSpan.FromMilliseconds(700)); base.OnUpdateSyntax(e); }
private void OpenFile(string filename) { if (!File.Exists(filename)) { MessageBoxViewModel.ShowMessage("Could not open " + filename); return; } int line = 1; int column = 1; string selectedEditor = null; if (Game != null && Game.Script.Filename == filename) { if (Game.Script.CompareState == GeneratedCompareState.LocalDiffers) { var vm = new MessageBoxViewModel("Revert to the last saved state? Your changes will be lost."); vm.DialogTitle = "Revert Script"; if (vm.ShowOkCancelDialog() == DialogResult.Cancel) { return; } } // capture current location so we can restore it after refreshing line = Game.Script.Editor.CursorLine; column = Game.Script.Editor.CursorColumn; selectedEditor = Game.SelectedEditor.Title; } else if (!CloseEditor()) { return; } var backupFilename = ScriptViewModel.GetBackupFilename(filename); bool usingBackup = false; if (File.Exists(backupFilename)) { var vm2 = new MessageBoxViewModel("Found an autosave file from " + File.GetLastWriteTime(backupFilename) + ".\nDo you want to open it instead?"); vm2.DialogTitle = Path.GetFileName(filename); switch (vm2.ShowYesNoCancelDialog()) { case DialogResult.Cancel: return; case DialogResult.Yes: filename = backupFilename; usingBackup = true; break; default: break; } } var logger = ServiceRepository.Instance.FindService <ILogService>().GetLogger("RATools"); logger.WriteVerbose("Opening " + filename); string content; try { content = File.ReadAllText(filename); } catch (IOException ex) { MessageBoxViewModel.ShowMessage(ex.Message); return; } var tokenizer = Tokenizer.CreateTokenizer(content); var expressionGroup = new AchievementScriptParser().Parse(tokenizer); int gameId = 0; var idComment = expressionGroup.Comments.FirstOrDefault(c => c.Value.Contains("#ID")); if (idComment != null) { var tokens = idComment.Value.Split('='); if (tokens.Length > 1) { Int32.TryParse(tokens[1].ToString(), out gameId); } } if (gameId == 0) { logger.WriteVerbose("Could not find game ID"); MessageBoxViewModel.ShowMessage("Could not find game id"); return; } if (!usingBackup) { AddRecentFile(filename); } logger.WriteVerbose("Game ID: " + gameId); var gameTitle = expressionGroup.Comments[0].Value.Substring(2).Trim(); GameViewModel viewModel = null; foreach (var directory in ServiceRepository.Instance.FindService <ISettings>().DataDirectories) { var notesFile = Path.Combine(directory, gameId + "-Notes2.txt"); if (File.Exists(notesFile)) { logger.WriteVerbose("Found code notes in " + directory); viewModel = new GameViewModel(gameId, gameTitle, directory.ToString()); } else { notesFile = Path.Combine(directory, gameId + "-Notes.json"); if (File.Exists(notesFile)) { logger.WriteVerbose("Found code notes in " + directory); viewModel = new GameViewModel(gameId, gameTitle, directory.ToString()); } } } if (viewModel == null) { logger.WriteVerbose("Could not find code notes"); MessageBoxViewModel.ShowMessage("Could not locate notes file for game " + gameId); viewModel = new GameViewModel(gameId, gameTitle); } var existingViewModel = Game as GameViewModel; // if we're just refreshing the current game script, only update the script content, // which will be reprocessed and update the editor list. If it's not the same script, // or notes have changed, use the new view model. if (existingViewModel != null && existingViewModel.GameId == viewModel.GameId && existingViewModel.Script.Filename == filename && existingViewModel.Notes.Count == viewModel.Notes.Count) { existingViewModel.Script.SetContent(content); viewModel = existingViewModel; existingViewModel.SelectedEditor = Game.Editors.FirstOrDefault(e => e.Title == selectedEditor); existingViewModel.Script.Editor.MoveCursorTo(line, column, Jamiras.ViewModels.CodeEditor.CodeEditorViewModel.MoveCursorFlags.None); } else { if (usingBackup) { viewModel.Script.Filename = Path.GetFileName(filename); var title = viewModel.Title + " (from backup)"; viewModel.SetValue(GameViewModel.TitleProperty, title); } else { viewModel.Script.Filename = filename; } viewModel.Script.SetContent(content); Game = viewModel; } if (viewModel.Script.Editor.ErrorsToolWindow.References.Count > 0) { viewModel.Script.Editor.ErrorsToolWindow.IsVisible = true; } }