如何为Pygments编写词法分析器的详细文档?

10

我有一个包含Stata关键字以及对Stata语法的基本了解的词典。我想花费几个小时将其转换成Pygments的Stata词法分析器。

但是,我找不到足够的关于词法分析器语法的文档,并且发现自己无法开始编写词法分析器。 能否有人指出一个适合编写Pygments新词法分析器的好教程?

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

我的策略是寻找示例。我已经找到了相当多,例如Puppet, Sass, Scala, Ada。它们只有一定的帮助作用。如果能提供如何从我的 Stata 关键字开始入手的任何帮助,将不胜感激。


不是你要找的答案,但我总是对Stata语法高亮中关键字的强调感到惊讶。我发现高亮的主要好处是错误标记,但在这种情况下,如果没有绝对全面的单词列表和允许命令缩写,可能会有太多的错误分类,从而带来痛苦。 - Nick Cox
我认为关键字的重点至关重要。在Mac OS X上,TextMate编辑器有两个Stata语法包,它们具有不同的关键字列表。尽管存在一些限制,但我认为可以将一些体面的东西实现到Pygments中,但我缺乏适当的词法分析器知识来开始编写一个。 - Fr.
我想我表达不够清楚。对于Stata来说,关键词列表是语法高亮的最不必要的细节。换句话说,几年前发现仅仅将Stata代码视为C代码就可以在各种文本编辑器中获得有用的语法高亮,这是一件愉快的事情。不需要关键字列表,而且关键字通常没有帮助,例如当一个合法的命令名称实际上被用作变量名时。 - Nick Cox
你完成了这个词法分析器吗?我很感兴趣。 - RoyalTS
抱歉,我没有(并且在2013年几乎完全转向使用R语言)。 - Fr.
2个回答

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,而是你没有写词法分析器或了解词法分析器工作原理的经验?因为这个实现相当简单。

然后,如果你想添加更多内容,请向root列表添加一个额外的元素,一个由两个元素组成的元组,其中第一个元素是正则表达式,第二个元素指定语法类。


你说得没错:我对正则表达式有一定的了解,但对Python的了解有限,对词法分析器没有任何了解(例如元组是什么,语法类如何工作)。我尝试阅读了几个其他词法分析器,以了解Stata词法分析器可能是什么样子,但效果不佳。我仍在寻找一个合理且有良好文档的教程。 - Fr.
我没有给你一个合理的起点吗?你可以在Python教程中轻松查找元组的含义。语法类是源代码中某些代码片段的含义。例如,“关键字”是一个语法类,“运算符”可能是另一个,同样的,“表达式”也是。这对应于我源代码中引用的Keyword类。我认为你想要一个pygments-lexer编写教程,却不想学习一点Python或词法分析器的工作方式,有点不现实。 - djc
你说得对(再一次),这是一个有些过于雄心勃勃的尝试。你在这里给了一些线索。唯一错误的部分是你假设我不想学习的地方:我愿意学习,但我需要比我迄今为止找到的更好的文档。如果我能从你的起点开始做些什么,请允许我回报,并感谢你的帮助。 - Fr.

4
我最近尝试编写一个pygments词法分析器(用于BibTeX,它有一个简单的语法),并且同意您的评估:对于不熟悉Python或一般代码解析概念的人来说,现有资源并不是很有帮助。
我发现最有帮助的是Pygments附带的词法分析器集合
有一个文件_mapping.py列出了所有被认可的语言格式,并链接到每个语言的词法分析器对象。为了构建我的词法分析器,我试图想到具有类似结构的语言,并检查是否可以提取出一些有用的东西。一些内置的词法分析器比我想要的更复杂,但其他的非常有帮助。

谢谢。我这周一直在尝试那种方法,并从中写出了一些东西。我还在深入研究为Mac OS X编写的TextMate编辑器的Stata语法解析器,这也很有帮助。 - Fr.
谢谢!这个关于每种语言的词法分析重定向位置的解释非常有帮助,可以节省数小时的逆向工程时间。 - matanster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接