0

私の会社では、構文的に Excel の数式言語に似たドメイン固有の言語を維持しています。新しいビルトインを言語に追加することを検討しています。これを行う 1 つの方法は、コードベースで繰り返し使用される冗長コマンドを特定することです。たとえば、人々が常に同じ 100 文字のコマンドを記述して、文字列の先頭と末尾から空白を削除するのを見た場合、trim関数を追加する必要があることを示唆しています。

コードベースで頻繁に使用される部分文字列のリストを確認することから始めるとよいでしょう (ただし、使用される変数名が異なるため、頻繁に使用されるコマンドが数文字異なる場合があります)。

これを行うための十分に確立されたアルゴリズムがあることは知っていますが、最初に、車輪の再発明を回避できるかどうかを確認したいと思います. たとえば、この概念が多くの圧縮アルゴリズムの基礎になっていることは知っていますが、頻繁に使用される部分文字列の辞書を取得できる圧縮モジュールはありますか? 他のアイデアをいただければ幸いです。

4

3 に答える 3

0

文字列のマッチングは簡単にできることであり、明らかなケースです。より困難なケースは、似たようなことを異なる順序で行っている場合です。たとえば、次のものがあるとします。

X+Y
Y+X

あなたの文字列マッチングのアプローチは、それらが事実上同じであることを認識しません。もう少し詳しく知りたい場合は、数式を AST に解析し、実際に AST を比較する必要があると思います。これを行うと、二項演算子 '+' が交換可能であるため、ツリーが実際には同じであることがわかります。

また、リダクション ルールを適用して、複雑な関数をより単純な関数に評価できるようにすることもできます。次に例を示します。

(X * A) + ( X * B)
X * ( A + B )

それらも同じです!文字列の一致は役に立ちません。

  1. AST に解析する
  2. 機能の削減と最適化
  3. 結果の AST を他の AST と比較する

一致するものが見つかったら、それらを共有関数の呼び出しに置き換えます。

于 2010-09-23T17:31:46.593 に答える
0

Luceneのような既存のフルテキスト インデクサーを使用して、数式言語に固有の独自のアナライザーとトークナイザーを実装できると思います。

その後、クエリを実行し、最も使用されている数式を確認したり、どの数式が隣り合っているかなどを確認したりできます。

開始するための簡単な記事を次に示します。

Lucene アナライザー、トークナイザー、および TokenFilter

于 2010-07-01T19:19:21.597 に答える
-1

tag-cloud generatorsを調べることをお勧めします。私が探した分にはソースを見つけることができませんでしたが、ここにオンラインのものがあります: http://tagcloud.oclc.org/tagcloud/TagCloudDemo区切り文字としてスペースを使用しているため、おそらく機能しません。

于 2010-07-01T19:13:24.547 に答える