Здравствуйте, pekabon, Вы писали:
P>А подскажите, плз, как написать правило для парсинга subj?
Никак.
Вот с этим проблема.
followed by the same number of U+0023 (#) characters
В данный момент нет способа сделать зависимый от контекста парсинг.
В принципе это можно сделать. Но нужно перетряхнуть весь парсер.
В качестве временной заплатки можно довольно просто сделать ручной разбор токенов вот с таким интерфейсом:
ParseMyToken(text : string, startPos : int) : int
{
//ручной разбор токена
//возвращаемое значение
//в случае успешного разбора позиция следующего за токеном символа
//в случае не успешного ~(позиция облома)
}
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>В данный момент нет способа сделать зависимый от контекста парсинг. WH>В принципе это можно сделать. Но нужно перетряхнуть весь парсер.
жаль, выходит плюсы тоже не попарсим.
WH>В качестве временной заплатки можно довольно просто сделать ручной разбор токенов вот с таким интерфейсом:
Было бы здорово, даже не в качестве временной заплатки, а в качестве фолбека. Все равно абсолютно все кейсы вряд ли удастся по крыть.
В antlr такая возможность есть, вроде бы.
Здравствуйте, WolfHound, Вы писали:
WH>В качестве временной заплатки можно довольно просто сделать ручной разбор токенов вот с таким интерфейсом: WH>
WH>ParseMyToken(text : string, startPos : int) : int
WH>{
WH>//ручной разбор токена
WH>//возвращаемое значение
WH>//в случае успешного разбора позиция следующего за токеном символа
WH>//в случае не успешного ~(позиция облома)
WH>}
WH>
И как это будет помогать обрабатывать контекстные данные в условиях откатного парсера с мемоизацией?
Чтобы решить проблему в корне (а за одно и кучу других, например, парсинг отступных грамматик) нужно реализовывать параметризованные правила и сематические предикаты. Это не быстрая песня и по уму ею нужно заниматься WolfHound-у.
Но для практического применения будет достаточно описать 5-10 правил парсящих литералы с заданной длинной последовательностей '#':
syntax RawStringLiteral1 = Open (!Close Any)* Close
{
regex Sharps = "#";
regex Open = "r" Sharps '\"';
regex Close = '\"' Sharps;
}
syntax RawStringLiteral2 = Open (!Close Any)* Close
{
regex Sharps = "##";
regex Open = "r" Sharps '\"';
regex Close = '\"' Sharps;
}
syntax RawStringLiteral3 = Open (!Close Any)* Close
{
regex Sharps = "###";
regex Open = "r" Sharps '\"';
regex Close = '\"' Sharps;
}
// ... размножаем нужное количество раз
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Но для практического применения будет достаточно описать 5-10 правил парсящих литералы с заданной длинной последовательностей '#':
Здравствуйте, pekabon, Вы писали:
P>жаль, выходит плюсы тоже не попарсим.
Почему?
Я не помню такие правила в плюсах.
P>Было бы здорово, даже не в качестве временной заплатки, а в качестве фолбека. Все равно абсолютно все кейсы вряд ли удастся по крыть.
Может быть.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, VladD2, Вы писали:
VD>И как это будет помогать обрабатывать контекстные данные в условиях откатного парсера с мемоизацией?
Примерно так же как регексы.
VD>Надо аналог вот этого реализовывать.
Ещё раз. Это всё я придумал за долго до того, как ты показал мне эту статью.
Малой кровью это не сделать. Нужно переписать весь парсер.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Я не помню такие правила в плюсах.
В 11-ом появились.
P>>Было бы здорово, даже не в качестве временной заплатки, а в качестве фолбека. Все равно абсолютно все кейсы вряд ли удастся по крыть. WH>Может быть.
Это надо в откаты и мемоизацию встраивать. А это уже не сильно сложнее нежели нормальные параметризованные правила с семантическими предикатами. Думаю, если ограничиться доступом к литералам это не сложно будет реализовать. За одно сможем отступные грамматики парсить.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, WolfHound, Вы писали:
VD>>И как это будет помогать обрабатывать контекстные данные в условиях откатного парсера с мемоизацией? WH>Примерно так же как регексы.
Не прокатит. Это нужно в syntax-правилах. Там суть в том, что нужно прочесть длину спарсившихся '#' у первого подправила и указать ее в качестве аргумента второму.
Ну, предположим ты сделал рукопашный парсинг "регекса". ОК. Но ведь надо из одного такого рукопашного взять информацию о числе спарсившихся '#' и передать во второй. А это нужно делать в рамках syntax-руля.
WH>Малой кровью это не сделать. Нужно переписать весь парсер.
Я не понимаю причин этого. Нам нужно:
1. Передавать в правила параметры (в том числе out).
2. Запоминать значения out-параметров внутри мемоизации.
3. Реализовать предикаты которые будут действовать по raw-AST-у (а не по синтаксису).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Не прокатит.
Прокатит. Просто нужно весь литерал отпарсить руками.
WH>>Малой кровью это не сделать. Нужно переписать весь парсер. VD>Я не понимаю причин этого. Нам нужно: VD>1. Передавать в правила параметры (в том числе out). VD>2. Запоминать значения out-параметров внутри мемоизации. VD>3. Реализовать предикаты которые будут действовать по raw-AST-у (а не по синтаксису).
Вот тут вылезает куча деталей реализации плюс куча плясок вокруг восстановления после ошибок.
Это всё только звучит просто. А на практике куча работы.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, pekabon, Вы писали:
P>>Спасибо за совет, пока так и сделаем
VD>Если не секрет, чем занимавшийся? Решил сделать поддержку Rust-а?
Да, решили изучить пару новых для себя технологий на примере поддержки rust