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