blob: b8539e3452847bf30678b395e0708a89b7f12b91 (
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
|
// Package lang provides tokens for possibly multiple languages.
package lang
// Lexical properties of tokens to allow scanning.
const (
CharIllegal = 1 << iota
CharOp
CharNum
CharAlpha
CharSep
CharLineSep
CharGroupSep
CharStr
CharBlock
StrEsc
StrNonl
ExcludeEnd // exclude end delimiter from content
EosValidEnd // end of input string terminates block or string token
)
// ASCIILen is the length of the ASCII characters set.
const ASCIILen = 1 << 7 // 128
// Associativity represent the associativity rule of an operator.
type Associativity int
// Associativity kinds for operators.
const (
Aboth Associativity = iota // both left and right associative
Aleft // left associative only
Aright // right associative only
Anon // non associative
)
// TokenProp represent token properties for parsing.
type TokenProp struct {
Token
SkipSemi bool // automatic semicolon insertion after newline
Precedence int // operator precedence
Associativity //
HasInit bool // true if may have an init clause
}
// Spec represents the language specification for scanning.
type Spec struct {
CharProp [ASCIILen]uint // special Character properties
End map[string]string // end delimiters, indexed by start
BlockProp map[string]uint // block properties
Tokens map[string]Token // token per string
TokenProps []TokenProp // token properties, indexed by token
DotNum bool // true if a number can start with '.'
IdentASCII bool // true if an identifier can be in ASCII only
NumUnder bool // true if a number can contain _ character
// TokenProps map[string]TokenProp // token properties
}
|