syntaxhighlighter.cpp 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "syntaxhighlighter.h"
  2. SyntaxHighlighter::SyntaxHighlighter(QTextDocument *parent)
  3. : QSyntaxHighlighter(parent)
  4. {
  5. HighlightingRule rule;
  6. keywordFormat.setForeground(Qt::darkBlue);
  7. keywordFormat.setFontWeight(QFont::Bold);
  8. QStringList keywordPatterns;
  9. keywordPatterns << "\\bCREATE\\b" << "\\bMOVE\\b" << "\\bDIE\\b" << "\\bTRANS\\b" << "\\bRTRANS\\b" << "\\bTURN\\b"
  10. << "\\bJUMP\\b" << "\\bAJUMP\\b" << "\\bBJUMP\\b"
  11. << "\\bSCAN\\b" << "\\bFARSCAN\\b"
  12. << "\\bSET\\b" << "\\bADD\\b" << "\\bSUB\\b" << "\\bMUL\\b" << "\\bDIV\\b" << "\\bMOD\\b" << "\\bMIN\\b" << "\\bMAX\\b" << "\\bRANDOM\\b"
  13. << "\\bIF\\b" << "\\bIFN\\b" << "\\bIFG\\b" << "\\bIFL\\b" << "\\bIFGE\\b" << "\\bIFLE\\b"
  14. << "\\bINIT\\b" << "\\bBREAK\\b" << "\\bRESUME\\b" << "\\bSEIZE\\b" << "\\bSLEEP\\b" << "\\bQUIT\\b"
  15. ;
  16. foreach (const QString &pattern, keywordPatterns) {
  17. rule.pattern = QRegExp(pattern);
  18. rule.pattern.setCaseSensitivity(Qt::CaseInsensitive);
  19. rule.format = keywordFormat;
  20. highlightingRules.append(rule);
  21. }
  22. bankFormat.setFontWeight(QFont::Bold);
  23. bankFormat.setForeground(Qt::white);
  24. bankFormat.setBackground(Qt::darkGray);
  25. rule.pattern = QRegExp("\\s*BANK.*");
  26. rule.pattern.setCaseSensitivity(Qt::CaseInsensitive);
  27. rule.format = bankFormat;
  28. highlightingRules.append(rule);
  29. singleLineCommentFormat.setForeground(Qt::darkGreen);
  30. rule.pattern = QRegExp("//[^\n]*");
  31. rule.format = singleLineCommentFormat;
  32. highlightingRules.append(rule);
  33. multiLineCommentFormat.setForeground(Qt::darkGreen);
  34. commentStartExpression = QRegExp("/\\*");
  35. commentEndExpression = QRegExp("\\*/");
  36. }
  37. void SyntaxHighlighter::highlightBlock(const QString &text)
  38. {
  39. foreach (const HighlightingRule &rule, highlightingRules) {
  40. QRegExp expression(rule.pattern);
  41. int index = expression.indexIn(text);
  42. while (index >= 0) {
  43. int length = expression.matchedLength();
  44. setFormat(index, length, rule.format);
  45. index = expression.indexIn(text, index + length);
  46. }
  47. }
  48. setCurrentBlockState(0);
  49. int startIndex = 0;
  50. if (previousBlockState() != 1)
  51. startIndex = commentStartExpression.indexIn(text);
  52. while (startIndex >= 0) {
  53. int endIndex = commentEndExpression.indexIn(text, startIndex);
  54. int commentLength;
  55. if (endIndex == -1) {
  56. setCurrentBlockState(1);
  57. commentLength = text.length() - startIndex;
  58. } else {
  59. commentLength = endIndex - startIndex
  60. + commentEndExpression.matchedLength();
  61. }
  62. setFormat(startIndex, commentLength, multiLineCommentFormat);
  63. startIndex = commentStartExpression.indexIn(text, startIndex + commentLength);
  64. }
  65. }