gpt4 book ai didi

C-当我在解释器/编译器中需要它时,在结构中的另一种类型上使用指针

转载 作者:行者123 更新时间:2023-11-30 15:03:27 32 4
gpt4 key购买 nike

我们正在编写一个java语言的解释(简化了很多,称为IFJ16语言)作为我们的团队项目。

我们正在编码的语言是纯C(我们不能使用任何OOP)

这就是问题:

在解释中我们需要读取 Instr 类型的结构

 typedef struct Instr {
BTSNode *Id1; // Adress of first operand
BTSNode *Id2; // Adresss of second operand
BTSNode *Id3; // Adress where the result is added
InstrType type; // Type of instruction. InstrType is enum struct (like insDiv, insMux, ...)
}Instr;

BTSNode是二叉树中的一个节点,其中存储所有变量(类和函数)。结构:

typedef struct tBTSNode {
tableName key; // Key, variable/func,class name
NodeType nodeType; // Type (class, func, var)
union {
struct tBTSNode *functions; // Pointer on functions of class
int argNo; // Argument number if its function argument
} tBTSNode;

tabSymbol data; // Data
int inc; // Was var initialized?

struct tBTSNode *variables; // Pointer on function or class variables

struct tBTSNode *lptr; // Pointer on left subtree
struct tBTSNode *rptr; // Pointer on right subtree
} BTSNode, *tBTSNodePtr;


typedef struct tableSymbolVariable {
varType type; //In var case: type of var | in function case= return var type | In class case: NULL
varValue value; //In case of var: var value | In case of class and func: null
} tabSymbol, *tabSymbolPtr;
typedef enum {
var_int,
var_double,
var_string,
var_void,
} varType;


union {
int intValue;
double doubleValue;
char *stringValue;
} varValue;

因此,Interprer 得到了指令堆栈(其简单堆栈由 Instr 类型的Instructionf 填充),已排序(因此第一条指令将首先执行,...)。当他执行堆栈的最后一项时,通过循环解释 will(此时程序结束)。

所以这里有一个问题。我们有例如说明

a = b + c;

这很简单。结构看起来像(注意:这不是真正的代码,只是为了向您展示问题所在)

 typedef struct Instr {
BTSNode *Id1 = adress of node with variable b
BTSNode *Id2 = adress of node with variable c
BTSNode *Id3 = adress of node with variable a (there will by the b+c result storaged)
InstrType type = insPlus
}Instr;

所以我只会调用我的 doMath 函数(当然我会检查类型是否正确。)

Id3->data.value = Id1->data.value Id2->data.value;

所以问题就在这里。如果我将示例更改为这样会怎样

a = b + 30;

我该怎么办?有了a和b就没有问题了。我会在二叉树中找到变量并将它们添加到 Id1 和 Id3 中。但是我应该如何处理 30 号呢?

我正在考虑更改 Instr 结构,以便 Id1-Td3 将是 void* 指针,在优先级分析中,我将它们重新键入 BTSNode 指针(如果它们确实是指针)和数字(或字符串,...)在这种情况下,请重新输入 int* 指针。所以结构是

     typedef struct Instr {
BTSNode *Id1 = adress of node with variable b
Int *Id2 = adress of node with variable c
BTSNode *Id3 = adress of node with variable a (there will by the b+c result storaged)
InstrType type = insPlus
}Instr;

所以我的问题是:这是“正确”的解决方案吗?或者我可以做得更好、更轻松?

感谢您的回答和帮助。

最佳答案

您可以使用常量值创建虚拟匿名变量,并像普通变量一样从指令节点引用它们。

关于C-当我在解释器/编译器中需要它时,在结构中的另一种类型上使用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40723938/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com