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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top