Обновление ParserGenerator'а
От: WolfHound  
Дата: 27.12.11 18:10
Оценка: 265 (9)
1)Из-за того что правило кто длиннее тот и прав в некоторых случаях вело себя весьма странно сделал новое правило выбора победившего правила если несколько правил сумели распарить код.
Теперь парсер ведет себя очень интуитивно.

2)Сделал загрузку грамматик.
Пока работает только загрузка грамматик объявленных в одной сборке. Но это я сейчас поправлю.
Вот как это сейчас выглядит.
https://github.com/rampelstinskin/ParserGenerator/blob/0fe9a5b2493a03731e824e2c378dea736cefe3a2/Test/Main.n
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Обновление ParserGenerator'а
От: WolfHound  
Дата: 27.12.11 23:35
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Пока работает только загрузка грамматик объявленных в одной сборке. Но это я сейчас поправлю.

Поправил.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Обновление ParserGenerator'а
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.12.11 22:25
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>1)Из-за того что правило кто длиннее тот и прав в некоторых случаях вело себя весьма странно сделал новое правило выбора победившего правила если несколько правил сумели распарить код.


Неплохо бы описать это окружающим.

WH>2)Сделал загрузку грамматик.


Что с обработкой ошибок?

Что с оптимизациями?

Насколько это дело протестировано? Можно пробовать соорудить парсер немерла?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Обновление ParserGenerator'а
От: WolfHound  
Дата: 28.12.11 23:05
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Неплохо бы описать это окружающим.

Победившее правило определяется на основе поэлементного сравнения последовательностей верхнего уровня.
Победившим считается то правило, которое на очередном шаге продвинулось дальше.

Например:
раньше вот эти два правила
    neg is expr = '-'s expr : 100;
    prefixDec is expr = "--"s expr : 200;

на таком тексте
--1
конфликтовали. Ибо съедали одно и то же количество текста.
И в зависимости от фазы луны дерево разбора получалось таким
(-(-(1))) или таким (--(1))
Сейчас будет выбран второй вариант.
ибо -- съедает текста больше чем —

Еще интереснее получалось с текстом типа:
1---1
сейчас оно разбирается так ((1)--)-(1)). Таким же образом ведут себя и все остальные языки.
Раньше оно разбиралось вот так
((1)-(--(1))) или так ((1)-(-(-(1))))
Это происходило по тому, что бинарный — съедал больше текста чем --.
Но и это не самое веселое поведение старой схемы.
Вот такой код 1-1---1 разбирался так (((1)-((1)--))-1).
А все по тому, что бинарный — лево-ассоциативен и при переборе постфиксных правил для второй 1 не использовался.

В результате парсер начал вести себя близко к тому, как человек разбирает текст.

VD>Что с обработкой ошибок?

Я сейчас как раз над этим думаю.
Там не все так просто.

VD>Что с оптимизациями?

Это просто. Но я буду делать потом.
Чтобы оптимизации под ногами не путались, когда я буду делать основную логику.
А как ее делать я пока не до конца придумал.

VD>Насколько это дело протестировано?

Арифметические выражения разбирает.
Грамматики подгружает.
Думаю немерле тоже разберет.
Но если что я на связи.

VD>Можно пробовать соорудить парсер немерла?

Ломающие изменения все еще запланированы.
В частности нужно уйти от чисилок при задании силы связывания.
Но попробовать можно. Исправление ошибок вызванных изменениями будет весьма прямолинейным.
Заодно будет, на чем протестировать логику обработки ошибок.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Обновление ParserGenerator'а
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.12.11 00:52
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>В результате парсер начал вести себя близко к тому, как человек разбирает текст.


Что значит "близко". Все же есть не состыковки?

VD>>Что с обработкой ошибок?

WH>Я сейчас как раз над этим думаю.
WH>Там не все так просто.

Что за проблемы?

VD>>Что с оптимизациями?

WH>Это просто. Но я буду делать потом.

Я поглядел код и не очень понравилось, что постоянно в цикле вызываются:
curOffsets.Clear();
и
bestOffsets.CopyFrom(curOffsets);

WH>Грамматики подгружает.


Вот по эту поводу нужны пояснения. В тесте в основной грамматике CalcParser есть два импорта:
    using IncParser;
    using NumParser;

В зависимой грамматике IncParser есть импорт:
    using CalcParser;

Зачем импорты в основной грамматике? Ведь получается рекурсивный импорт.

Такое ощущение что ты делаешь не то, что нужно. Нам нужно иметь возможность расширять основную грамматику динамически.
Чтобы спарсив директиву using у нас подгружались новые правила. Не будет с этим проблем?

В общем, хотелось бы деталей.

VD>>Можно пробовать соорудить парсер немерла?

WH>Ломающие изменения все еще запланированы.
WH>В частности нужно уйти от чисилок при задании силы связывания.
WH>Но попробовать можно. Исправление ошибок вызванных изменениями будет весьма прямолинейным.
WH>Заодно будет, на чем протестировать логику обработки ошибок.

