[Nitra] Почему пробелы попадают в IdentifierBody?
От: ionoy Эстония www.ammyui.com
Дата: 07.12.15 18:13
Оценка:
Такой синтаксис:

token Identifier = !Keyword IdentifierBody
{
  regex KeywordToken = "true" | "false" | "null" | "viewmodel" | "using";
  token Keyword = KeywordToken !IdentifierPartCharacters;
}

[Name]
syntax Name = (Identifier '.')* Identifier;


Почему-то парсит с пробелами в конце. Если подать на вход такой текст:

A.B.C {}


То в Name запишется "A.B.C "
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re: [Nitra] Почему пробелы попадают в IdentifierBody?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.12.15 18:32
Оценка:
Здравствуйте, 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 называется) так:

syntax QualifiedIdentifier
{
  | Reference
  | QualifiedIdentifier "." Reference
}
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [Nitra] Почему пробелы попадают в IdentifierBody?
От: ionoy Эстония www.ammyui.com
Дата: 07.12.15 18:44
Оценка:
Здравствуйте, 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>
VD>syntax QualifiedIdentifier
VD>{
VD>  | Reference
VD>  | QualifiedIdentifier "." Reference
VD>}
VD>


Дык этот Name сам мапился, так что меня мало волновали проблемы простых смертых
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[3]: [Nitra] Почему пробелы попадают в IdentifierBody?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.12.15 18:51
Оценка:
Здравствуйте, ionoy, Вы писали:

I>Ага, [ExplicitSpaces] помог


Только не забудь, что s-ки нужно вручную расставить. Иначе не будет парсить код вроде "A. B".

I>Ага, уже сам в доке нашёл


А вот так:
(Identifier; '.'; ?)*

будет допустима "висячая" точка в конце. Удобно, например, для описания инициализаторов в Шарпе.

I>Это я решил схалтурить в целях сокращения кода. Но судя по всему на этом завязана вся кухня с типизацией и т.д. Короче придётся всё-таки своё правило делать.


Не халтурить тут нельзя. Иначе биндинг работать не будет. А это вручную задолбаешься делать. А Нитра прямо из коробки решение предоставляет.

Да и не сэкономишь особ ничего.

I>Дык этот Name сам мапился, так что меня мало волновали проблемы простых смертых


Он сам памится потому что он простым идентификатором является. Там ясно что мапить. А вот с квалифицированной ссылкой (ту что через точки) так не выйдет. Ее нужно самому будет отмапить. Если описать правило как я показал, то мапинг будет простейшим. Если же использовать циклы, то там придется по приседать (как в нашем C#-примере).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [Nitra] Почему пробелы попадают в IdentifierBody?
От: ionoy Эстония www.ammyui.com
Дата: 08.12.15 10:17
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Для описания квалифицированного идентификатора лучше использовать не цикл, а рекурсию. Тогда его существенно проще мапить будет. Опиши свой QualifiedIdentifier (что у тебя ошибочно Name называется) так:


VD>
VD>syntax QualifiedIdentifier
VD>{
VD>  | Reference
VD>  | QualifiedIdentifier "." Reference
VD>}
VD>


Почему-то не работает. Разбирает только до точки, потом даёт ошибку "Expected: ';'"
syntax Using = "using" Name ';'

syntax Name 
{
  Text() : string;
      
  | Name "." Identifier {
    override Text = Name.Text() + "." + GetText(Identifier.IdentifierBody);
  }
  | Identifier {
    override Text = GetText(Identifier.IdentifierBody);
  }
}
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[3]: [Nitra] Почему пробелы попадают в IdentifierBody?
От: WolfHound  
Дата: 08.12.15 15:09
Оценка:
Здравствуйте, 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?
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.12.15 17:48
Оценка:
Здравствуйте, ionoy, Вы писали:

I>
I>syntax Using = "using" Name ';'

I>syntax Name ...
I>


WolfHound по сути вопроса уже ответил. Хочу только заметить, что имя "Name" для такого правила — это очень плохой выбор. Хотя технически это и не возбраняется, но это создаст не хилую путаницу в дальнейшем.

В Nite "Name" используется для описания очень базовой вещи — AST-а для имени символа.

Name и Reference — это библиотечные типы AST-а. Рано или поздно тебе придется на них отображать свой синтаксис. И тогда появится путаница.

То что ты описываешь называется "квалифицированная ссылка". Называй лучше сразу правильно — QualifiedReference.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.