我一直在网上搜索文本编辑器中特定文件的语法突出显示,我读到了 Lexers和Yacc 。我对语法高亮的概念很困惑。
我使用 PyQt4 创建了一个简单的文本编辑器,我希望它能够启用语法高亮的编程语言,如HTML,CSS,Python,C / C ++。但我不知道如何开始实施这个以及从哪里开始。请有人指出我正确的方向,并清楚我对语法高亮的疑虑。请。
答案 0 :(得分:5)
如果您想让自己的生活更轻松,请使用QScintilla - 它可以完成您需要的一切,并且更直接。
QScintilla包含在适用于Windows的PyQt二进制安装程序(可以找到here)中,几乎所有Linux发行版都会在其存储库中包含QScintilla软件包。或者,可以找到QScintilla源代码here。
这里有一个最小的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_())
答案 1 :(得分:2)
您需要将文本划分为词法标记(单词,数字,符号等),找出每个标记的内容,并相应地对其进行着色。识别数字和符号很容易,但要知道单词是变量,函数,关键字还是根据语言的语法规则解析文本。这就是为什么你的搜索找到词法分析(Lex)和解析(Yacc)的参考。词法分析是关于将字母和符号组合成单词和其他标记,解析是关于这些标记如何组合在一起构成一个语法上有效的程序。
Python有一个库模块tokenize,它完全符合Python语言的要求。该文档甚至表示它对于漂亮打印和着色屏幕显示非常有用。希望使用它可以让您更好地了解所有这些东西是如何工作的。然后你可以搜索Python库来解析其他语言,或者自己编写一个。
有一个Stack Overflow问题here建议pyPEG解析其他语言。 Jimothy对Pygments的建议也很好。
答案 2 :(得分:2)
我知道这个问题已经得到解答,但就像我一样,许多其他新用户来到这里,并且会知道上面提到的选项中提到的选项都没什么先进水平。我发布这个答案,以供其他一些新成员进一步参考
使用python和Qt创建语法Highlighter是一个不错的选择。由于python是非常强大的语言,QT是GUI应用程序开发的优秀框架 语法highlighter是使用QTextEdit Object的最简单的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中使用Qt4为8051微控制器创建了一个Assembly语法高亮显示器。如需进一步参考和良好的起点can refer to that code.