6

JSyntaxpane で使用するレクサーを生成するカスタム フレックス ファイルを作成しています。

lex する必要があるカスタム言語には、一種のスタックで互いに埋め込むことができるさまざまな状態があります。

つまり、一重引用符で囲まれた文字列を含む式を作成し、特別なトークン eval() を使用して文字列内に別の式を埋め込むことができます。ただし、二重引用符で囲まれた文字列内に式を埋め込むこともできます。

例えば:

someExpressionFunction('a single-quoted string with an eval(expression) embedded in it', "a double-quoted string with an eval(expression) embedded in it")

これは単純化したもので、これよりも多くの状態がありますが、DOUBLE_STRING と SINGLE_STRING に異なる状態が必要であると仮定すると、私の状況を適切に説明しています。

eval式を閉じたときに正しい状態に確実に戻るための最良の方法は何ですか(つまり、二重引用符で囲まれている場合はDOUBLE_STRINGに戻り、単一引用符で囲まれている場合はSINGLE_STRINGに戻ります)

私が思いついた解決策は、yybegin を使用して別の状態を開始する代わりに、スタックといくつかのカスタム メソッドを使用して状態を追跡することです。

private Stack<Integer> stack = new Stack<Integer>();

public void yypushState(int newState) {
  stack.push(yystate());
  yybegin(newState);
}

public void yypopState() {
  yybegin(stack.pop());
}

これはこれを達成するための最良の方法ですか?活用できる JFlex のより単純な組み込み関数や、知っておくべきベスト プラクティスはありますか?

4

1 に答える 1

5

とても良い方法だと思います。実際には、Groovy GString、Python のような String、HTML を JavaDocs に追加するために、同様の機能が必要でした。

私が追加したいのは、サブセクションを解析するためにレクサーを呼び出すレクサーです。HTML に埋め込まれた JavaScript のようなもの。しかし、私はそれをする時間を得ることができませんでした。

私は StackOverflow が好きですが、なぜこれを JSyntaxPane の問題に投稿しなかったのでしょうか?

于 2009-06-30T08:40:55.330 に答える