关于为Pygments编写词法分析器的详细文档?

10 投票
2 回答
1969 浏览
提问于 2025-04-17 15:07

我有一个关于Stata 关键词的字典,并且对Stata的语法有一些了解。我想花几个小时把它变成一个适用于Pygments的Stata词法分析器。

不过,我找不到足够的文档来了解词法分析器的语法,所以我不知道该怎么开始写这个词法分析器。有没有人能推荐一个写Pygments新词法分析器的好教程?

我知道Pygments API词法分析器开发页面,但老实说,这些对我这个Python知识非常有限的人来说,实在不够。

到目前为止,我的策略是寻找一些例子。我找到了一些相关的例子,比如PuppetSassScalaAda。这些例子对我帮助不大。如果有人能告诉我如何从我的Stata关键词开始,那就太好了。

2 个回答

4

我最近尝试写一个用于BibTeX的pygments词法分析器,因为BibTeX的语法比较简单。我同意你的看法,网上的资源对那些不熟悉Python或代码解析概念的人来说并不是很有帮助。

我发现最有用的是Pygments自带的词法分析器集合

里面有一个文件叫_mapping.py,这个文件列出了所有被识别的语言格式,并链接到每种格式对应的词法分析器对象。为了构建我的词法分析器,我尝试想到一些与我正在处理的语言结构相似的语言,并查看能否从中提取出有用的信息。有些内置的词法分析器比我想要的复杂,但其他的确实很有帮助。

10

如果你只是想突出显示一些关键词,你可以从这个开始(把关键词换成你自己想要的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)或者理解词法分析器的工作原理经验不多?因为这个实现其实挺简单的。

然后,如果你想添加更多内容,可以在root列表中增加一个元素,添加一个包含两个元素的元组,第一个元素是一个正则表达式,第二个元素则指定一个语法类别。

撰写回答