我刚刚询问了 GitHub 上的支持人员,为什么 AspectJ (*.aj) 文件没有语法高亮显示。答案是他们正在使用 Pygments,但不知道任何现有的 AspectJ 词法分析器。我做了一个快速的网络搜索,也没有找到任何东西。这里有没有人写过或者可以指向我现有的链接?
很久以前,我为 Kconfig(Linux 内核配置)文件编写了一个词法分析器,但这对我来说相当困难,因为我不会说 Python。所以在我再次开始折磨我的大脑之前,我认为我应该先问清楚,而不是重新发明轮子。
我刚刚询问了 GitHub 上的支持人员,为什么 AspectJ (*.aj) 文件没有语法高亮显示。答案是他们正在使用 Pygments,但不知道任何现有的 AspectJ 词法分析器。我做了一个快速的网络搜索,也没有找到任何东西。这里有没有人写过或者可以指向我现有的链接?
很久以前,我为 Kconfig(Linux 内核配置)文件编写了一个词法分析器,但这对我来说相当困难,因为我不会说 Python。所以在我再次开始折磨我的大脑之前,我认为我应该先问清楚,而不是重新发明轮子。
在JavaLexer
最初创建了一个“复制、粘贴和修改”解决方案之后,因为我真的不会说 Python,我设法破解了另一个 quick'n'dirty 解决方案,JavaLexer
它在大多数情况下子类和委托对它进行词法分析。例外是
我确信我的小启发式解决方案遗漏了一些细节,但正如 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
如果您从 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