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
|