aboutsummaryrefslogtreecommitdiff
path: root/spec/grammar/parser/syntax_error.go
blob: 719fb9466c0446fec55981a357531d334397105c (plain) (blame)
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
package parser

type SyntaxError struct {
	message string
}

func newSyntaxError(message string) *SyntaxError {
	return &SyntaxError{
		message: message,
	}
}

func (e *SyntaxError) Error() string {
	return e.message
}

var (
	// lexical errors
	synErrIDInvalidChar            = newSyntaxError("an identifier can contain only the lower-case letter, the digits, and the underscore")
	synErrIDInvalidUnderscorePos   = newSyntaxError("the underscore cannot be placed at the beginning or end of an identifier")
	synErrIDConsecutiveUnderscores = newSyntaxError("the underscore cannot be placed consecutively")
	synErrIDInvalidDigitsPos       = newSyntaxError("the digits cannot be placed at the biginning of an identifier")
	synErrUnclosedTerminal         = newSyntaxError("unclosed terminal")
	synErrUnclosedString           = newSyntaxError("unclosed string")
	synErrIncompletedEscSeq        = newSyntaxError("incompleted escape sequence; unexpected EOF following a backslash")
	synErrEmptyPattern             = newSyntaxError("a pattern must include at least one character")
	synErrEmptyString              = newSyntaxError("a string must include at least one character")

	// syntax errors
	synErrInvalidToken           = newSyntaxError("invalid token")
	synErrTopLevelDirNoSemicolon = newSyntaxError("a top-level directive must be followed by ;")
	synErrNoProductionName       = newSyntaxError("a production name is missing")
	synErrNoColon                = newSyntaxError("the colon must precede alternatives")
	synErrNoSemicolon            = newSyntaxError("the semicolon is missing at the last of an alternative")
	synErrLabelWithNoSymbol      = newSyntaxError("a label must follow a symbol")
	synErrNoLabel                = newSyntaxError("an identifier that represents a label is missing after the label marker @")
	synErrNoDirectiveName        = newSyntaxError("a directive needs a name")
	synErrNoOrderedSymbolName    = newSyntaxError("an ordered symbol name is missing")
	synErrUnclosedDirGroup       = newSyntaxError("a directive group must be closed by )")
	synErrPatternInAlt           = newSyntaxError("a pattern literal cannot appear directly in an alternative. instead, please define a terminal symbol with the pattern literal")
	synErrStrayExpOp             = newSyntaxError("an expansion operator ... must be preceded by an identifier")
	synErrInvalidExpOperand      = newSyntaxError("an expansion operator ... can be applied to only an identifier")
	synErrSemicolonNoNewline     = newSyntaxError("a semicolon must be followed by a newline")
	synErrFragmentNoPattern      = newSyntaxError("a fragment needs one pattern element")
)