我即将开始一个完全用c语言编写的简单计算器之类的项目,我想知道如何允许用户在程序运行时创建变量,这个变量可以是数字或复数,甚至可以是矩阵或 一种方法是将变量的类型、名称、大小和值存储在临时文本文件中,并在需要时检索它,是否有更好的方法。我希望我能在 c 运行时声明真实变量
最佳答案
好的,您将需要三个基本模块:
注意我还没有时间实际编译这些示例,希望我没有犯太多错误。
- 解析器。该模块接受用户输入的输入,对其进行标记并确保输入的表达式符合语法。
- 口译员。该模块获取解析器的输出并执行计算。
- 环境。该模块管理计算的状态。
让我们从环境开始,这是我们需要的(或者至少是我要实现的)。首先,这是我将用于环境的设计考虑因素:
- 我们只会处理变量
- 我们只允许 300 个变量
- 所有变量都具有全局作用域
- 重新绑定(bind)变量将覆盖旧绑定(bind)
现在,让我们定义以下结构:
typedef struct st
{
char* tokenName;
int type;
union
{
int iVal;
float fVal;
} val;
} tableEntry, * ptableEntry;
tableEntry symbolTable[300];
现在一些功能:
a. init(tableEntry*) -- 该函数初始化环境,即将符号表中的所有值设置为某种预定义的空状态。
b. addValue(tableEntry*, name, value) -- 此函数采用指向环境的指针并向环境添加一个新条目。
c. int LookupValue(tableEntry*, name) ——该函数接受一个指向环境的指针,并查看其中是否已定义 token 名称。我们已经看到一个问题,我们允许整数和 float ,但想要单个查找函数,因此我们可能需要某种变体类型或找出某种方法来返回不同类型。
d. updateValue(tableEntry*, name, value) - 该函数采用指向环境的指针并更新现有值。这就提出了一个 Unresolved 规范,如果找不到 token ,updateValue 应该做什么?就我个人而言,我只会添加该值,但这取决于您作为计算器的设计者要做什么。
这应该为环境做一个开始。
现在让我们来谈谈解释器。为此,假设解析器以前缀形式发出抽象语法树。例如:
语句 x=3 将被发出为 = x 3
语句 z = 4 + 5 将被发出为 = z + 4 5
好吧,这里的技巧是我们实际上并不发出3
,而是发出一个 token ,其中包含有关正在传递的内容的更多信息。
token 的可能实现可能是:
typedef struct tok
{
int tokType;
char* tokVal;
} token, * ptoken;
还可以进行以下枚举:
enum {EMPTY=0, ID, VAL, EQ, PLUS, SUB, MULT, DIV, LPAREN, RPAREN};
因此,简化的语句 = x 3
实际上如下
结构:
{EQ, null} {ID, "x"} {VAL, "3"}
好的,所以伪代码中的解释器看起来像这样(假设上面的内容作为列表呈现给解释器)。
while list not empty
token <-- head(list) /* this returns the first token as well as removing it from the list */
switch (token.tokType)
{
....
case EQ: /* handling assignment */
token <--- head(list)
name = token.name
token <--- head(list)
val = atoi(token.tokVal)
addValue(env*, name, val);
break;
case ID:
name = token.name
val = lookupValue(env*, name)
....
}
请注意,上述代码的实际格式很可能需要修改以处理其他结构,这只是一个概念性示例!
现在轮到你了——尝试一下,向我们展示你的想法。
稍后
关于c - 如何在c中运行时声明变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28863822/