2014-01-06 4 views
2

Я искал в Интернете о подсветку синтаксиса конкретного файла в текстовом редакторе и я прочитал о лексических и Yacc. я довольно запутался в концепциях подсветки синтаксиса.Создание подсветку синтаксиса в Python (PyQt4)

Я создал простой текстовый редактор, используя PyQt4, и я хочу, чтобы он включал подсветку синтаксиса языков программирования, таких как HTML, CSS, Python, C/C++. Но я не знаю, как начать реализацию этого и с чего начать. Пожалуйста, кто-то укажет мне в правильном направлении, и pliz очистит мои сомнения в подсветке синтаксиса. Пожалуйста.

+0

Вы можете начать с изучения регулярного выражения, хотя я не уверен, что так работает большинство синтаксисов highliting. Но он обычно используется на веб-сайтах. – aIKid

+0

Взгляните на [Pygments] (http://pygments.org), который является синтаксисом синтаксиса с открытым исходным кодом Python. – Jimothy

+0

Я думаю, что pygments - это синтаксис синтаксиса командной строки ... но я хочу реализовать подсветку синтаксиса на лету. Можно ли сделать подсветку синтаксиса с помощью pygments? @Jimothy – dragfire

ответ

2

Вам нужно разделить текст на лексические маркеры (слова, цифры, символы и т. Д.), Узнать, что каждый из них, и покрасить его соответствующим образом. Достаточно легко распознать числа и символы, но знать, является ли слово переменной, функцией, ключевым словом или любым другим способом, анализирующим текст в соответствии с синтаксическими правилами языка. Вот почему ваш поиск находит ссылки на лексический анализ (Лекс) и разбор (Yacc). Лексический анализ заключается в сборке букв и символов в словах и других токенах, а синтаксический анализ - это то, как эти токены объединяются, чтобы составить синтаксически действующую программу.

Python имеет библиотечный модуль, tokenize, который делает именно то, что вам нужно для языка Python. В документации даже говорится, что она полезна для красивой печати и раскраски на экране. Надеюсь, использование этого даст вам больше идеи о том, как работает все это. Затем вы можете либо искать библиотеки Python для анализа других языков, либо самостоятельно писать.

Есть вопрос переполнения стека here, который предлагает pyPEG для разбора других языков. Хорошие предложения Джимоти о Пигментах тоже хороши.

+0

по крайней мере, ур объясняет оттенок мне немного света на эту тему..ok я дам ему попробовать .. спасибо @Peter Westlake .. Невозможно проголосовать, так как мой представитель низкий :) – dragfire

5

Если вы хотите сделать вашу жизнь легкой, используйте QScintilla - она ​​делает все, что вам нужно, и больше прямо из коробки.

QScintilla поставляется с двоичными установщиками PyQt для Windows (который можно найти 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_()) 
+0

Спасибо @ekhumoro за указание QScintilla .. я ценю ур помочь .. – dragfire

2

Я знаю, что этот вопрос был дан ответ, но как, как я и многие другие новые пользователи пришли сюда и будут знать, что варианты упомянутые выше ответы немного продвинутого уровня. Я отправляю этот ответ для дальнейших ссылок для некоторых других новых пользователей

Создание синтаксиса Ярлык с python и Qt является хорошим выбором. Поскольку python - очень мощный язык, а QT - отличная инфраструктура для разработки приложений GUI.
Ярлык синтаксиса - это самое простое выражение регулярного выражения с объектом QTextEdit. Вы просто разбираете выражения Regex, а затем выбираете конкретный QTextFormat для такого регулярного выражения и применяете этот текстовый формат к этому блоку. Вот пример кода простой подсветки синтаксиса, реализованного в Python с использованием Qt4 функции выделения, реализованный в классе syntaxHighlighter Drived из QSyntaxHighlighter

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

Использование этого примера я создал подсветку синтаксиса Assembly в Python с Qt4 для 8051 микроконтроллера.Для получения дополнительной справки и хорошей отправной точки вы найдете can refer to that code.

Смежные вопросы