| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- #include "syntaxhighlighter.h"
- SyntaxHighlighter::SyntaxHighlighter(QTextDocument *parent)
- : QSyntaxHighlighter(parent)
- {
- HighlightingRule rule;
- keywordFormat.setForeground(Qt::darkBlue);
- keywordFormat.setFontWeight(QFont::Bold);
- QStringList keywordPatterns;
- keywordPatterns << "\\bCREATE\\b" << "\\bMOVE\\b" << "\\bDIE\\b" << "\\bTRANS\\b" << "\\bRTRANS\\b" << "\\bTURN\\b"
- << "\\bJUMP\\b" << "\\bAJUMP\\b" << "\\bBJUMP\\b"
- << "\\bSCAN\\b" << "\\bFARSCAN\\b"
- << "\\bSET\\b" << "\\bADD\\b" << "\\bSUB\\b" << "\\bMUL\\b" << "\\bDIV\\b" << "\\bMOD\\b" << "\\bMIN\\b" << "\\bMAX\\b" << "\\bRANDOM\\b"
- << "\\bIF\\b" << "\\bIFN\\b" << "\\bIFG\\b" << "\\bIFL\\b" << "\\bIFGE\\b" << "\\bIFLE\\b"
- << "\\bINIT\\b" << "\\bBREAK\\b" << "\\bRESUME\\b" << "\\bSEIZE\\b" << "\\bSLEEP\\b" << "\\bQUIT\\b"
- ;
- foreach (const QString &pattern, keywordPatterns) {
- rule.pattern = QRegExp(pattern);
- rule.pattern.setCaseSensitivity(Qt::CaseInsensitive);
- rule.format = keywordFormat;
- highlightingRules.append(rule);
- }
- bankFormat.setFontWeight(QFont::Bold);
- bankFormat.setForeground(Qt::white);
- bankFormat.setBackground(Qt::darkGray);
- rule.pattern = QRegExp("\\s*BANK.*");
- rule.pattern.setCaseSensitivity(Qt::CaseInsensitive);
- rule.format = bankFormat;
- highlightingRules.append(rule);
- singleLineCommentFormat.setForeground(Qt::darkGreen);
- rule.pattern = QRegExp("//[^\n]*");
- rule.format = singleLineCommentFormat;
- highlightingRules.append(rule);
- multiLineCommentFormat.setForeground(Qt::darkGreen);
- commentStartExpression = QRegExp("/\\*");
- commentEndExpression = QRegExp("\\*/");
- }
- void SyntaxHighlighter::highlightBlock(const QString &text)
- {
- foreach (const HighlightingRule &rule, highlightingRules) {
- QRegExp expression(rule.pattern);
- int index = expression.indexIn(text);
- while (index >= 0) {
- int length = expression.matchedLength();
- setFormat(index, length, rule.format);
- index = expression.indexIn(text, index + length);
- }
- }
- setCurrentBlockState(0);
- int startIndex = 0;
- if (previousBlockState() != 1)
- startIndex = commentStartExpression.indexIn(text);
- while (startIndex >= 0) {
- int endIndex = commentEndExpression.indexIn(text, startIndex);
- int commentLength;
- if (endIndex == -1) {
- setCurrentBlockState(1);
- commentLength = text.length() - startIndex;
- } else {
- commentLength = endIndex - startIndex
- + commentEndExpression.matchedLength();
- }
- setFormat(startIndex, commentLength, multiLineCommentFormat);
- startIndex = commentStartExpression.indexIn(text, startIndex + commentLength);
- }
- }
|