@FXML
    void analyzeHandler(MouseEvent event) {
        String rawSentence = this.sentenceTextArea.getText();
        Sentence sentence;

        if (!Grammar.getInstance().initialized()) {
            MessageBox.show(this.primaryStage, "Bộ ngữ pháp chưa được khởi tạo!", "Lỗi",
                    MessageBox.ICON_ERROR | MessageBox.OK);
            return;
        }

        try {
            sentence = new Sentence(rawSentence);
        } catch (Exception e) {
            MessageBox.show(this.primaryStage, "Lỗi khi xử lý câu:\n" + e.getMessage(), "Lỗi",
                    MessageBox.ICON_ERROR | MessageBox.OK);
            return;
        }

        Parser parser;
        if (this.AlgorithmRadio.getSelectedToggle().getUserData().equals("CYK"))
            parser = CYKParser.getInstance();
        else
            parser = EarleyParser.getInstance();

        LinkedList<SyntaxNode> trees = parser.parse(sentence);

        LinkedList<String> results = Outputer.toStringList(trees);
        if (results.isEmpty()) {
            this.resultTextArea.setText("-- Không phân tích được câu đầu vào --");
            return;
        }

        String result = "";
        for (String str : results) {
            result += str + "\n";
        }

        this.resultTextArea.setText(result);

        String mode = (String)this.FileModeRadio.getSelectedToggle().getUserData();
        if (mode.equals("none"))
            return;

        String toFile = this.fileTextField.getText();
        if (toFile.isEmpty()) {
            MessageBox.show(this.primaryStage, "Đường dẫn file không được để trống!", "Lỗi",
                    MessageBox.ICON_ERROR | MessageBox.OK);
            return;
        }

        boolean append = false;
        if (mode.equals("append"))
            append = true;

        try {
            Outputer.write(toFile, results, true, append);
        } catch (Exception e) {
            MessageBox.show(this.primaryStage, "Lỗi khi ghi file:\n" + e.getMessage(), "Lỗi",
                    MessageBox.ICON_ERROR | MessageBox.OK);
        }
    }