1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
     100
     101
     102
     103
     104
     105
     106
#include <f77crash/highlight.h>

enum Keyword {
    Void          = 0,
    Identifier    = 1,
    Statement     = 2,
    Comment       = 3,
    Constant      = 4,
    String        = 5,
    UnitStatement = 6,
    Type          = 7,
    _numKeywords  = 8
};

static std::string  tag[_numKeywords];
static Keyword      keyword[NUM_TOKENS+1];

void
initHighlight()
{
    tag[Void]              = std::string("");
    tag[Identifier]        = std::string("IDENTIFIER");
    tag[Statement]         = std::string("STATEMENT");
    tag[Comment]           = std::string("COMMENT");
    tag[Constant]          = std::string("CONSTANT");
    tag[String]            = std::string("STRING");
    tag[UnitStatement]     = std::string("UNITSTATEMENT");
    tag[Type]              = std::string("TYPE");

    keyword[SCOMMENT]      = Comment;

    keyword[SCALL]         = Identifier;

    keyword[SDO]           = Statement;
    keyword[SENDDO]        = Statement;
    keyword[SLOGIF]        = Statement;
    keyword[SENDIF]        = Statement;
    keyword[SELSEIF]       = Statement;
    keyword[SELSE]         = Statement;
    keyword[STHEN]         = Statement;
    keyword[SEQUALS]       = Statement;
    keyword[SCONTINUE]     = Statement;
    keyword[SSTOP]         = Statement;
    keyword[SFORMAT]       = Statement;
    keyword[SREAD]         = Statement;
    keyword[SOPEN]         = Statement;
    keyword[SWRITE]        = Statement;
    keyword[SNE]           = Statement;
    keyword[SOR]           = Statement;
    keyword[SAND]          = Statement;
    keyword[SEQ]           = Statement;
    keyword[SLT]           = Statement;
    keyword[SLE]           = Statement;
    keyword[SGT]           = Statement;
    keyword[SGE]           = Statement;
    keyword[SNOT]          = Statement;
    keyword[SMINUS]        = Statement;
    keyword[SPLUS]         = Statement;
    keyword[SSTAR]         = Statement;
    keyword[SSLASH]        = Statement;
    keyword[SRETURN]       = Statement;
    keyword[SGOTO]         = Statement;

    keyword[STRUE]         = Constant;
    keyword[SFALSE]        = Constant;
    keyword[SICON]         = Constant;
    keyword[SRCON]         = Constant;
    keyword[SDCON]         = Constant;
    keyword[SBITCON]       = Constant;
    keyword[SOCTCON]       = Constant;
    keyword[SHEXCON]       = Constant;

    keyword[SHOLLERITH]    = String;

    keyword[SPROGRAM]      = UnitStatement;
    keyword[SSUBROUTINE]   = UnitStatement;
    keyword[SRECURSIVE]    = UnitStatement;
    keyword[SEND]          = UnitStatement;

    keyword[SCOMMON]       = Type;
    keyword[SDATA]         = Type;
    keyword[SIMPLICIT]     = Type;
    keyword[SIMPLICITNONE] = Type;
    keyword[SINTEGER]      = Type;
    keyword[SCHARACTER]    = Type;
    keyword[SDOUBLE]       = Type;
    keyword[SDCOMPLEX]     = Type;
    keyword[SREAL]         = Type;
    keyword[SCOMPLEX]      = Type;
    keyword[SLOGICAL]      = Type;
    keyword[SPARAM]        = Type;
    keyword[SEXTERNAL]     = Type;
    keyword[SINTRINSIC]    = Type;
}

bool
isHighlighted(int tokenId)
{
    return keyword[tokenId] != Void;
}

const std::string &
getHighlightTag(int tokenId)
{
    return tag[keyword[tokenId]];
}