【问题标题】:Extract variable definitions and variable reference from a 'C' program从“C”程序中提取变量定义和变量引用
【发布时间】:2011-04-16 09:29:21
【问题描述】:

我在大学被分配了一个奇怪的项目。我被要求从给定的输入“C”程序中提取变量定义和引用。

输入程序中的每一行都在开头包含各自的行号,后跟一个空格,然后实际代码开始。

考虑以下程序..

1 int main()  
2 {  
3 int a,b,c;  
4 printf("Enter the values of a and b\n");  
5 scanf("%d%d",&a,&b);  
6 c=a+b;  
7 printf("The sum of two numbers is %d",c);  
8 }  

我正在开发的程序的输入是一个“C”程序,其中单行由一个语句组成.. 即,我们知道整个程序可以写在一行中。但不是在我的情况下,即一旦有终止符(分号),分号后面的行就会转移到下一行..

无论如何,我的工作是在给定的输入 C 程序中提取变量定义/声明和变量使用/引用..

考虑上面的程序, 在第 3 行,声明了变量 a、b 和 c,因此它必须打印在输出的“定义”列下。..

同样在语句 5 中,使用 scanf 语句初始化 a 和 b 的值,因此变量 a 和 b 应该打印在输出的定义列下。..

现在考虑语句 6,变量 c 的值正在被初始化/定义,因此 c 必须打印在定义列下。同时,a 和 b 的值被用于确定 c 的值,因此变量 a 和 b 必须打印在输出的“参考”列下..

最后,变量 c 的值在语句 7 中被引用/使用,因此变量 c 必须打印在引用的列下..

程序的示例输出如下所示..

Line Number          Defined Variable        Referenced Variable
_____________________________________________________________________
  1                       --                           --
  2                       --                           --
  3                     a,b,c                         --
  4                       --                           --
  5                      a,b                          --
  6                       c                           a,b
  7                       --                          c
  8                       --                          --

谁能告诉我如何解决这个问题???? 请记住,我需要编写一个 C/C++ 程序,甚至项目允许使用 shell 脚本。 我需要考虑数学表达式、逻辑表达式、内置函数调用、用户定义的函数调用和函数定义......

提前谢谢..

【问题讨论】:

  • 这是给什么样的课的?而这个练习的目的是什么?
  • @ab07:“这类事情发生在我们的大学里”。你应该问“你(教授)希望我从这个作业中学到什么”?如果他希望您使用真正的解析器以外的任何东西来执行此操作,我想知道他的期望是什么,以及这是否有很多意义。 5f 他希望你用解析器来做,而你不知道解析,你有麻烦了。如果他希望您使用真正的解析器,我不明白左边距数字的意义;你确定这是要求的一部分吗?
  • 这是非常不精确的。你用if做什么?您会将 if 语句分布在多行吗?那么它不会违反“单行由单语句组成”的规则吗?您是否将其保留在同一行,然后将多个语句嵌套在嵌套的复合语句中?从而在同一行中有多个标量语句?
  • @Ira.. 是的,他希望我从给定的“C”程序中提取定义和引用。我们都知道数据流图是什么。在其中,每个节点都被分配定义和引用..数据流图中的每个节点都代表 C 程序中的一条语句..所以肯定它必须对解析做一些事情..是的,一个真正的解析器..是的,数字非常重要..所以必须探索这些东西..我是一名计算机科学专业的学生..中级..
  • @Johannes 不!我们如何将“if”语句分布在多行中!?! if(condition) 在一条语句中..

标签: c++ c parsing shell


【解决方案1】:

标准做法是编写分词器和解析器来部分编译您的输入程序。然后你就会知道每一行都有什么表达式。出于此分配的目的,您最多可以匹配正则表达式:

  1. 变量定义
  2. 变量引用

并吐出每一行的捕获。因此,例如,变量引用可能类似于“除了有效 C 数据类型之外的任何地方的有效 C 标识符”。这里的捕获将是“一个有效的 C 标识符”,所以只需在“引用变量”列下打印出来。

【讨论】:

  • 感谢您的回复。但是我该如何开始呢?我应该使用C编程吗? “标记器和解析器”的任何教程?你能指导我吗? :)
  • @abk07,如果这是你的作业,我假设你已经在学校/大学学习过解析器理论的基础知识。如果不是这种情况,我觉得很奇怪你会得到这样的任务。无论如何,Milimetric 为您提供了一些关于执行此操作所需的体面提示。我建议您在发布后续问题之前自己进行一些研究(打开一本书,搜索网络,等等)。 SO 是回答具体问题的好地方,而不是牵手指导他们完成整个任务,IMO。这是你的老师或你班的助教擅长的。祝你好运。
  • @Milimetric:真正的 C 程序中的“定义”和“引用”的概念比这更棘手。如果你调用 foo(&x),x 可能在获取值的意义上是“定义的”。或不,取决于 foo.同样对于“引用”。要做到这一点正确,您需要一个完整的指向分析...
  • @Ira - 我没有关注。在大多数类型化语言中,变量定义是相当标准的:int x ... @abk07 - 寻找 C 语言规范之类的地方以获取正则表达式的想法:eli-project.sourceforge.net/c_html/c.html#m16
  • @MMillimetric:不要混淆“声明”、“定义”和“访问”(参考)。 OP给出的例子确实混合了这些;他将第 3 行和第 5 行作为“定义”。
【解决方案2】:

您基本上需要从一个成熟的 C 解析器开始。您可以自己编写,但最好使用预先存在的内容,例如 CLang

【讨论】:

    猜你喜欢
    • 2015-06-30
    • 2020-11-14
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多