Разбор аргументов в многострочном C -функциях - PullRequest
0 голосов
/ 05 мая 2020

У меня есть несколько примеров первой строки реализации 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) {

Есть ли какие-нибудь RegEx, которые я могу использовать в C# для извлечения имени функции, типа возвращаемого значения и, что более важно, аргументов?

РЕДАКТИРОВАТЬ: я разрабатываю в C# и мне нужно проанализировать C файлы исходного кода, создав такие объекты, как Fun c, которые имеют имя строки, строку ReturnType, список с объектом Arg, имеющим строку argType, и строку argName

РЕДАКТИРОВАТЬ 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

и мне нужно имя функции и аргументы ...

1 Ответ

0 голосов
/ 05 мая 2020

Попробуйте следующее:

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();
        }
    }
}
...