【问题标题】:Extensive documentation on how to write a lexer for Pygments? [closed]有关如何为 Pygments 编写词法分析器的大量文档? [关闭]
【发布时间】:2013-01-23 05:23:05
【问题描述】:

我有一本包含Stata 关键字的字典和Stata 语法的合理知识。我想花几个小时把它变成 Pygments 的 Stata 词法分析器。

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

我知道 Pygments API 和 lexer development page,但老实说,对于像我这样对 Python 知识非常有限的人来说,这些还不够。

到目前为止,我的策略是寻找示例。我找到了quite a few,例如Puppet、Sass、Scala、Ada。他们只帮了这么多。欢迎任何有关如何从我的 Stata 关键字开始的帮助。

【问题讨论】:

  • 不是您寻求的答案,但我总是对 Stata 语法突出显示中对关键字的强调感到惊讶。我发现突出显示的主要好处是错误标记,但是没有绝对全面的单词列表,并且允许命令缩写,在这种情况下很痛苦,可能有太多的错误分类。
  • 我同意在这里强调关键字是至关重要的。 Mac OS X 上的 TextMate 编辑器有两个 Stata 语法包,它们有不同的关键字列表。尽管有这些限制,我认为可以在 Pygments 中实现一些不错的东西,但是我缺乏词法分析器的适当知识来开始编写一个。
  • Fr.:我想我不清楚。我认为关键字列表是——对于Stata——语法突出显示最不需要的细节。换句话说,很高兴在几年前发现仅仅假装 Stata 代码是 C 代码在各种文本编辑器中得到了有用的语法突出显示。不需要关键字列表,而且关键字通常无济于事,例如当合法的命令名实际上被用作变量名时。
  • 你完成过这个词法分析器吗?我会感兴趣的。
  • 抱歉,我没有(在 2013 年几乎完全切换到 R)。

标签: python stata pygments


【解决方案1】:

如果您只是想突出关键字,您可以从这个开始(用您自己的 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 的外观,但效果不佳。我仍在寻找一个记录合理的教程。
  • 我没有给你一个合理的起点吗?您可以在 Python 教程中轻松查找元组的含义。句法类是源代码中某段代码的含义。 IE。 “keyword”是一个句法类,“operator”可能是另一个,“expression”也是。这对应于我的源代码中引用的关键字类。我认为你想要一个 pygments-lexer-writing 教程而不想学习一点 Python 或词法分析器的工作原理有点不切实际。
  • 你是对的(再次),这是一个有点过于雄心勃勃的尝试。你确实在这里提供了一些线索。您唯一错误的部分是您假设我不想学习:我愿意,但我需要比迄今为止找到的文档更好的文档。如果我能从您的起点开始做任何事情,请允许我报告,并感谢您的帮助。
【解决方案2】:

我最近尝试编写一个 pygments 词法分析器(用于 BibTeX,它具有简单的语法),并同意您的评估,即那里的资源对不熟悉 Python 或一般代码解析概念的人没有多大帮助。

我发现最有帮助的是collection of lexers included with Pygments。

有一个文件_mapping.py 列出了所有可识别的语言格式以及每个格式的词法分析器对象的链接。为了构建我的词法分析器,我尝试考虑与我正在处理的语言具有相似结构的语言,并检查是否可以梳理出一些有用的东西。一些内置的词法分析器比我想要的复杂,但其他的很有帮助。

【讨论】:

  • 谢谢。这周我一直在尝试这种方法,并从中写了一些东西。我还在深入研究为 Mac OS X 的 TextMate 编辑器编写的 Stata 语法解析器,这也很有帮助。
  • 谢谢!这个解释每种语言的词法重定向在哪里非常有用,可以节省几个小时的逆向工程时间。
猜你喜欢
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多