最初に文字に一致する可能性のあるすべての文字のセットを、文字列の中のある特定のインスタンスjava.util.regex.Pattern
で計算したいと考えています。より正式には、特定の正規表現に相当するDFAを仮定すると、すべての発信トランジションのセットが開始状態から必要です。正規表現パターンにマッチした最初の文字セットを判別できますか?
例:
{ 'a', 'b', 'c', 'd', ' ', '\n', '\r', '\t' }
任意のアイデア:
Pattern p = Pattern.compile("[abc]def|daniel|chris|\\s+");
Set<Character> first = getFirstSet(p);
セットfirst
には、次の要素が含まれている必要がありますか?私は自分自身でDFAを構築し、そのような状態を決定することができることをよく承知していますが、そのような面倒を避けたいと思います(読んでください:私にはそれほど価値がありません)。私のホスト言語は実際にはScalaなので、Scalaの中核となるすべてのライブラリにアクセスすることができます(これは価値があります)。
ええ、私はそれについて考えました。これは、自分でDFAのフロントエンドを構築することと事実上同じです。たぶん私はこれになるならこれをやるだろうが、私はむしろ簡単な解決策を見つけるだろう。 –
私は、(言語標準の固定文法に従って)それを構文解析するよりもはるかに簡単ではないか、かなり明白な再帰をいくつか見ていますが、おそらくそれは私のコンパイラ構築の脳です。 – Tetha
よく解析してから再帰的な探索あまりにも悪いですが、私はちょうど最初のセットを取得するためにJavaの正規表現のセマンティクスを複製することについて幸せではないです。 –