Привет,
Берем вот такую грамматику
syntax module TestMain
{
using Nitra.Core;
using Nitra.CStyleComments;
using ItemDeclarations;
[StartRule]
syntax test = Any;
}
Берем вот такой текст ABCD // ABCD
Делаем:
def spans = HashSet();
parseResult.GetSpans(span.Start, span.End, spans);
И получаем результат:
+ [0] {"Start: 5 Len: 2" Class: Nitra.Language.Operator} Nitra.SpanInfo
+ [1] {"Start: 5 Len: 7" Class: Nitra.Language.InlineComment} Nitra.SpanInfo
Вопрос: Откуда тут Nitra.Language.Operator?
Здравствуйте, pekabon, Вы писали:
P>Вопрос: Откуда тут Nitra.Language.Operator?
Оператора быть не должно. Надо разбираться.
Буду признателен, если ты создаешь минимальный проект воспроизводящий это дело и пришлешь его мне по мылу (в профиле) или на Скайп vc.rsdn.ru.
Здравствуйте, VladD2, Вы писали:
Вроде все правильно указано.
Выложил
сюда.
Здравствуйте, pekabon, Вы писали:
P>Вроде все правильно указано.
P>Выложил сюда.
Ну как, удалось посмотреть?
Здравствуйте, pekabon, Вы писали:
P>>Вроде все правильно указано.
P>>Выложил сюда.
P>Ну как, удалось посмотреть?
Сори. Совсем запамятовал. Сейчас посмотрю.
Здравствуйте, pekabon, Вы писали:
P>Ну как, удалось посмотреть?
Посмотрел. Ошибка в описании правила для однострочного комментария.
Оператор получается потому что внутри комментария есть литерал "//", а правило комментария является так называемым token-правилом, а оно может иметь структуру.
Имя Operator дается автоматически из-за вот этой строчки:
namespace Nitra
{
language Language
{
span class Operator regex ['+', '-', '/', '*', '^', '!', '?', ':', '<', '=', '>', '|', '&', '~', '%']+ { ForegroundColor=Olive; }
здесь:
regex ['+', '-', '/', '*', '^', '!', '?', ':', '<', '=', '>', '|', '&', '~', '%']+
это регулярное выражение выявляющее литералы которым автоматически будет присваиваться этот sapan class.
Так как в определении правила SingleLineComment для "//" не было явно задан sapan class, сработала эта строчка и этот литерал получил sapan class "Operator".
Понимаю, что это не логичное поведение. По сему я изменил грамматику комментариев. Теперь она будет выглядеть так:
extend token IgnoreToken
{
| [SpanClass(InlineComment)] SingleLineComment = Start Body=(!NewLine Any)* End=NewLine?
{
regex Start = "//";
}
| [SpanClass(MultilineComment)] MultiLineComment = Start Body=(!"*/" Any)* End
{
[SpanClass(OpenBrace)]
regex Start = "/*";
[SpanClass(CloseBrace)]
regex End = "*/";
}
}
Таким образом в SingleLineComment вложенный sapan class для "//" больше не будет, а в MultiLineComment будут появляться sapan class-ы указывающие, что "/*" — открывающая скобка, а "*/" — закрывающая. Это позволит переходить между ними по Ctrl+"]".
Пока залил изменения в рабочую ветку. В ближайшее время сольем ее с master-ом.