gpt4 book ai didi

c# - 用于分析源代码的正则表达式

转载 作者:太空宇宙 更新时间:2023-11-03 18:48:37 24 4
gpt4 key购买 nike

我有一个有趣的问题。我需要分析源代码并在编译之前确定变量的类型。所以,不能使用反射!

只有五种类型:

double      x = 1.23;
long x = 3;
string s='Hello World!'
bool b=true
object[] A = [1, 1+2, 'Hello', s]

源码示例:

for (i=0; i < 5; i++)
{
a=2;
b=4;
c=6;
tesstClass.Str = 'sss';
}

我决定使用正则表达式来解决这个问题。

首先,我找到所有具有所需变量(带有它的表达式)的代码片段,如下所示:

string pattern = variable + @"[\w.]*\s*[-*+/]?=\s*[\w\s+'*/-]*\s*;";
MatchCollection mc = Regex.Matches(code, pattern);

其次,我使用 5 个正则表达式(每种类型一个)分析每个匹配项:

string stringPattern = @"'[^'\r\n]*'"; //String;
string doublePattern = @"\b[0-9]+\.[0-9]+\b"; //Double
string longPattern = @"[-+]?\b\d+\b"; // Integer with a sign
string boolPattern = @"\b(false|true)\b"; // Boolean
string arrayPattern = @"\[([\w']*\s*,?\s*)*\]"; // Array

我的正则表达式很烂。所以我定义了一组非常简单的 r.表达式。你能帮我提炼一下吗?

最佳答案

这样做的正常方法是获取 AST您的程序,然后简单地搜索您需要的变量声明。建议的语法是生成此类 AST 的好方法。

但是,如果您需要动态分析您的程序,则不能使用此选项,因为您的代码可能存在解析错误。在这种情况下,我感到你的痛苦......

您唯一的选择是解析您的源代码,正则表达式可能会有所帮助。

首先,我将从一个类似于此的正则表达式开始:

(double|long|string|bool|object)\s*(\[\s*\])?\s+(YOUR_VARIABLE_TOKEN)

obs:YOUR_VARIABLE_TOKEN 缺失,因为该变量对于如何为每种语言构建它有严格且明确的规则。

我没有测试这个正则表达式,它肯定不完美。这只是给你一个想法。

其次,您必须使用某些异常情况来验证这些匹配项。例如:

  1. 声明可能在字符串文字中:"bool a;"
  2. 声明可能在注释中:/* bool a; */

此外,这不是一个很奇怪的要求。 Eclipse 在某些情况下也会进行这种评估,例如缩进。

但这不是一件容易的事,特别是找到那些异常情况。祝你好运。

关于c# - 用于分析源代码的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2005751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com