summaryrefslogtreecommitdiff
path: root/context/data/textadept/context/lexers/scite-context-lexer-sas.lua
blob: e365699113736a4cddd06960812d1b43ef9c06b2 (plain)
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
local info = {
    version   = 1.001,
    comment   = "scintilla lpeg lexer for sas",
    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
    copyright = "PRAGMA ADE / ConTeXt Development Team",
    license   = "see context related readme files",
}

-- todo: make this ok for the sas syntax as now it's sql

local P, R, S = lpeg.P, lpeg.R, lpeg.S

local lexer       = require("scite-context-lexer")
local context     = lexer.context
local patterns    = context.patterns

local token       = lexer.token
local exact_match = lexer.exact_match

local saslexer    = lexer.new("sas","scite-context-lexer-sAs")
local whitespace  = saslexer.whitespace

local keywords_standard = {
    "anova" , "data", "run", "proc",
}

local keywords_dialects = {
    "class" , "do", "end" , "int" , "for" , "model" , "rannor" , "to" , "output"
}

local space         = patterns.space -- S(" \n\r\t\f\v")
local any           = patterns.any
local restofline    = patterns.restofline
local startofline   = patterns.startofline

local squote        = P("'")
local dquote        = P('"')
local bquote        = P('`')
local escaped       = P("\\") * P(1)

local begincomment  = P("/*")
local endcomment    = P("*/")

local decimal       = patterns.decimal
local float         = patterns.float
local integer       = P("-")^-1 * decimal

local spacing       = token(whitespace, space^1)
local rest          = token("default", any)

local shortcomment  = token("comment", (P("#") + P("--")) * restofline^0)
local longcomment   = token("comment", begincomment * (1-endcomment)^0 * endcomment^-1)

local identifier    = token("default",lexer.helpers.utfidentifier)

local shortstring   = token("quote",  dquote) -- can be shared
                    * token("string", (escaped + (1-dquote))^0)
                    * token("quote",  dquote)
                    + token("quote",  squote)
                    * token("string", (escaped + (1-squote))^0)
                    * token("quote",  squote)
                    + token("quote",  bquote)
                    * token("string", (escaped + (1-bquote))^0)
                    * token("quote",  bquote)

local p_keywords_s  = exact_match(keywords_standard,nil,true)
local p_keywords_d  = exact_match(keywords_dialects,nil,true)
local keyword_s     = token("keyword", p_keywords_s)
local keyword_d     = token("command", p_keywords_d)

local number        = token("number", float + integer)
local operator      = token("special", S("+-*/%^!=<>;:{}[]().&|?~"))

saslexer._tokenstyles = context.styleset

saslexer._foldpattern = P("/*") + P("*/") + S("{}") -- separate entry else interference

saslexer._foldsymbols = {
    _patterns = {
        "/%*",
        "%*/",
    },
    ["comment"] = {
        ["/*"] =  1,
        ["*/"] = -1,
    }
}

saslexer._rules = {
    { "whitespace",   spacing      },
    { "keyword-s",    keyword_s    },
    { "keyword-d",    keyword_d    },
    { "identifier",   identifier   },
    { "string",       shortstring  },
    { "longcomment",  longcomment  },
    { "shortcomment", shortcomment },
    { "number",       number       },
    { "operator",     operator     },
    { "rest",         rest         },
}

return saslexer