Комментарии в лексере
От: catbert  
Дата: 20.05.10 17:49
Оценка:
Прикрутил студийный Nemerle.Completion2.ScanLexer для подсветки кода Nemerle.

Все вроде работает, кроме комментариев: лексер их попросту игнорирует (не выпускает нужные токены). Ни в лексере, ни в менеджере (ну там ясно, что не должно быть), ни в препарсере, не нашел как их включить. LexerString и PreParser так же их игнорируют. LexerFile вообще не захотел работать: говорит duplicate files in project.

Пока что просто использую простенький парсер на Irony, чтобы найти и раскрасить комментарии (работает, но капли не элегантно).

Куда копать? Что это вообще может быть? Может, как-то связано с тем, что я использую Manager от Nemerle.Completion2.Engine?
Re: Комментарии в лексере
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.05.10 16:30
Оценка:
Здравствуйте, catbert, Вы писали:

C>Прикрутил студийный Nemerle.Completion2.ScanLexer для подсветки кода Nemerle.


C>Все вроде работает, кроме комментариев: лексер их попросту игнорирует (не выпускает нужные токены).


ScanLexer комментарии точно обрабатывает. См. стоку 807 ScanLexer.n

Проблема может быть в том, что ScanLexer рассчитан на построчную обработку (так как он предназначен для редактора кода) с промежуточным сохранением состояния.

Возможно тебе лучше использовать LexerString.

C>Ни в лексере, ни в менеджере (ну там ясно, что не должно быть), ни в препарсере, не нашел как их включить. LexerString и PreParser так же их игнорируют. LexerFile вообще не захотел работать: говорит duplicate files in project.


В лексерах отличных от ScanLexer комментарии игнорируются если в Manager.Options.LexerStoreComments установлено false. Но и при этом токены не формирются, а комментарии запихиваются в какую-то хэш-таблицу.

Лучше всего (наверно) поступить так...

Создать наследника LexerString. Переопределить в нем метод comment_beginning и в нем уже отлавливать местоположение комментариев и обрабатывать как надо.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Комментарии в лексере
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.05.10 17:09
Оценка:
Здравствуйте, catbert, Вы писали:

Вот рабочий пример выводящий список комментариев сам в себе:
using System;
using System.IO.Path;
using System.Console;
using Nemerle.Compiler;

class CompilerHost : ManagerClass
{
  public this()
  {
    base(CompilationOptions());
    InitCompiler();
    LoadExternalLibraries();
  }
}

[Record]
class MyLexer : Nemerle.Compiler.LexerString
{
  protected override comment_beginning() : char
  {
    def posStart = pos - 1;
    def ch = base.comment_beginning();
    WriteLine(reader.Substring(posStart, pos - posStart).TrimEnd('\n'));
    ch
  }
  // aaaa
}

module Program
{
  Main() : void
  {
    def man = CompilerHost();
    // bbb
    def path = GetFullPath(Combine(GetDirectoryName(Uri(typeof(Program).Assembly.CodeBase).LocalPath), @"..\..\Main.n"));
    def code = IO.File.ReadAllText(path);
    def lex = MyLexer(man, code, Location(Location.GetFileIndex(path), 1, 1));
    lex.Keywords = man.CoreEnv.Keywords;
    /*
    ccc
    */
    lex.BeginParseFile();
    while (!(lex.GetToken() is Token.EndOfFile))
      ();
    _ = ReadLine();
  }
} // end of Program


Такой лексер можно подсунуть и компилятору. Тогда можно будет получать список комментариев в процессе парсинга файлов компилятором.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Теперь директивы
От: catbert  
Дата: 22.05.10 21:28
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Лучше всего (наверно) поступить так...


VD>Создать наследника LexerString. Переопределить в нем метод comment_beginning и в нем уже отлавливать местоположение комментариев и обрабатывать как надо.


Так и сделал. Из тех конструкций языка, которые я тестировал, нераспознанными остались только директивы препроцессора. В связи с чем маааахонький фич-реквест. Метод parse_preprocessor в LexerBase надо сделать виртуальным защищенным. Это позволит из лексера видеть директивы (что полезно для подсветки синтаксиса и для внешних анализаторов кода), а издержкой будет только виртуальный вызов для каждой прагмы (что недорого).

Для этого просто надо строчку 1366 в /nemerle/trunk/ncc/parsing/Lexer.n поменять:
  parse_preprocessor (startLocation : Location) : void
//  -------->
  protected virtual parse_preprocessor (startLocation : Location) : void
Re[3]: Теперь директивы
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.05.10 15:03
Оценка:
Здравствуйте, catbert, Вы писали:

C>Так и сделал. Из тех конструкций языка, которые я тестировал, нераспознанными остались только директивы препроцессора. В связи с чем маааахонький фич-реквест. Метод parse_preprocessor в LexerBase надо сделать виртуальным защищенным. Это позволит из лексера видеть директивы (что полезно для подсветки синтаксиса и для внешних анализаторов кода), а издержкой будет только виртуальный вызов для каждой прагмы (что недорого).


C>Для этого просто надо строчку 1366 в /nemerle/trunk/ncc/parsing/Lexer.n поменять:

C>
C>  parse_preprocessor (startLocation : Location) : void
C>//  -------->
C>  protected virtual parse_preprocessor (startLocation : Location) : void
C>


У тебя доступ к репозиторию есть? Если есть правь сам. Только тесты прогоняй.

Если нет, то пришли мне гуглевый экаунт, я подключу тебя к проекту.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Теперь директивы
От: catbert  
Дата: 29.05.10 09:13
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Если нет, то пришли мне гуглевый экаунт, я подключу тебя к проекту.


Спасибо Поправил.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.