Добавил то, что, вроде как, может быть актуальным при сопоставлении шаблона и текста: подстановку одного паттерна в другой. Например, нужно часто подставлять шаблон синонимов персоны в какой-то другой шаблон. Допустим, шаблон персоны такой: (Иванов | Ивонов| Ivanov | Ivonov | #Ivanov | #Ivonov)
И есть другие шаблоны, в которых шаблон для этой персоны нужно использовать. Например, что-то типа этого: (победитель | победил | (одержал /2 победу) | выиграл) /3 (соревнования | кубок | состязание) /5 (Иванов | Ивонов| Ivanov | Ivonov | #Ivanov | #Ivonov)
Вместо блока синонимов можно использовать {иванов}, предварительно дав такое название первому шаблону. В итоге запрос будет таким:
(победитель | победил | (одержал /2 победу) | выиграл) /3 (соревнования | кубок | состязание) /5 {иванов}
Подставляемых шаблонов может быть сколько угодно. Тестов для этого функционала пока мало делал — но пока что, кажись, работает. Пока не делал проверки валидности для фигурных скобок. Например, их закрытия и допустимых символов наименования шаблона и пр.
Для того чтобы использовать шаблоны в шаблонах в конструктор контекста опциональным аргументом добавляется словарь с ключом — именем шаблона и связанным списком терминалов и нетерминалов (не преобразованным в обратную польскую нотацию) из другого объекта контекста — значением.
Dictionary<string, LinkedList<Expression>> extras = null