Не удается сопоставить один символ в грамматике Алекса - PullRequest
3 голосов
/ 06 июля 2011

Я наконец-то вернулся к конкретизации режима сообщений GitCommit, который я хочу добавить в YI, но мне кажется, что мне не хватает чего-то базового.Кажется, я не могу сопоставить один символ в грамматике, все мои правила работают, только если они соответствуют всей строке.Я знаю, что это должно быть возможно, потому что другие грамматики в YI, очевидно, делают это, но делать то же самое, похоже, не работает.

Я хочу иметь режим фиксации, который в конечном итоге будет очень похож на режим vim,Одна из полезных функций в режиме vim - выделение ключевых слов внутри комментариев.Git помещает кучу информации в комментарии почти во всем, что делает (коммит, ребазинг и т. Д.), Так что это полезно.Мое мышление соответствовало начальному символу «#» в комментариях git и переключалось в другой контекст, который будет соответствовать ключевым словам.Однако я не могу создать правило, которое соответствует просто '#', правило переключается на стиль комментария в строках, которые only содержат '#', но в строках, которые содержатвсе, что после '#', не меняет стили.

То, что у меня сейчас есть, это:

<0> {
\#                             { m (const $ LineComment) Style.commentStyle }
$commitChars*$                 { c Style.defaultStyle }
}

<lineComment> {                                                                                                    
$nl                            { m (const Digest) Style.defaultStyle }                                               
·                              { c Style.regexStyle }                                                                
}      

Детали опущены, очевидно.Идея состоит в том, чтобы переключиться в режим 'lineComment', когда мы увидим '#' и по-разному оформляем вещи, пока не увидим конец строки.Согласно документации и примерам, должен быть способ сделать то, что я хочу.Я попробовал почти все перестановки, которые я могу придумать для шаблона '#', но ничего не меняет поведение, которое я вижу.
Что очевидного мне не хватает?

Редактировать: приведенный выше кодот реализации внутри моей ветви YI.У меня есть автономный анализатор, который показывает ту же проблему здесь .Если вы запустите alex GitCommit.x && ghc --make GitCommit.hs && ./GitCommit < shortmsg, вы увидите строки комментариев с содержимым, проанализированным как MessageLine, и пустые строки комментариев, отмеченные правильно CommentStart.

1 Ответ

1 голос
/ 07 июля 2011

Хорошо, я наконец понял это. Похоже, Алекс всегда берет самый длинный матч, а не первый матч. Правило для соответствия строк коммита всегда будет длиннее, поскольку оно соответствует всей строке. Это заставляет Алекса всегда выбирать эту ветку над веткой комментариев. Цитата из Alex docs

When the input stream matches more than one rule, the rule which matches the longest prefix of the input stream wins. If there are still several rules which match an equal number of characters, then the rule which appears earliest in the file wins.

Полагаю, мне следовало читать документы более одного раза. Решение состоит в том, чтобы удалить '#' из набора символов $commitChars.

...