Compilersというクラスのプロジェクトとしてカスタム言語を作っています。プロジェクト全体は Java であり、JFlexを語彙アナライザーとして使用し、Cupを構文アナライザーとして使用しています。
この言語用の単純なテキスト エディターを作成しました。これは基本的に JTextPane で構成され、ユーザーは解析されるカスタム コードを入力できます。この JTextPane には DefaultStyledDocument があり、JTextPane 内のコード (テキスト) のキーワード、コメント、文字列、数字などの色を変更するなど、文字属性を設定するために使用されます。
私が使用しているコードは次のとおりです。
DefaultStyledDocument doc = new DefaultStyledDocument() {
@Override
public void insertString(int offset, String str, AttributeSet a) throws BadLocationException { //cuando se insertan caracteres.
super.insertString(offset, str, a);
String text = getText(0, getLength());
syntax = new SyntaxHighlighter(new java.io.StringReader(text));
Token val;
try {
while ((val = syntax.yylex()) != null) {
switch (val.type) {
case TokenType.KEYWORD:
setCharacterAttributes(val.start, val.length, keyword, true);
break;
case TokenType.COMMENT:
setCharacterAttributes(val.start, val.length, comment, true);
break;
case TokenType.STRING:
setCharacterAttributes(val.start, val.length, string, true);
break;
case TokenType.FUNCTION:
setCharacterAttributes(val.start, val.length, function, true);
break;
case TokenType.NUMBER:
setCharacterAttributes(val.start, val.length, plain, true);
break;
case TokenType.OPERATOR:
setCharacterAttributes(val.start, val.length, operator, true);
break;
case TokenType.READ:
setCharacterAttributes(val.start, val.length, number, true);
break;
default:
setCharacterAttributes(val.start, val.length, plain, true);
break;
}
}
} catch (IOException ex) {
JOptionPane.showMessageDialog(rootPane, "Oops! Exception triggered\n" + ex.getMessage());
}
}
@Override
//this is the method I want to optimize
public void remove(int offs, int len) throws BadLocationException {
super.remove(offs, len);
String text = getText(0, getLength());
syntax = new SyntaxHighlighter(new java.io.StringReader(text));
Token val;
try {
while ((val = syntax.yylex()) != null) {
switch (val.type) {
case TokenType.KEYWORD:
setCharacterAttributes(val.start, val.length, keyword, true);
break;
case TokenType.COMMENT:
setCharacterAttributes(val.start, val.length, comment, true);
break;
case TokenType.STRING:
setCharacterAttributes(val.start, val.length, string, true);
break;
case TokenType.FUNCTION:
setCharacterAttributes(val.start, val.length, function, true);
break;
case TokenType.NUMBER:
setCharacterAttributes(val.start, val.length, plain, true);
break;
case TokenType.OPERATOR:
setCharacterAttributes(val.start, val.length, operator, true);
break;
case TokenType.READ:
setCharacterAttributes(val.start, val.length, number, true);
break;
default:
setCharacterAttributes(val.start, val.length, plain, true);
break;
}
}
} catch (IOException ex) {
JOptionPane.showMessageDialog(rootPane, "Oops! Exception triggered\n" + ex.getMessage());
}
}
};
this.codeTextPane.setStyledDocument(doc);
SyntaxHighlighter クラスは基本的に、特定のテキスト (キーワード、文字列など) を検索する方法としてのみ使用されるレクサー (JFlex で作成) です。すべてが完璧に機能しますが...
問題:
JTextPane に適切な量のテキストがある場合、バックスペース キーを押したままにしてテキストを削除すると、プログラムの遅延がかなり大きくなります。これが発生すると私が考える理由は、バックスペース キーを押したままにすると、削除される各文字に対して remove() 関数が呼び出されるため、SyntaxHighlighter がすべての文字が削除された状態で実行されるためだと考えられます。ファイルからコードをロードするか (そのファイル内のテキスト全体が SyntaxHighlighter によって全体として分析される)、または遅延に気付くほど速く入力できないため、テキストの挿入は実際には問題ではありません。
これを最適化する方法はありますか?皆さん、ありがとうございました!