使用C#验证C#语法

4

我正在寻找一个函数(可能在.Net框架中有这样一个函数),可以用它来验证C#语法。它也可以是一个带有内置验证的C#解析器。

背景:我正在构建一个小型代码生成器,用户可以输入一些定义,并获得完全实现的属性等,但我想检查用户是否输入了正确的C#代码,并且结果也是正确的。

编辑:

我不想编译代码,而且它可能是不完整的代码。例如,用户可以输入一个带有他的代码中的类的代码片段,我不知道,而且我只想验证语法,而不是“内容”。

示例

输入:

Car car = new Car();
car.drive("50");

输出:

Same as input, because it's valid and nothing to do.

输入:

Car car = new Car()
car.drive("50");

输出:

Message that it is not valid, beause of missing ';'

等等,我不认识 Car 这个类,所以无法编译它,我只是想检查语法。


是的,我知道,但我想从正在运行的 C# 程序中检查语法(代码只在一个文本框中),而且它不会被我的程序编译。 - Tokk
1
如果你不知道完整的代码,那么你怎么可能事先知道它是否有效呢?(你不能)如果不知道Car是类型、命名空间、变量标识符、类型参数等,就无法完全验证语法。片段可能是有效的或无效的(从语法上讲)。那么你所说的“验证”是什么意思呢? - Kieren Johnstone
我只是指类似于缺少“;”、“(|)”等的情况。 - Tokk
在这个例子中:int myTest = hello; 可能是有效的也可能是无效的。 hello 可以是一个方法(所以你错过了 ()),或者它可以是一个变量(在这种情况下,没有错误)。因此,如果不知道具体情况,就不能验证语法的正确性。 - Kieren Johnstone
在这种情况下,我可以发出警告。 - Tokk
显示剩余5条评论
3个回答

4
如何使用C#编译器编写程序代码: http://support.microsoft.com/kb/304655 在编译过程中,它会进行验证。您可以像这样获取错误列表(来自文章...令人惊讶,因为它有点凌乱):
foreach(CompilerError CompErr in results.Errors)
{
 textBox2.Text = textBox2.Text +
     "Line number " + CompErr.Line + 
     ", Error Number: " + CompErr.ErrorNumber + 
     ", '" + CompErr.ErrorText + ";" + 
     Environment.NewLine + Environment.NewLine;
}

2
请查看这个 .Net 类:http://msdn.microsoft.com/en-us/library/system.codedom.compiler.codedomprovider.aspx
基本上,您可以对正在查看的代码调用编译器,并收到生成的任何错误消息。
编辑:如果代码无法编译,那没关系,您可以查看返回的错误消息并忽略诸如“未定义”的错误之类的内容。
我认为你唯一的选择就是编写与 C# 语言规范匹配的正则表达式。

只是一条评论,我希望这样的正则表达式应该有几千字节长,并且不能完全/正确验证 :) - Kieren Johnstone

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接