4

我一直在互联网上搜索有关文本编辑器中特定文件的语法突出显示的信息,并且阅读了有关Lexers 和 Yacc的信息。我对语法高亮的概念很困惑。

我使用PyQt4创建了一个简单的文本编辑器,我希望它能够启用 HTML、CSS、Python、C/C++ 等编程语言的语法高亮显示。但我不知道如何开始实施这个以及从哪里开始。请有人指出我正确的方向,并消除我对语法突出显示的疑虑。请。

4

3 回答 3

5

如果您想让您的生活变得轻松,请使用QScintilla - 它可以满足您的一切需求,而且开箱即用。

QScintilla 包含在 Windows 的 PyQt 二进制安装程序中(可在此处找到),几乎所有 Linux 发行版的存储库中都有 QScintilla 包。或者,可以在此处找到 QScintilla 源代码。

这是一个最小的 QScintilla 示例,它显示了入门是多么容易:

import sys, os
from PyQt4 import QtGui, Qsci

class Window(Qsci.QsciScintilla):
    def __init__(self):
        Qsci.QsciScintilla.__init__(self)
        self.setLexer(Qsci.QsciLexerPython(self))
        self.setText(open(os.path.abspath(__file__)).read())

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 300, 500, 500)
    window.show()
    sys.exit(app.exec_())
于 2014-01-06T19:21:02.653 回答
3

我知道这个问题已经得到解答,但和我一样,许多其他新用户来到这里,并且会知道上述答案中提到的选项几乎没有高级水平。我发布此答案以供其他一些新来者进一步参考

使用 python 和 Qt 创建语法荧光笔是一个不错的选择。由于 python 是非常强大的语言,而 QT 是用于 GUI 应用程序开发的绝佳框架。
语法高亮是带有 QTextEdit 对象的最简单的正则表达式。您只需解析 Regex 表达式,然后为该类型的 regex 选择特定的 QTextFormat 并将该文本格式应用于该块。这是使用 Qt4 在 Python 中实现的最简单语法高亮器的代码示例,在从 QSyntaxHighlighter 驱动的 syntaxHighlighter 类中实现的高亮功能

    def highlightBlock(self, text):
    for pattern, format in self.highlightingRules:
        expression = QtCore.QRegExp(pattern)
        index = expression.indexIn(text)
        while index >= 0:
            length = expression.matchedLength()
            self.setFormat(index, length, format)
            index = expression.indexIn(text, index + length)

    self.setCurrentBlockState(0)

    startIndex = 0
    if self.previousBlockState() != 1:
        startIndex = self.commentStartExpression.indexIn(text)

    while startIndex >= 0:
        endIndex = self.commentEndExpression.indexIn(text, startIndex)

        if endIndex == -1:
            self.setCurrentBlockState(1)
            commentLength = len(text) - startIndex
        else:
            commentLength = endIndex - startIndex + self.commentEndExpression.matchedLength()

        self.setFormat(startIndex, commentLength,
                self.multiLineCommentFormat)
        startIndex = self.commentStartExpression.indexIn(text,
                startIndex + commentLength);

使用这个例子,我在 Python 中为 8051 微控制器创建了一个带有 Qt4 的汇编语法荧光笔。如需进一步参考和良好的起点,您可以参考该代码。

于 2014-06-27T13:50:00.470 回答
2

您需要将文本分成词汇标记(单词、数字、符号等),找出每一个是什么,并相应地着色。识别数字和符号很容易,但要知道一个词是变量、函数、关键字还是任何意味着根据语言的句法规则解析文本。这就是为什么您的搜索会找到对词​​法分析 (Lex) 和解析 (Yacc) 的引用。词法分析是关于将字母和符号组装成单词和其他标记,而解析是关于这些标记如何组合在一起以构成一个语法上有效的程序。

Python 有一个库模块tokenize,它完全可以满足您对 Python 语言的需求。文档甚至说它对于漂亮的打印和着色屏幕显示很有用。希望使用它可以让您更多地了解所有这些东西是如何工作的。然后,您可以搜索用于解析其他语言的 Python 库,或者自己编写一个。

这里有一个 Stack Overflow 问题,建议使用 pyPEG解析其他语言。Jimothy 对 Pygments 的建议也很好。

于 2014-01-06T14:13:29.047 回答