Peg парсер и базовые типы
От: CodingUnit Россия  
Дата: 10.09.11 10:25
Оценка:
Работаю с пег парсером не нравится одна вещь, если пишу обработчик для правила который имеет базовый тип например Base, который ссылается на другие правила например так: ruleA / ruleB / ruleC;
и если правило ruleB имеет тип наследника Base.B то получается ошибка, хотя часто нужно именно неявно привести наследника к родителю, то есть чтобы этот код не давал ошибки. Чтобы обойти приходится писать дополнительные обработчики которые тупо приводят наследника к родителю, может это сделать автоматом?

ruleB : Base.B = "правило";
rules : Base = ruleA / ruleB / ruleC;
Re: Peg парсер и базовые типы
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.09.11 12:06
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Работаю с пег парсером не нравится одна вещь, если пишу обработчик для правила который имеет базовый тип например Base, который ссылается на другие правила например так: ruleA / ruleB / ruleC;

CU>и если правило ruleB имеет тип наследника Base.B то получается ошибка, хотя часто нужно именно неявно привести наследника к родителю, то есть чтобы этот код не давал ошибки. Чтобы обойти приходится писать дополнительные обработчики которые тупо приводят наследника к родителю, может это сделать автоматом?

CU>ruleB : Base.B = "правило";

CU>rules : Base = ruleA / ruleB / ruleC;

Заводи фичрреквес на гитхабе. Постараемся сделать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Peg парсер и базовые типы
От: CodingUnit Россия  
Дата: 10.09.11 13:10
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Заводи фичрреквес на гитхабе. Постараемся сделать.


Я сделал обычную issue, feature request не знаю как делать.
Re[3]: Peg парсер и базовые типы
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.09.11 15:12
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Я сделал обычную issue, feature request не знаю как делать.


Это обычный issue и есть. Просто пометить его атрибутами feature.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Peg парсер и базовые типы
От: CodingUnit Россия  
Дата: 10.09.11 15:58
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, CodingUnit, Вы писали:


CU>>Я сделал обычную issue, feature request не знаю как делать.


VD>Это обычный issue и есть. Просто пометить его атрибутами feature.


Че то я облазил все не вижу как можно пометить issue аттрибутом.
Re[5]: Peg парсер и базовые типы
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.09.11 16:12
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Че то я облазил все не вижу как можно пометить issue аттрибутом.


Забей. Сам поставлю.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Peg парсер и базовые типы
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.09.11 17:48
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Работаю с пег парсером не нравится одна вещь, если пишу обработчик для правила который имеет базовый тип например Base, который ссылается на другие правила например так: ruleA / ruleB / ruleC;

CU>и если правило ruleB имеет тип наследника Base.B то получается ошибка, хотя часто нужно именно неявно привести наследника к родителю, то есть чтобы этот код не давал ошибки.

CU>ruleB : Base.B = "правило";

CU>rules : Base = ruleA / ruleB / ruleC;

Посмотрел код... Ничего не получится. Значения для правил возвращаются через ref-параметр. А для них параметр должен иметь конкретный тип.

CU>Чтобы обойти приходится писать дополнительные обработчики которые тупо приводят наследника к родителю, может это сделать автоматом?


Проще делать так:
[PegGrammar(Options = EmitDebugSources, start,
  grammar
  {
    space               = ' ' / '\t';
    [InlineAllSubrules]
    s : void = space*;
    Digit : A           = ['0'..'9']+ s;
    Leter : A           = ['A'..'Z', 'a'..'z']+ s;
    DigitOrLeter : A    = Leter / Digit;
    start : List[A]     = s DigitOrLeter+ s;
  }
)]
public class JsonParser
{
  Digit(token : NToken) : A { A(GetText(token)) }
  Leter(token : NToken) : A { B(GetText(token)) }
}
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Peg парсер и базовые типы
От: WolfHound  
Дата: 10.09.11 20:01
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Посмотрел код... Ничего не получится. Значения для правил возвращаются через ref-параметр. А для них параметр должен иметь конкретный тип.

Это обойти просто.
Меняешь такой код:
<[ $(_grammarCompiller.DecorateRuleName(rule.name.Id) : dyn)(pos, text, ref $(result : dyn)) ]>

на такой:
<[
    {
        mutable tmpResult;
        $(_grammarCompiller.DecorateRuleName(rule.name.Id) : dyn)(pos, text, ref tmpResult);
        $(result : dyn) = tmpResult;
    }
]>
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Peg парсер и базовые типы
От: CodingUnit Россия  
Дата: 11.09.11 08:11
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Посмотрел код... Ничего не получится. Значения для правил возвращаются через ref-параметр. А для них параметр должен иметь конкретный тип.


наверное действительно надо чтобы он сначала выдал тот тип что нужен в ref параметре а потом его привести, у этой задачи должно быть решение, безвыходных ситуаций не бывает, может только для этого потребуется доп информация в дереве что нужно проводить приведение
Re[3]: Peg парсер и базовые типы
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.09.11 11:07
Оценка:
Здравствуйте, WolfHound, Вы писали:

VD>>Посмотрел код... Ничего не получится. Значения для правил возвращаются через ref-параметр. А для них параметр должен иметь конкретный тип.

WH>Это обойти просто.
WH>Меняешь такой код:...

И получаешь дополнительное замедление (копирование и рост стека). Мне кажется оно того не стоит.
По крайней мере нужно заниматься серьезным тестированием производительности, а мне эти заниматься в лом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Peg парсер и базовые типы
От: CodingUnit Россия  
Дата: 12.09.11 01:46
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>И получаешь дополнительное замедление (копирование и рост стека). Мне кажется оно того не стоит.

VD>По крайней мере нужно заниматься серьезным тестированием производительности, а мне эти заниматься в лом.

Какой там рост стека если параметры ссылочные, для них мы делаем поддержку приведения и копирование ссылок тоже всего лишь присвоение адресов.
Re[5]: Peg парсер и базовые типы
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.09.11 15:29
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Какой там рост стека если параметры ссылочные, для них мы делаем поддержку приведения и копирование ссылок тоже всего лишь присвоение адресов.


Во-первых, параметры не обязаны быть ссылочными. Во-вторых, вызовов то море. Так что рост будет не шуточный.

Если только попытаться сделать тонкий анализ и генерировтаь лишнюю переменную только для случаев где есть разные типы в операторах приоритетного выбора. Чтобы мнее производительный код генерировался только для этого случая.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.