syntaxhighlighter.cpp 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include "syntaxhighlighter.h"
  2. SyntaxHighlighter::SyntaxHighlighter(QTextDocument *parent)
  3. : QSyntaxHighlighter(parent)
  4. {
  5. HighlightingRule rule;
  6. rule.pattern.setCaseSensitivity(Qt::CaseInsensitive);
  7. QStringList instructionPatterns;
  8. instructionPatterns
  9. << "\\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. instructionFormat.setForeground(Qt::darkBlue);
  17. instructionFormat.setFontWeight(QFont::Bold);
  18. foreach (const QString &pattern, instructionPatterns) {
  19. rule.pattern = QRegExp(pattern);
  20. rule.pattern.setCaseSensitivity(Qt::CaseInsensitive);
  21. rule.format = instructionFormat;
  22. highlightingRules.append(rule);
  23. }
  24. QStringList variablePatterns;
  25. variablePatterns
  26. << "#1\\b" << "#2\\b" << "#3\\b" << "#4\\b" << "#5\\b" << "#6\\b" << "#7\\b" << "#8\\b" << "#9\\b" << "#10\\b"
  27. << "#11\\b" << "#12\\b" << "#13\\b" << "#14\\b" << "#15\\b" << "#16\\b" << "#17\\b" << "#18\\b" << "#19\\b" << "#20\\b"
  28. << "#Active\\b" << "\\\\$Banks\\b" << "\\\\$InstrSet\\b" << "\\\\$Mobile\\b" << "\\\\$Age\\b" << "\\\\$Tasks\\b" << "\\\\$Generation\\b" << "\\\\$ID\\b"
  29. << "%Active\\b" << "%Banks\\b" << "%InstrSet\\b" << "%Mobile\\b" << "%Age\\b" << "%Tasks\\b" << "%Generation\\b"
  30. << "#Pub\\b" << "#Team\\b"
  31. << "\\\\$Own\\b" << "\\\\$Others\\b" << "\\\\$Fields\\b" << "\\\\$Time\\b" << "\\\\$Timeout\\b"
  32. ;
  33. variableFormat.setForeground(Qt::darkRed);
  34. variableFormat.setFontWeight(QFont::Normal);
  35. variableFormat.setFontItalic(true);
  36. foreach (const QString &pattern, variablePatterns) {
  37. rule.pattern = QRegExp(pattern);
  38. rule.pattern.setCaseSensitivity(Qt::CaseInsensitive);
  39. rule.format = variableFormat;
  40. highlightingRules.append(rule);
  41. }
  42. bankFormat.setFontWeight(QFont::Bold);
  43. bankFormat.setForeground(Qt::white);
  44. bankFormat.setBackground(Qt::darkGray);
  45. rule.pattern = QRegExp("\\s*BANK.*");
  46. rule.format = bankFormat;
  47. highlightingRules.append(rule);
  48. singleLineCommentFormat.setForeground(Qt::darkGreen);
  49. rule.pattern = QRegExp("//[^\n]*");
  50. rule.format = singleLineCommentFormat;
  51. highlightingRules.append(rule);
  52. multiLineCommentFormat.setForeground(Qt::darkGreen);
  53. commentStartExpression = QRegExp("/\\*");
  54. commentEndExpression = QRegExp("\\*/");
  55. }
  56. void SyntaxHighlighter::highlightBlock(const QString &text)
  57. {
  58. foreach (const HighlightingRule &rule, highlightingRules) {
  59. QRegExp expression(rule.pattern);
  60. int index = expression.indexIn(text);
  61. while (index >= 0) {
  62. int length = expression.matchedLength();
  63. setFormat(index, length, rule.format);
  64. index = expression.indexIn(text, index + length);
  65. }
  66. }
  67. setCurrentBlockState(0);
  68. int startIndex = 0;
  69. if (previousBlockState() != 1)
  70. startIndex = commentStartExpression.indexIn(text);
  71. while (startIndex >= 0) {
  72. int endIndex = commentEndExpression.indexIn(text, startIndex);
  73. int commentLength;
  74. if (endIndex == -1) {
  75. setCurrentBlockState(1);
  76. commentLength = text.length() - startIndex;
  77. } else {
  78. commentLength = endIndex - startIndex
  79. + commentEndExpression.matchedLength();
  80. }
  81. setFormat(startIndex, commentLength, multiLineCommentFormat);
  82. startIndex = commentStartExpression.indexIn(text, startIndex + commentLength);
  83. }
  84. }