2015-05-16 27 views
-2

我想验证一个给定的字符串是在验证字符串作为有效的C代码

int main() { 
    double x[3]; 
    <insert code here>; 
    return EXIT_SUCCESS; 
} 

有效范围内有效的C代码,我想验证,

verifyC('x[0]*x[0] + x[1] + 1') // pass 
verifyC('x[0]*x[0] + x[1] +') // fail, syntax error 
verifyC('x[0]*x[0] + a') // fail, `a` undefined 

会是什么是一种很好的验证方式?

+2

你的问题似乎还不清楚。函数应该检查给定的字符串在语义上,还是仅在语法上?根据你的代码,给定的字符串将被“粘贴”成C代码。但是,在这种情况下,它们都是不正确的,因为每行末尾都没有分号。所以,请更具体一些:尝试解释目标,而不是实现方式。 – soon

+0

编写一个解析器。期。如果你遇到问题,我们可以提供帮助。目前,正如它所写,它太宽泛无法回答。 –

+1

使用类似[pycparser](https://github.com/eliben/pycparser)的解析器 – myaut

回答

2

最简单的方法是试着编译一个包含要检查的字符串的小示例程序。

这样你就可以通过真正的C编译器检查你的代码片段。这将比尝试在Python程序中实现所有C语法分析和检查要容易得多并且更可靠。

+0

有没有办法从python脚本以编程方式完成这项工作? –

+1

@NicoSchlömer:当然,使用'import subprocess'并调用'gcc'。 – pts

+1

@NicoSchlömer:['subprocess'](https://docs.python.org/2/library/subprocess.html)模块可让您启动外部程序(如C编译器),并检查其退出状态。 – sth

1

用数字常量替换所有出现的已知变量。在你的代码中,这将是x[0],x[1]x[2]。请注意,在C中允许使用很多中间空格,即使是内部变量:x [ 1 ]也是有效的。 (另外:x[01]是有效x[0x01]是有效如果阵列是大于8组的元素:。x[010]是有效的,实际上是x[8]1[x]是有效的并且是等于x[1]。)

数值常数必须本身是有效的,并且优选地不等于0。 (只是为了防止解析器声明1/x[0]无效!)

替换时,在常量之前和之后插入一个空格。这是为了防止将x[1]2更改为12。不要使用括号!与那些,sin x[1]是无效的,但它的替代,sin(1),是。

由此,输入字符串

x[0]*x[0] + x[1] + 1 

被翻译成

1 * 1 + 1 + 1 

其可与常规的程序进行验证;例如参见Safe expression parser in Python;或者,因为您不需要计算但只有验证,请自行编写。