c - 如何在c中运行时声明变量

标签 c variables runtime

我即将开始一个完全用c语言编写的简单计算器之类的项目,我想知道如何允许用户在程序运行时创建变量,这个变量可以是数字或复数,甚至可以是矩阵或 一种方法是将变量的类型、名称、大小和值存储在临时文本文件中,并在需要时检索它,是否有更好的方法。我希望我能在 c 运行时声明真实变量

最佳答案

好的,您将需要三个基本模块:

注意我还没有时间实际编译这些示例,希望我没有犯太多错误。

  1. 解析器。该模块接受用户输入的输入,对其进行标记并确保输入的表达式符合语法。
  2. 口译员。该模块获取解析器的输出并执行计算。
  3. 环境。该模块管理计算的状态。

让我们从环境开始,这是我们需要的(或者至少是我要实现的)。首先,这是我将用于环境的设计考虑因素:

  1. 我们只会处理变量
  2. 我们只允许 300 个变量
  3. 所有变量都具有全局作用域
  4. 重新绑定(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/

相关文章:

php - 快速 PHP 变量指南

java - 进程 p = Runtime.getRuntime().exec() 将异步运行?

C 运行时错误(程序应该打印前 1000 个素数)

c - SetBkMode(hdc, TRANSPARENT) 不起作用

c++ - 二分查找的逻辑

PHP 只解析数组中的第一个元素

JavaScript:我可以在 switch case 中声明变量吗?

c++ - 如何在运行时获取 C++ 对象名称?

交换指针时的困惑

c - 用 C 返回数组,不同的方法