3

論理ゲートの問題を解決するためにリンクされた構造体があります...しかし、リンクされた構造体の機能と、それらの値をどのように使用できるかについて疑問があります

だから、それは私のコードです:

typedef enum { NEG, AND, OR, NAND, NOR, XOR, XNOR }Gates;

struct AstLogic
{
    bool input1;
    bool input2;
    bool result;
    Gates gate;
    struct AstLogic *nextGate;
};

そして、テスト関数は次のとおりです。

struct AstLogic ast1, ast2, ast3;

//
//     1-|ast1|
//     1-|____|+-------+
//                     |
//                     +|ast3|
//                     +|____|+----+ OUTPUT
//                     |
//     1-|ast2|+-------+
//     0-|____|
//

void createInputsTest()
{
    ast1.gate = NOR;
    ast1.input1 = true;
    ast1.input2 = true;
    ast3.result = ~(ast1.input1|ast1.input2);

    ast2.gate = NOR;
    ast2.input1 = true;
    ast2.input2 = false;
    ast2.result = ~(ast2.input1|ast2.input2);
    ast1.nextGate = &ast2; // make the link

    ast3.gate = NOR;
    ast3.input1 = ast1.result;
    ast3.input2 = ast2.result;
    ast3.result = ~(ast3.input1|ast3.input2);

    if(ast3.result == true)
        printf("true");
    else
        printf("false");
}

そのASTロジックを使用して、「出力」結果を自動取得する良い方法があるかどうか知りたいだけです...たとえば、ロジックを含む1つのファイルを入力すると、プログラムはそのファイルで解析を行い、その ast を生成する方法 その ast を生成するのに最適な方法は?

質問は獣ですが、解決方法がわからないので、疑問を解決する方法がわからないため、StackOverFlowに来て疑問を解決しました...

4

2 に答える 2

1

頭がいい。nextこの 1 つの例では、フィールドは必要ありません。ゲート間のリンクは入力フィールドを介して行われ、(時間的に) 後のゲートの入力が時間的に前のゲートの出力を参照します。

抽象構文ツリー (AST) を生成するには、まず、回路のゲートをファイルに保存する方法を定義する必要があります。これには、ゲートに名前を付けたり、ゲートからの出力を別のゲートの入力にリンクするテキストを含めたりします。次に、そのファイルを読み取り、AST を構築してから、シミュレートされた時間でゲートを通過するときに値を設定してトラバースします。全体的に大規模ですが、中程度のプロジェクトに簡単です。

ただし、ゲートを時間順にリストし、プログラムに暗黙的にゲートを通過させるという、行ったことを行うことができます。

于 2013-08-12T06:07:28.883 に答える
0

createInputsTest() が間違っていました。これが正しいバージョンです。

struct AstLogic ast1, ast2, ast3;

//
//     1-|ast1|
//     1-|____|+-------+
//                     |
//                     +|ast3|
//                     +|____|+----+ OUTPUT
//                     |
//     1-|ast2|+-------+
//     0-|____|
//

void createInputsTest()
{
    ast1.gate = NOR;
    ast1.input1 = true;
    ast1.input2 = true;
    ast1.nextGate = &ast3

    ast2.gate = NOR;
    ast2.input1 = true;
    ast2.input2 = false;
    ast2.nextGate = &ast3;

    ast3.gate = NOR;
    ast1.nextGate->input1 = ~(ast1.input1|ast1.input2);
    ast2.nextGate->input2 = ~(ast2.input1|ast2.input2);
    ast3.result = ~(ast3.input1|ast3.input2);

    if(ast3.result == true)
        printf("true");
    else
        printf("false");
}
于 2013-08-12T06:05:00.213 に答える