【问题标题】:Parsing arguments in multi-line C-Functions在多行 C 函数中解析参数
【发布时间】:2020-08-19 14:11:06
【问题描述】:

我有几个需要从中提取参数的 C 函数的第一行实现示例。例如:

double FuncName1(char *testnum, char *hipin_source, char *hipin_sense,
                    char *lopin_source, char *lopin_sense, DMM_ResRange range, float delay) {

double FuncName2(char *testnum, char *hipin, char *lopin, DMM_ResRange range, float delay, bool offset) {

有没有我可以在 C# 中使用的 RegEx 来提取函数名、返回类型,但更重要的是参数?

编辑: 我正在使用 C# 进行开发,需要解析 C 源代码文件,创建对象,例如具有字符串名称、字符串 ReturnType、具有字符串 argType 和字符串 argName 的 Arg 对象的 Func 对象

编辑 2: 好吧,我终于尝试了,但它不起作用...可能是我没有正确定义这些...我正在尝试解析一个函数调用,该函数调用的编码如下:

     DCPS_Apply(1,    // Module (optional comment)
           5.0,  // Voltage (optional comment)
           2.0); // Current (optional comment)

或者像这样:

     DCPS_Apply(1, 5.0, 2.0); // optional comment

我需要函数名和参数...

【问题讨论】:

  • “从中提取参数”是什么意思?您是否将C 转换为C#?还有,RegEx 跟这个有什么关系?
  • 这听起来很像 XY 问题。你为什么要这些数据?你为什么要研究源代码?为什么要解决 C#/.NET 中原生 C++ 代码的问题?
  • 你是什么意思,提取参数?类型、名称或只是声明字符串?您很可能无法使用正则表达式来做到这一点。
  • 通常解析 C 函数定义并非易事,因此除非您严格限制输入(仅限于 C 实际允许的一小部分),否则不太可能使用正则表达式解决方案。
  • @MemReflect 我认为这必然是不可能的,因为函数指向函数的指针指向函数的指针......意味着你必须平衡嵌套括号,这是众所周知的仅使用正则表达式是不可能的。

标签: c# c regex parsing


【解决方案1】:

尝试以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input =
                @"double FuncName1(char *testnum, char *hipin_source, char *hipin_sense,
                    char *lopin_source, char *lopin_sense, DMM_ResRange range, float delay) { }
                  double FuncName2(char *testnum, char *hipin, char *lopin, DMM_ResRange range, float delay, bool offset) { }
                ";

            string pattern1 = @"(?'type'\w+)\s+(?'name'[^(]+)\((?'parameters'[^)]+)\)";                    
            string pattern2 = @"(?'key'[^\s]+)\s+(?'value'[*\w]+),?";

            MatchCollection matches1 = Regex.Matches(input, pattern1);

            foreach (Match match1 in matches1.Cast<Match>())
            {
                string parameters = match1.Groups["parameters"].Value;
                MatchCollection matches2 = Regex.Matches(parameters, pattern2);
                string[] key_value = matches2.Cast<Match>().Select((x, i) => string.Format("Key[{0}] : '{1}', Value[{0}] : '{2}'", i, x.Groups["key"].Value, x.Groups["value"].Value)).ToArray();
                Console.WriteLine("Type : '{0}', Name : '{1}', Parameters : '{2}'", match1.Groups["type"].Value, match1.Groups["name"].Value, string.Join(";", key_value));
            }
            Console.ReadLine();
        }
    }
}

【讨论】:

  • 谢谢,我会尽快尝试。我的正则表达式技能充其量是原始的......
  • 好吧,我终于试过了,但它不起作用......可能是我没有正确定义这些......我正在尝试解析一个函数调用,它的编码如下:
  • 您查看我输入的结果了吗?第一场比赛你有结果吗?
  • 发布的代码将在控制台上产生输出。如果你没有得到任何输出,那么程序没有运行或者控制台有问题。确保编译器没有给出任何错误。在第一条指令上放置一个断点(F11)并确保代码正在运行。
  • 我创建了一个简单的应用程序并将此代码放在那里 - 它根本不会产生任何结果 - forach 循环没有处理任何内容,因为没有匹配项: DCPS_Apply(1, // Module (optional评论)5.0,//电压(可选评论)2.0); // 当前(可选注释)
猜你喜欢
  • 2021-07-27
  • 2013-03-07
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多