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 逻辑......例如,我输入一个带有逻辑的文件,我的程序在那个文件中进行解析,然后生成那个 ast,生成那个 ast 的最佳方法是什么?

问题是野兽,但不知道如何解决,所以我来到 StackOverFlow 来解决我的疑问,因为我不知道如何解决这些我的疑问......

4

2 回答 2

1

聪明的。在这个示例中,不需要该next字段。门之间的联系是通过输入字段,其中后门(在时间上)的输入是指在时间上较早的门的输出。

要生成抽象语法树 (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 回答