2011-04-16 94 views
0

我在大学时分配了一个奇怪的项目。我被要求从一个给定的输入'C'程序中提取变量定义和引用。从'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是声明的,因此它必须打印在输出的“definition”列下。

类似地,在语句5中,a和b的值正在使用scanf语句进行初始化,因此应该在输出的定义列下打印变量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脚本的项目.. 我需要考虑数学表达式,逻辑表达式,内置函数调用,用户定义函数调用和函数定义。 。

在此先感谢..

+0

这是为什么类的?这个练习的目的是什么? – 2011-04-16 12:46:26

+0

@ ab07:“这类事情发生在我们的大学里”。你应该问“你(教授)期望我从这项任务中学到什么”?如果他希望你用除真正的解析器以外的其他方法来做到这一点,我会不知道他的期望是什么,以及是否有太多的指向。 5f他希望你用解析器来做,而且你不知道解析,你有麻烦。如果他希望你使用真正的解析器,我不明白左边距中的数字的重点;你确定这是要求的一部分吗? – 2011-04-16 12:50:45

+0

这是非常不精确的。你用'if'做什么?你会跨多行传播if语句吗?那么它会不会违反“单行包含单一陈述”的规则?你把它放在同一行,然后嵌套在复合语句中嵌套多个语句吗?从而在同一行中有多个标量语句? – 2011-04-16 13:47:08

回答

1

标准的事情是写一个标记和解析器部分编译输入程序。然后你就会知道每一行有什么表达。对于这项任务的目的,你可以匹配正则表达式高达:

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

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

+0

感谢您的答复..但我怎么能启动?我应该使用C编程吗?任何“Tokenizer和解析器”教程?你能指导我吗? :) – abk07 2011-04-16 11:36:06

+0

@ abk07,如果这是**你的**任务,我假设你已经在学校/单元中教过解析器理论的基础知识。如果情况并非如此,我觉得很奇怪你会得到这样的任务。无论如何,Milimetric给你提供了一些必要的提示。我建议你在发布后续问题之前,自己做一些研究(打开一本书,搜索网络,不管)。 SO是回答特定问题的好地方,而不是牵扯他人来指导他们完成整个任务,IMO。这就是你的老师或你班上的TA所擅长的。祝你好运。 – 2011-04-16 11:58:48

+0

@Bart ..好的谢谢..这些事情发生在我们的大学.. – abk07 2011-04-16 12:02:40

1

您基本上需要从一个完整的C语法分析器开始。你可以自己写这个,但是你最好使用预先存在的东西,比如CLang