1local info = {
2 version = 1.001,
3 comment = "scintilla lpeg lexer for bnf",
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
10
11local global, lpeg = _G, lpeg
12local P, R, S = lpeg.P, lpeg.R, lpeg.S
13
14local lexer = require("scite-context-lexer")
15local context = lexer.context
16local patterns = context.patterns
17
18local token = lexer.token
19local exact_match = lexer.exact_match
20
21local bnflexer = lexer.new("bnf","scite-context-lexer-bnf")
22local whitespace = bnflexer.whitespace
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45local anything = patterns.anything
46local separator = P("|")
47local left = P("<")
48local right = P(">")
49local space = S(" \t\n\r\f")
50local spaces = space^1
51local letter = R("AZ","az")
52local digit = R("09")
53local symbol = S([[| -!#$%&()*+,-./:;>=<?@[\]^_`{}~]])
54local text = (letter + digit + symbol^0)
55local name = letter * (letter + digit + P("-"))^0
56local becomes = P("::=")
57local extra = P("|")
58local single = P("'")
59local double = P('"')
60
61local t_spacing = token(whitespace,space^1)
62local t_term = token("command",left)
63 * token("text",name)
64 * token("command",right)
65local t_text = token("quote",single)
66 * token("text",text)
67 * token("quote",single)
68 + token("quote",double)
69 * token("text",text)
70 * token("quote",double)
71local t_becomes = token("operator",becomes)
72local t_extra = token("extra",extra)
73local t_rest = token("default",anything)
74
75bnflexer._rules = {
76 { "whitespace", t_spacing },
77 { "term", t_term },
78 { "text", t_text },
79 { "becomes", t_becomes },
80 { "extra", t_extra },
81 { "rest", t_rest },
82}
83
84bnflexer._tokenstyles = context.styleset
85
86bnflexer._foldpattern = left + right
87
88bnflexer._foldsymbols = {
89 _patterns = {
90 "<",
91 ">",
92 },
93 ["grouping"] = {
94 ["<"] = 1,
95 [">"] = -1,
96 },
97}
98
99return bnflexer
100 |