ОК, после нового года займемся этим.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Обновление ParserGenerator'а
От: WolfHound  
Дата: 29.12.11 01:25
Оценка:
Здравствуйте, VladD2, Вы писали:

WH>>В результате парсер начал вести себя близко к тому, как человек разбирает текст.

VD>Что значит "близко". Все же есть не состыковки?
Я пока не нашёл. А близко по тому, что хрен его знает как на самом деле человек текст парсит. Да и все ли его одинаково парсят?

WH>>Я сейчас как раз над этим думаю.

WH>>Там не все так просто.
VD>Что за проблемы?
Что делать с ошибками при удалении грамматики не ясно.
Лучшее место для хранения MaxRollbackPos это само правило.
Но правила удаляются вместе с грамматикой.
А при раскрутке стека все добавленные using'ом грамматики удалятся.

VD>Я поглядел код и не очень понравилось, что постоянно в цикле вызываются:

Потом подумаю, что с этим делать.
В любом случае я не стану откатываться на приоритетный выбор или кто длиннее то и прав. Они неадекватны.

VD>Зачем импорты в основной грамматике? Ведь получается рекурсивный импорт.

Я тестировал рекурсивный импорт.
Это может быть полезно, если человек одну грамматику на несколько частей разбить хочет.

VD>Такое ощущение что ты делаешь не то, что нужно. Нам нужно иметь возможность расширять основную грамматику динамически.

VD>Чтобы спарсив директиву using у нас подгружались новые правила. Не будет с этим проблем?
Это все есть.
Сейчас внутри правила должен работать вот такой хак (не проверял):
(this :> Grammar).Parser.AddGrammar(CalcParser.Grammar.StaticDescriptor)

Как сделать человеческий интерфейс я подумаю завтра.
Ну и ты подумай.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Обновление ParserGenerator'а
От: Аноним  
Дата: 29.12.11 06:41
Оценка: +1 -1
Здравствуйте, WolfHound, Вы писали:

WH>Еще интереснее получалось с текстом типа:

WH>1---1

Излишнее цитирование удалено.

Не сочти меня идиотом, но такое выражение вообще не должно разбираться!!!!!!!
--- это один оператор, а значит должен искаться именно он, а не пытаться интерпретировать его иначе будет куча непонятных ошибок!
Re[4]: Обновление ParserGenerator'а
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 29.12.11 06:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не сочти меня идиотом, но такое выражение вообще не должно разбираться!!!!!!!

А>--- это один оператор, а значит должен искаться именно он, а не пытаться интерпретировать его иначе будет куча непонятных ошибок!

2*-1 тоже не должно разбираться?
Ce n'est que pour vous dire ce que je vous dis.
Re[5]: Обновление ParserGenerator'а
От: Аноним  
Дата: 29.12.11 06:46
Оценка: +1
Здравствуйте, Don Reba, Вы писали:

DR>Здравствуйте, Аноним, Вы писали:


А>>Не сочти меня идиотом, но такое выражение вообще не должно разбираться!!!!!!!

А>>--- это один оператор, а значит должен искаться именно он, а не пытаться интерпретировать его иначе будет куча непонятных ошибок!

DR>2*-1 тоже не должно разбираться?


2*(-1)
Re[6]: Обновление ParserGenerator'а
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 29.12.11 06:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>2*(-1)


Если парсер не сможет разбирать подобные выражения без скобок, то будет непригоден для подавляющего большинства существующих языков, в том числе Немерле и C#.
Ce n'est que pour vous dire ce que je vous dis.
Re[7]: Обновление ParserGenerator'а
От: Аноним  
Дата: 29.12.11 07:40
Оценка: +1
Здравствуйте, Don Reba, Вы писали:

DR>Здравствуйте, Аноним, Вы писали:


А>>2*(-1)


DR>Если парсер не сможет разбирать подобные выражения без скобок, то будет непригоден для подавляющего большинства существующих языков, в том числе Немерле и C#.


Иметь не предсказуемую компиляцию лучше?
Re[8]: Обновление ParserGenerator'а
От: para  
Дата: 29.12.11 07:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Иметь не предсказуемую компиляцию лучше?

в том и смысл, что предсказуемую. Открой C# и попробуй!
var a = 4;
var b = 8;
var c = a---b;
Console.WriteLine(c);

ПРЕДСКАЗУЕМО!
хотя конечно плохой стиль...
Re[9]: Обновление ParserGenerator'а
От: Аноним  
Дата: 29.12.11 07:56
Оценка:
Здравствуйте, para, Вы писали:

P>Здравствуйте, Аноним, Вы писали:


А>>Иметь не предсказуемую компиляцию лучше?

P>в том и смысл, что предсказуемую. Открой C# и попробуй!
P>
P>var a = 4;
P>var b = 8;
P>var c = a---b;
P>Console.WriteLine(c);
P>

