Обширна документация за това как да напишете лексер за Pygments? [затворено]

Имам речник на Stata ключови думи и разумни познания за синтаксиса на Stata. Бих искал да отделя няколко часа, за да го превърна в Stata lexer за Pygments.

Въпреки това, не мога да намеря достатъчно документация за синтаксиса на лексърите и се оказвам неспособен да започна да кодирам лексъра. Може ли някой да посочи добър урок за писане на нови лексни програми за Pygments?

Знам за API на Pygments и страница за разработка на lexer, но честно казано, те не са достатъчни за някой като мен с много ограничени познания за Python.

Моята стратегия досега беше да търся примери. Намерих доста, напр. Куклен, Sass, Scala, Ada. Те помогнаха само толкова. Всяка помощ за това как да започна с моите Stata ключови думи би била добре дошла.


person Fr.    schedule 07.02.2013    source източник
comment
Не е отговорът, който търсите, но винаги се изненадвам от акцента върху ключовите думи в подчертаването на синтаксиса на Stata. Основното предимство на подчертаването, което открих, е маркирането на грешки, но без абсолютно изчерпателен списък с думи и допускане на съкращения на команди, проблем в този контекст, може да има твърде много грешни класификации.   -  person Nick Cox    schedule 19.03.2013
comment
Съгласен съм, че тук акцентът върху ключовите думи е от решаващо значение. Има два пакета за синтаксис Stata за редактора TextMate на Mac OS X и те имат различни списъци с ключови думи. Въпреки ограниченията, мисля, че нещо прилично може да бъде имплементирано в Pygments, но ми липсват необходимите познания за лексърите, за да започна да пиша такъв.   -  person Fr.    schedule 20.03.2013
comment
Фр.: Предполагам, че не бях ясен. Мисля, че списък с ключови думи е -- за Stata -- най-малко необходимият детайл за подчертаване на синтаксиса. Казано по друг начин, беше приятно да открия преди няколко години, че простото преструване, че Stata кодът е C код, получи полезно подчертаване на синтаксиса в различни текстови редактори. Не е необходим списък с ключови думи и ключовите думи често не помагат, напр. когато име на легална команда всъщност се използва като име на променлива.   -  person Nick Cox    schedule 20.03.2013
comment
Завършил ли си някога този лексер? Ще ми е интересно.   -  person RoyalTS    schedule 30.01.2014
comment
Съжалявам, не го направих (и преминах почти изцяло към R през 2013 г.).   -  person Fr.    schedule 30.01.2014


Отговори (2)


Ако просто искате да маркирате ключовите думи, бихте започнали с това (като замените ключовите думи с вашия собствен списък от Stata ключови думи):

class StataLexer(RegexLexer):

    name = 'Stata'
    aliases = ['stata']
    filenames = '*.stata'
    flags = re.MULTILINE | re.DOTALL

    tokens = {
       'root': [
           (r'(abstract|case|catch|class|do|else|extends|false|final|'
            r'finally|for|forSome|if|implicit|import|lazy|match|new|null|'
            r'object|override|package|private|protected|requires|return|'
            r'sealed|super|this|throw|trait|try|true|type|while|with|'
            r'yield)\b', Keyword),
       ],
   }

Мисля, че проблемът ви не е, че не знаете никакъв Python, а че нямате много опит с писането на lexer или разбирането как работи lexer? Тъй като това изпълнение е доста лесно.

След това, ако искате да добавите още неща, добавете допълнителен елемент към списъка root, кортеж от два елемента, където първият елемент е регулярен израз, а вторият елемент обозначава синтактичен клас.

person djc    schedule 19.03.2013
comment
Вие сте прав по всички точки: имам разумни познания за регулярни изрази, но ограничени познания за Python и нямам познания за лексери (напр. какво е кортеж и как работи синтактичен клас). Опитах се да прочета няколко други лексера, за да разбера как може да изглежда един Stata, но това не се получи добре. Все още търся сравнително добре документиран урок. - person Fr.; 20.03.2013
comment
Не ви ли дадох разумна отправна точка? Можете лесно да потърсите значението на кортеж в урок по Python. Синтактичен клас е значението на част от кода в изходния код. т.е. ключовата дума е синтактичен клас, операторът може да е друг, както и изразът. Това съответства на класа Keyword, посочен в моя част от изходния код. Мисля, че желанието ви за урок за писане на pygments-lexer, без да искате да научите малко за това как работят Python или lexers, е малко нереалистично. - person djc; 20.03.2013
comment
Прав си (отново), това е малко свръхамбициозен опит. И ти даваш няколко улики тук. Единствената част, в която грешите, е, че приемате, че не искам да уча: готов съм, но ми трябва по-добра документация от тази, която намерих досега. Моля, позволете ми да докладвам, ако успея да направя нещо от вашата начална точка и ви благодаря за помощта. - person Fr.; 20.03.2013

Наскоро се опитах да напиша pygments lexer (за BibTeX, който има прост синтаксис) и се съгласявам с оценката ви, че ресурсите там не са много полезни за хора, които не са запознати с Python или общи концепции за разбор на код.

Това, което намерих за най-полезно, беше колекцията от лексери, включени в Pygments.

Има файл _mapping.py, който изброява всички разпознати езикови формати и връзки към лексния обект за всеки от тях. За да конструирам моя лексер, се опитах да измисля езици, които имат подобни конструкции на тези, с които работех, и проверих дали мога да измисля нещо полезно. Някои от вградените лексери са по-сложни, отколкото исках, но други бяха полезни.

person Mzzzzzz    schedule 26.03.2013
comment
Благодаря. Тази седмица пробвах този подход и написах няколко неща от него. Също така разглеждам по-задълбочено синтаксисен анализатор на Stata, написан за редактора TextMate за Mac OS X, който също помага. - person Fr.; 26.03.2013
comment
Благодаря! това обяснение за това къде lexing пренасочването на език е феноменално полезно, спестяване на време за няколко часа обратно инженерство. - person matanster; 29.05.2013