0

我刚刚询问了 GitHub 上的支持人员,为什么 AspectJ (*.aj) 文件没有语法高亮显示。答案是他们正在使用 Pygments,但不知道任何现有的 AspectJ 词法分析器。我做了一个快速的网络搜索,也没有找到任何东西。这里有没有人写过或者可以指向我现有的链接?

很久以前,我为 Kconfig(Linux 内核配置)文件编写了一个词法分析器,但这对我来说相当困难,因为我不会说 Python。所以在我再次开始折磨我的大脑之前,我认为我应该先问清楚,而不是重新发明轮子。

4

2 回答 2

2

JavaLexer最初创建了一个“复制、粘贴和修改”解决方案之后,因为我真的不会说 Python,我设法破解了另一个 quick'n'dirty 解决方案,JavaLexer它在大多数情况下子类和委托对它进行词法分析。例外是

  • AspectJ 特定的关键字,
  • 处理类型间声明后跟没有空格的冒号不是作为 Java 标签,而是作为 AspectJ 关键字加上“:”运算符和
  • 将类型间注释声明作为 AspectJ 关键字处理,而不是作为 Java 名称装饰器。

我确信我的小启发式解决方案遗漏了一些细节,但正如 Andrew Eisenberg 所说:一个不完美但可行的解决方案比一个不存在的完美解决方案要好:

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
于 2012-08-08T14:29:23.150 回答
1

如果您从 Java 词法分析器开始,aspectj 的语法高亮应该很容易实现。词法分析器将与 Java 相同,但有一些额外的关键字。

有关 AspectJ 特定关键字的列表,请参见此处:http: //git.eclipse.org/c/ajdt/org.eclipse.ajdt.git/tree/org.eclipse.ajdt.core/src/org/eclipse/ ajdt/core/AspectJPlugin.java

这里是Java关键字: http: //git.eclipse.org/c/ajdt/org.eclipse.ajdt.git/tree/org.eclipse.ajdt.ui/src/org/eclipse/ajdt/internal/ui /editor/AspectJCodeScanner.java

于 2012-07-29T03:53:21.200 回答