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.