我在大学时被分配了一个奇怪的项目。我被要求从给定的输入“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程序中提取变量定义/声明和变量use / reference ..
考虑上述计划, 在第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脚本用于项目.. 我需要考虑数学表达式,逻辑表达式,内置函数调用,用户定义函数调用和函数定义。
提前致谢..
答案 0 :(得分:1)
要做的标准事情是编写一个tokenizer和一个解析器来部分编译你的输入程序。然后你就会知道每一行上有什么表达式。出于此分配的目的,您可以将正则表达式匹配到:
并吐出每一行的捕获。因此,例如,变量引用可能类似于“除了有效的C数据类型之外的任何地方的有效C标识符”。这里的捕获将是“有效的C标识符”,因此只需在“参考变量”列下打印出来。
答案 1 :(得分:1)
你基本上需要从一个完整的C解析器开始。您可以自己编写,但最好使用预先存在的内容,例如CLang。