【问题标题】:Custom lexer in Python prompt_toolkitPython prompt_toolkit 中的自定义词法分析器
【发布时间】:2021-09-21 20:26:57
【问题描述】:

虽然prompt_toolkit 文档指出“也可以通过实现Lexer 抽象基类来创建自定义词法分析器”(1),但它并没有真正解释如何。我找不到任何教程或真正完整的代码示例来说明它是如何工作的。有没有人有任何建议或例子?我希望从特定于应用程序的 SQL 派生词创建词法分析器。

【问题讨论】:

    标签: python lexer prompt-toolkit


    【解决方案1】:

    您可以使用 pygments 来创建自己的词法分析器,要创建自己的词法分析器,您需要了解 regex https://docs.python.org/3/howto/regex.html

    您可以从 pygments 阅读此文档链接,了解如何创建您自己的词法分析器。 https://pygments.org/docs/lexerdevelopment/

    这是一个小例子

    from pygments.lexer import RegexLexer
    from pygments.token import Name
    
    __all__ = ['CustomLexer']
    
    class CustomLexer(RegexLexer):
         name = "sql type"
         tokens = {
            'root': [
                (r"\bSELECT\b", Name.Tag),
            ]}
    

    并将这一行添加到要导入的文件中

    lexer = pygments.lexers.load_lexer_from_file("name.py", lexername="CustomLexer")
    

    现在在 prompt_toolkit 中,您还可以编辑这些文档链接的颜色 - https://python-prompt-toolkit.readthedocs.io/en/master/pages/printing_text.html#pygments-token-text-tuples

    style = Style.from_dict({
        'pygments.name.tag': 'bg:#ffffff #000000',
    })
    

    【讨论】:

    • 谢谢,找到了!现在,根据您的指示和sql.py 词法分析器,我写了this。不幸的是,它返回以下错误:AttributeError: type object 'VqlLexer' has no attribute 'lex_document' 不确定我使用的是正确的类。相反,如果我基于 prompt_toolkit 的 Lexer 类创建自定义类,则错误是:TypeError: lex_document() missing 1 required positional argument: 'document'
    • @mrgou 在文档中,它保留了词法分析器 CustomLexer 的名称,并为词法分析器创建了一个不同的文件,以及您将在其中使用提示工具包的不同文件
    • 然后,如果我将类移动到名为lexer\vql_lexer.py 的文件中,重命名类CustomLexer 并在我的代码中添加VqlLexer = load_lexer_from_file(r'lexer\vql_lexer.py', lexername="CustomLexer"),我仍然会得到AttributeError: 'CustomLexer' object has no attribute 'lex_document'...
    • @mrgou 你在哪一行得到错误
    • 这发生在query = session.prompt("VQL> ")。看起来 prompt_toolkit 在类中需要一个 lex_document 函数,但没有关于如何使用它的信息。 GitHub 存储库中的 example 也没有真正的帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 2020-08-18
    • 2011-05-13
    • 2015-04-24
    • 1970-01-01
    相关资源
    最近更新 更多