scite-context-lexer-sas.lua /size: 3180 b    last modification: 2020-07-01 14:35
1local info = {
2    version   = 1.001,
3    comment   = "scintilla lpeg lexer for sas",
4    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
5    copyright = "PRAGMA ADE / ConTeXt Development Team",
6    license   = "see context related readme files",
7}
8
9-- todo: make this ok for the sas syntax as now it's sql
10
11local P, R, S = lpeg.P, lpeg.R, lpeg.S
12
13local lexer       = require("scite-context-lexer")
14local context     = lexer.context
15local patterns    = context.patterns
16
17local token       = lexer.token
18local exact_match = lexer.exact_match
19
20local saslexer    = lexer.new("sas","scite-context-lexer-sAs")
21local whitespace  = saslexer.whitespace
22
23local keywords_standard = {
24    "anova" , "data", "run", "proc",
25}
26
27local keywords_dialects = {
28    "class" , "do", "end" , "int" , "for" , "model" , "rannor" , "to" , "output"
29}
30
31local space         = patterns.space -- S(" \n\r\t\f\v")
32local any           = patterns.any
33local restofline    = patterns.restofline
34local startofline   = patterns.startofline
35
36local squote        = P("'")
37local dquote        = P('"')
38local bquote        = P('`')
39local escaped       = P("\\") * P(1)
40
41local begincomment  = P("/*")
42local endcomment    = P("*/")
43
44local decimal       = patterns.decimal
45local float         = patterns.float
46local integer       = P("-")^-1 * decimal
47
48local spacing       = token(whitespace, space^1)
49local rest          = token("default", any)
50
51local shortcomment  = token("comment", (P("#") + P("--")) * restofline^0)
52local longcomment   = token("comment", begincomment * (1-endcomment)^0 * endcomment^-1)
53
54local identifier    = token("default",lexer.helpers.utfidentifier)
55
56local shortstring   = token("quote",  dquote) -- can be shared
57                    * token("string", (escaped + (1-dquote))^0)
58                    * token("quote",  dquote)
59                    + token("quote",  squote)
60                    * token("string", (escaped + (1-squote))^0)
61                    * token("quote",  squote)
62                    + token("quote",  bquote)
63                    * token("string", (escaped + (1-bquote))^0)
64                    * token("quote",  bquote)
65
66local p_keywords_s  = exact_match(keywords_standard,nil,true)
67local p_keywords_d  = exact_match(keywords_dialects,nil,true)
68local keyword_s     = token("keyword", p_keywords_s)
69local keyword_d     = token("command", p_keywords_d)
70
71local number        = token("number", float + integer)
72local operator      = token("special", S("+-*/%^!=<>;:{}[]().&|?~"))
73
74saslexer._tokenstyles = context.styleset
75
76saslexer._foldpattern = P("/*") + P("*/") + S("{}") -- separate entry else interference
77
78saslexer._foldsymbols = {
79    _patterns = {
80        "/%*",
81        "%*/",
82    },
83    ["comment"] = {
84        ["/*"] =  1,
85        ["*/"] = -1,
86    }
87}
88
89saslexer._rules = {
90    { "whitespace",   spacing      },
91    { "keyword-s",    keyword_s    },
92    { "keyword-d",    keyword_d    },
93    { "identifier",   identifier   },
94    { "string",       shortstring  },
95    { "longcomment",  longcomment  },
96    { "shortcomment", shortcomment },
97    { "number",       number       },
98    { "operator",     operator     },
99    { "rest",         rest         },
100}
101
102return saslexer
103