Pygments Lexer per AspectJ
-
12-12-2019 - |
Domanda
Ho appena chiesto ai ragazzi di supporto su GitHub perché i file Aspectj (* .AJ) non sono sintassi evidenziati.La risposta era che stanno usando pygments, ma non sono consapevoli di qualsiasi lexer esistente per Aspectj.Ho fatto una rapida ricerca sul web e non ho trovato nessuno.Qualcuno qui ha scritto uno o può indicarmi un link per uno esistente?
Molto tempo fa ho scritto un lexer per i file KConfig (Linux Kernel Configuration), ma era piuttosto difficile per me perché non parlo Python.Quindi, prima di iniziare a torturarsi di nuovo il mio cervello, pensavo che dovrei meglio a chiedere prima invece di reinventare la ruota.
Soluzione
Dopo aver creato una soluzione "Copia, incolla e modifica" di JavaLexer
Inizialmente perché non parlo davvero Python, sono riuscito a hackerare un'altra soluzione Quick'n'Ditty che sottoprografica JavaLexer
e Delegates Lexing per la maggior parte.Le eccezioni sono
- .
- Parole chiave specifiche dell'aspetto,
- Gestione delle dichiarazioni inter-tipo seguita da coloni senza spazio non come etichette Java, ma come Aspectj Parole chiave Plus ":" Operatore e
- Gestione delle dichiarazioni di annotazione inter-tipo come parole chiave di Aspectj e non come decoratori del nome Java.
Sono sicuro che la mia piccola soluzione euristica manca alcuni dettagli, ma come Andrew Eisenberg ha detto: una soluzione imperfetta, ma la soluzione di lavoro è migliore di una perfetta inesistente:
.class AspectJLexer(JavaLexer): """ For `AspectJ <http://www.eclipse.org/aspectj/>`_ source code. """ name = 'AspectJ' aliases = ['aspectj'] filenames = ['*.aj'] mimetypes = ['text/x-aspectj'] aj_keywords = [ 'aspect', 'pointcut', 'privileged', 'call', 'execution', 'initialization', 'preinitialization', 'handler', 'get', 'set', 'staticinitialization', 'target', 'args', 'within', 'withincode', 'cflow', 'cflowbelow', 'annotation', 'before', 'after', 'around', 'proceed', 'throwing', 'returning', 'adviceexecution', 'declare', 'parents', 'warning', 'error', 'soft', 'precedence', 'thisJoinPoint', 'thisJoinPointStaticPart', 'thisEnclosingJoinPointStaticPart', 'issingleton', 'perthis', 'pertarget', 'percflow', 'percflowbelow', 'pertypewithin', 'lock', 'unlock', 'thisAspectInstance' ] aj_inter_type = ['parents:', 'warning:', 'error:', 'soft:', 'precedence:'] aj_inter_type_annotation = ['@type', '@method', '@constructor', '@field'] def get_tokens_unprocessed(self, text): for index, token, value in JavaLexer.get_tokens_unprocessed(self, text): if token is Name and value in self.aj_keywords: yield index, Keyword, value elif token is Name.Label and value in self.aj_inter_type: yield index, Keyword, value[:-1] yield index, Operator, value[-1] elif token is Name.Decorator and value in self.aj_inter_type_annotation: yield index, Keyword, value else: yield index, token, value
Altri suggerimenti
L'evidenziazione della sintassi per AspectJ dovrebbe essere piuttosto semplice da implementare se si inizia con un Java Lexer.Il Lexer sarebbe identico a Java con alcune parole chiave extra.
Vedi qui per un elenco delle parole chiave specifiche dell'aspectj: http://git.eclipse.org/c/ajdt/org.eclipse.ajdt.git/tree/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/aspectjplugin.java
E qui per le parole chiave Java: http://git.eclipse.org/c/ajdt/org.eclipse.ajdt.git/tree/org.ejdt.git/tree/org.eclipse.ajdt.ui/src/org/eclipse/ajdt/internal/ui/editor/aspectjcodescanner.java