Информация об изменениях

Сообщение Re[6]: контекстно-свободная самоописывающаяся грамматика от 16.03.2017 3:16

Изменено 16.03.2017 4:04 Arsen.Shnurkov

Re[6]: контекстно-свободная самоописывающаяся грамматика
К> Какие директивы Include? Это ты про что?

рассмотрим класс Apache2 с двумя статическими методами
class Apache2 {
    public static string LoadConfig (string filename)
    {
       // парсим файл и ищем маски
       // вызываем LoadConfigsByMask()
       // вставляем строки вместо интервалов с директивами
       // возвращаем итоговую строку
    }
    public static string LoadConfigsByMask(string filemask)
    {
       // ищем файлы по маске
       // каждый файл читаем функцией LoadConfig()
       // склеиваем строки
       // результат возвращаем
    }
}


Тут плохо то, что:
1) потом после получения сконкатенированного контента парсить прийдётся ещё раз (по другой грамматике);
2) теряется информация про исходное положение символов в разных файлах (нужно не строки возвращать, а что-то более сложное).

Хотелось бы как-то учитывать результаты первого парсинга во время второго, чтобы повысить эффективность.

Допустим, что изменим прототипы методов, чтобы они возвращали ущлы деревьев:
public static Pair<FileInfo,Node> LoadConfig (string filename)
public static List<Pair<FileInfo,Node>> LoadConfigByMask (string filename)

Но тогда не ясно, что делать с узлами, описывающими директивы Include. Заменять их непосредственно нежелательно (потеряется информация о текстовом представлении директивы Include), значит список надо записывать в атрибут (аттрибутированная грамматика) узла Include.
но тогда, получается, что нужен какой-то дополнительный итератор, который учитывал бы, что могут существовать директивы Include.
Либо можно поступить наоборот — заменить узлы, а информацию об Include переместить в атрибут...

В общем нет ясности как надо делать.
Re[6]: контекстно-свободная самоописывающаяся грамматика
К> Какие директивы Include? Это ты про что?

рассмотрим класс Apache2 с двумя статическими методами
class Apache2 {
    public static string LoadConfig (string filename)
    {
       // парсим файл и ищем маски
       // вызываем LoadConfigsByMask()
       // вставляем строки вместо интервалов с директивами
       // возвращаем итоговую строку
    }
    public static string LoadConfigsByMask(string filemask)
    {
       // ищем файлы по маске
       // каждый файл читаем функцией LoadConfig()
       // склеиваем строки
       // результат возвращаем
    }
}


Тут плохо то, что:
1) потом после получения сконкатенированного контента парсить прийдётся ещё раз (по другой грамматике);
2) теряется информация про исходное положение символов в разных файлах (нужно не строки возвращать, а что-то более сложное).

Хотелось бы как-то учитывать результаты первого парсинга во время второго, чтобы повысить эффективность.

Допустим, что изменим прототипы методов, чтобы они возвращали узлы деревьев:
public static Pair<FileInfo,Node> LoadConfig (string filename)
public static List<Pair<FileInfo,Node>> LoadConfigByMask (string filename)

Но тогда не ясно, что делать с узлами, описывающими директивы Include. Заменять их непосредственно нежелательно (потеряется информация о текстовом представлении директивы Include), значит список надо записывать в атрибут (аттрибутированная грамматика) узла Include.
но тогда, получается, что нужен какой-то дополнительный итератор, который учитывал бы, что могут существовать директивы Include.
Либо можно поступить наоборот — заменить узлы, а информацию об Include переместить в атрибут...

В общем нет ясности как надо делать.