在python中创建语法荧光笔(PyQt4)

2024-05-16 04:27:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我创建了一个使用<强> pyqt4的简单文本编辑器,我希望它能够实现HTML、CSS、Python、C/C++等编程语言的语法高亮显示。但我不知道该如何开始实施,也不知道从哪里开始。请有人给我指出正确的方向,然后pliz澄清我对语法高亮的怀疑。拜托。在


Tags: 文件信息概念html文章语法互联网方向
3条回答

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

Python有一个库模块tokenize,它正好满足Python语言的需要。文件甚至说,它对漂亮的打印和彩色屏幕显示很有用。希望,使用它能让你对这些东西的工作原理有更多的了解。然后,您既可以搜索用于解析其他语言的Python库,也可以尝试自己编写一个Python库。在

有一个堆栈溢出问题here,它建议pyPEG解析其他语言。吉莫西提出的幻觉也不错。在

如果你想让你的生活更轻松,使用QScintilla-它可以做你需要的一切,而且更直接。在

QScintilla包含在PyQt二进制安装程序for Windows中(可以找到here),几乎所有Linux发行版的存储库中都有QScintilla包。或者,可以在here找到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_())

我知道这个问题已经得到了回答,但和我一样,许多新用户来到这里,他们会知道,上面提到的选项是很少的高级水平。我把这个答案贴出来,供其他新来的人参考

使用python和Qt创建语法高亮是一个不错的选择。因为python是非常强大的语言,QT是GUI应用程序开发的优秀框架。
Syntax highlighter是带有QTextEdit对象的最简单的Regex表达式。您只需解析正则表达式,然后为这种正则表达式选择特定的QTextFormat,然后将该文本格式应用到该块上。 在这里,hightaxlynlier在hightaxlighter类中使用最简单的syntuqsynlighter语法在hightaxlighter类中实现

    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);

以8051单片机为例,用8051微控制器的语法创建了一个高质量的程序集。为了进一步的参考和一个好的起点你can refer to that code.

相关问题 更多 >