P>ПРЕДСКАЗУЕМО!
P>хотя конечно плохой стиль...

Это в с# где нет макосов
Re[5]: Обновление ParserGenerator'а
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.12.11 08:47
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Что делать с ошибками при удалении грамматики не ясно.

WH>Лучшее место для хранения MaxRollbackPos это само правило.

Ну, и помещай куда-то в парсер ссылку на самое правило.
MaxRollbackPos и соответствующее ему правило должно накапливаться по мере продвижения по строке.

WH>Но правила удаляются вместе с грамматикой.

WH>А при раскрутке стека все добавленные using'ом грамматики удалятся.

Дык запоминай самые длинно продвинувшиеся.

VD>>Я поглядел код и не очень понравилось, что постоянно в цикле вызываются:

WH>Потом подумаю, что с этим делать.
WH>В любом случае я не стану откатываться на приоритетный выбор или кто длиннее то и прав. Они неадекватны.

Я обратил твое внимание на потенциальную проблему производительности. С ней явно надо что-то делать.

WH>Сейчас внутри правила должен работать вот такой хак (не проверял):

WH>
WH>(this :> Grammar).Parser.AddGrammar(CalcParser.Grammar.StaticDescriptor)
WH>


А где и как брать этот CalcParser.Grammar.StaticDescriptor?

WH>Как сделать человеческий интерфейс я подумаю завтра.

WH>Ну и ты подумай.

Чтобы думать надо сначала узнать детали всего этого процесса. Опиши по подробнее что и как. Как взять правило от парсера? И т.п.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Обновление ParserGenerator'а
От: _Claus_  
Дата: 29.12.11 11:22
Оценка: -1
WH>В результате парсер начал вести себя близко к тому, как человек разбирает текст.
возможно получить альтернативные, менее приоритетные варианты разбора синтактико-лексического дерева?
напр. может не устроить приоритетный по соображениям контекста, и нужно запросить следующий, проверить, следующий, ..
это было бы именно как разбирает человек.
Re[4]: Обновление ParserGenerator'а
От: WolfHound  
Дата: 29.12.11 12:51
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Не сочти меня идиотом, но такое выражение вообще не должно разбираться!!!!!!!

А>--- это один оператор, а значит должен искаться именно он, а не пытаться интерпретировать его иначе будет куча непонятных ошибок!
Так работают чуть менее чем все языки программирования.
Без этих наворотов не разобрать C#, Java,... и многое другое.
Так что нужно соответствовать.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: Обновление ParserGenerator'а
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.12.11 16:18
Оценка:
Здравствуйте, Аноним, Вы писали:

Блин, и ведь не забанить за оверквоитнг.

Уважаемый аноинма. Будьте так добры цитировать только то что нужно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Обновление ParserGenerator'а
От: WolfHound  
Дата: 29.12.11 17:22
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я обратил твое внимание на потенциальную проблему производительности. С ней явно надо что-то делать.

Я обратил на нее внимание, когда писал этот код. И тоже подумал, что с ней надо что-то делать.

VD>А где и как брать этот CalcParser.Grammar.StaticDescriptor?

CalcParser это тот класс, на который вешается макрос.
Grammar это вложенный класс, в который набивается чуть менее чем весь генерируемый код.
StaticDescriptor это статическое свойство возвращающее GrammarDescriptor.
Объекты типа GrammarDescriptor умеют создавать объекты грамматики и содержат описание самой грамматики.

VD>Чтобы думать надо сначала узнать детали всего этого процесса. Опиши по подробнее что и как. Как взять правило от парсера? И т.п.

Парсеру можно сказать:
PushState() : void — Запоминает набор грамматик.
PopState() : void — Откатывает набор грамматик к предыдущему состоянию.
AddGrammar(descriptor : GrammarDescriptor) : void — Добавляет новую грамматику в парсер.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[5]: Обновление ParserGenerator'а
От: VoidEx  
Дата: 29.12.11 17:40
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, <Аноним>, Вы писали:


WH>Так работают чуть менее чем все языки программирования.

WH>Без этих наворотов не разобрать C#, Java,... и многое другое.
WH>Так что нужно соответствовать.

Это должно быть явно указано в грамматике, если язык позволяет такое скотство, но делать это дефолтом?
Хотя с учётом некоей близости C# и Nemerle это, возможно, оправдано.
Re[6]: Обновление ParserGenerator'а
От: WolfHound  
Дата: 29.12.11 18:19
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Это должно быть явно указано в грамматике, если язык позволяет такое скотство, но делать это дефолтом?

Это поведение чуть менее чем всех языков. И всех известных мне генераторов парсеров.

VE>Хотя с учётом некоей близости C# и Nemerle это, возможно, оправдано.

Вот немерле как раз ведет себя иначе. Он любую последовательность операторных символов считает одним оператором.
Из-за этого тут даже флейм был.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.