6

出来ますか?これに利用できるツールはありますか?

4

2 に答える 2

2

これは、基本文法にアクセスできる任意のシステムで実行できます。ANTLR と YACC は文法をコンパイルするので、文法はもうありません。ANTLR の場合、文法はコードに変換されています。あなたはそれを取り戻すつもりはありません。YACC の場合、文法のエッセンスを含むパーサー テーブルが作成されます。以下で説明することを行うのに十分なほど十分に理解していれば、そのような解析テーブルをたどることができます。

明示的に表現された一連の文法規則をたどり、拡張/派生をランダムに選択するのは簡単です。定義上、これにより有効な構文が得られます。

それがしないのは、有効なコードを取得することです。ここでの問題は、ほとんどの言語が実際には文脈依存の構文を持っていることです。ほとんどのプログラムは、宣言された識別子がその宣言とスコープ規則と一致する方法で使用されない限り有効ではありません。後者には、完全なセマンティック チェックが必要です。

当社のDMS Software Reengineering Toolkitは、[文法を使用して] 任意の言語でコードを解析し、AST を構築し、それらのツリーを分析して変換し、最終的に有効な (構文) テキストをプリティプリントするために使用されます。DMS は、文法規則およびツリー構築機能への直接アクセスを提供するため、ランダムな構文ツリー (および prettyprint) を非常に簡単に生成できます。それらが意味的に有効であることを確認することは、DMS でも困難です。ただし、DMS のフロント エンドの多くは (ランダムな) ツリーを取得してセマンティック チェックを実行できるため、少なくともツリーがセマンティックに有効かどうかはわかります。

「いいえ」と言われたらどうするかはまだ問題です。おそらく、少なくとも一貫性のない使用法を保証する方法で識別子名を生成できますが、それは言語に依存すると思われます。

于 2012-06-25T11:13:19.997 に答える
1

yacc と bison は、文法を有限状態マシンに変換します。有効な入力を見つけるために、ステート マシンをランダムにトラバースできる必要があります。

基本的に、各状態で、新しいトークンをスタックにシフトして新しい状態に移動するか、一連の有効な削減に基づいてスタック内の一番上のトークンを削減できます。(これがどのように機能するかについての詳細は、 Bison のマニュアルを参照してください)。

ランダム ジェネレーターはステート マシンをトラバースし、各ステートでランダムではあるが有効なシフトまたはリダクションを行います。最終状態に到達すると、有効な入力が得られます。

人間が判読できる状態の説明については、-vまたは--report=stateオプションを bison に使用できます。

残念ながら、これを実行できる既存のツールを紹介することはできません。

于 2012-06-25T23:07:30.567 に答える