C # строка справки? - PullRequest
       3

C # строка справки?

1 голос
/ 11 октября 2011

У меня есть функция в C #, которая находит имя функции в исходном файле, например

function void MyFunc

Я пытаюсь создать подстроку, которая начинается после "void", и мне нужно найти длину имени функции. После имени функции всегда будет пробел или символ новой строки.

module MyApplication
[EntryPoint]
function void main
write("a string")
endfunction
endmodule

Ответы [ 4 ]

1 голос
/ 11 октября 2011

Я предполагаю, что имя функции может содержать другие элементы, например список параметров.

Что вы хотите сделать, так это найти слово «void», пройти мимо него, найти первый непробельный символ (который является началом имени функции), а затем перейти к следующему пробелу или концу строки .

Вы можете использовать:

const string LookFor = "void "; // note space at end.

string GetFunctionName(string line)
{
    int voidPos = line.IndexOf(LookFor);
    if (voidPos == -1)
        return null;
    int functionStart = voidPos + LookFor.Length;
    int spacePos = line.IndexOf(' ', functionStart);
    if (spacePos == -1)
        spacePos = line.Length;
    return line.Substring(functionStart, spacePos - functionStart);
}
1 голос
/ 11 октября 2011

Вы можете использовать LastIndexOf, чтобы найти последний пробел, и взять часть следующей строки, чтобы получить имя функции.Затем используйте свойство Length, чтобы получить длину кода:

var s = "function void MyFunc "; // example string
var s2 = s.Trim(); // remove any extra spaces at the end
var funcName = s2.Substring(s2.LastIndexOf(' ') + 1); // 'MyFunc'
var length = funcName.Length; // 6

Демо: http://www.ideone.com/64IYz

0 голосов
/ 12 октября 2011

Sprache может сделать это, но вам нужно написать грамматику для всего файла, так как он не реализует «поиск» соответствия.

Что-то в этом духе будет анализировать только объявление функции - как отмечалось выше, чтобы ваш сценарий работал, вам нужно добавить правила для модулей и т. Д.

var identifier = (from first in Parse.Letter
                  from rest in Parse.LetterOrDigit.Many().Text()
                  select first + rest).Token();

var returnType = Parse.String("void").Or(Parse.String("int")).Token();
var functionKeyword = Parse.String("function").Token();
var endFunctionKeyword = Parse.String("endfunction").Token();

var function = from fk in functionKeyword
               from rt in returnType
               from functionName in identifier
               from body in Parse.AnyChar.Until(endFunctionKeyword)
               select functionName;

var name = function.Parse("function void main write(\"a string\") endfunction");

Переменная name выше будет содержать строку "main" (если я не сделал несколько опечаток:))

Sprache немного мощнее регулярных выражений, но не требует специальной обработки во время сборки. Есть несколько учебных пособий по этому подходу, связанных с домашней страницей Sprache.

0 голосов
/ 11 октября 2011

Это «плач за использование регулярных выражений».Попробуйте это:

Regex regex = new Regex("(function void ){1,1}(?<functionName>^\w*)");
...