Здравствуйте, ionoy, Вы писали:
I>Почему-то парсит с пробелами в конце. Если подать на вход такой текст:
Пробельные правила ставятся за правилом. Мы думали подправить это поведение и ставить их между правилами, но это не тривиально. Пока что руки не дошли чтобы это реализовать.
I>То в Name запишется "A.B.C "
Ага. Но это не смертельно. Если очень хочется от этого избавиться, можно для этого правила вручную расставить пробелы. Помсмотри как в Шарпе это сделано.
[ExplicitSpaces]
syntax QualifiedIdentifier = QualifiedAlias? (QualifiedIdentifierPart; s "." s)+; // TODO: In C# spec. it's "namespace-or-type-name". Rename it!
[ExplicitSpaces]
syntax QualifiedIdentifierContinuation = (QualifiedIdentifierPart; s "." s)+;
...
ЗЫ
В Нитре поддерживаются циклы с разделителями. Вместо:
(Identifier '.')* Identifier
можно писать
(Identifier; '.')*
ЗЗЫ
Правила Name и Reference должны быть обычными идентификаторами (не квалифицированными)! У тебя там ошибка.
ЗЗЗЫ
Для описания квалифицированного идентификатора лучше использовать не цикл, а рекурсию. Тогда его существенно проще мапить будет. Опиши свой QualifiedIdentifier (что у тебя ошибочно Name называется) так:
Здравствуйте, VladD2, Вы писали:
I>>То в Name запишется "A.B.C "
VD>Ага. Но это не смертельно. Если очень хочется от этого избавиться, можно для этого правила вручную расставить пробелы. Помсмотри как в Шарпе это сделано. VD>
VD>[ExplicitSpaces]
VD>syntax QualifiedIdentifierContinuation = (QualifiedIdentifierPart; s "." s)+;
VD>
Ага, [ExplicitSpaces] помог
VD>В Нитре поддерживаются циклы с разделителями. Вместо: VD>
VD>(Identifier '.')* Identifier
VD>
VD>можно писать VD>
VD>(Identifier; '.')*
VD>
Ага, уже сам в доке нашёл
VD>Правила Name и Reference должны быть обычными идентификаторами (не квалифицированными)! У тебя там ошибка.
Это я решил схалтурить в целях сокращения кода. Но судя по всему на этом завязана вся кухня с типизацией и т.д. Короче придётся всё-таки своё правило делать.
VD>Для описания квалифицированного идентификатора лучше использовать не цикл, а рекурсию. Тогда его существенно проще мапить будет. Опиши свой QualifiedIdentifier (что у тебя ошибочно Name называется) так: VD>
Здравствуйте, ionoy, Вы писали:
I>Ага, [ExplicitSpaces] помог
Только не забудь, что s-ки нужно вручную расставить. Иначе не будет парсить код вроде "A. B".
I>Ага, уже сам в доке нашёл
А вот так:
(Identifier; '.'; ?)*
будет допустима "висячая" точка в конце. Удобно, например, для описания инициализаторов в Шарпе.
I>Это я решил схалтурить в целях сокращения кода. Но судя по всему на этом завязана вся кухня с типизацией и т.д. Короче придётся всё-таки своё правило делать.
Не халтурить тут нельзя. Иначе биндинг работать не будет. А это вручную задолбаешься делать. А Нитра прямо из коробки решение предоставляет.
Да и не сэкономишь особ ничего.
I>Дык этот Name сам мапился, так что меня мало волновали проблемы простых смертых
Он сам памится потому что он простым идентификатором является. Там ясно что мапить. А вот с квалифицированной ссылкой (ту что через точки) так не выйдет. Ее нужно самому будет отмапить. Если описать правило как я показал, то мапинг будет простейшим. Если же использовать циклы, то там придется по приседать (как в нашем C#-примере).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [Nitra] Почему пробелы попадают в IdentifierBody?
Здравствуйте, VladD2, Вы писали:
VD>Для описания квалифицированного идентификатора лучше использовать не цикл, а рекурсию. Тогда его существенно проще мапить будет. Опиши свой QualifiedIdentifier (что у тебя ошибочно Name называется) так:
VD>
Здравствуйте, ionoy, Вы писали:
I>Почему-то не работает. Разбирает только до точки, потом даёт ошибку "Expected: ';'"
Тут нужно задать приоритет.
Ибо по умолчанию приоритет 0 (самый низкий приоритет).
И вызов правила происходит с приоритетом 0.
Но постфиксные правила разбираются, только если у них приоритет выше, чем у текущего вызова.
syntax Name
{
Text() : string;
| Identifier {
override Text = GetText(Identifier.IdentifierBody);
}
precedence MemberAcces:
| Name "." Identifier {
override Text = Name.Text() + "." + GetText(Identifier.IdentifierBody);
}
}
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: [Nitra] Почему пробелы попадают в IdentifierBody?
I>syntax Using = "using" Name ';'
I>syntax Name ...
I>
WolfHound по сути вопроса уже ответил. Хочу только заметить, что имя "Name" для такого правила — это очень плохой выбор. Хотя технически это и не возбраняется, но это создаст не хилую путаницу в дальнейшем.
В Nite "Name" используется для описания очень базовой вещи — AST-а для имени символа.
Name и Reference — это библиотечные типы AST-а. Рано или поздно тебе придется на них отображать свой синтаксис. И тогда появится путаница.
То что ты описываешь называется "квалифицированная ссылка". Называй лучше сразу правильно — QualifiedReference.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.