diff options
-rw-r--r-- | spec/lexer.go | 3 | ||||
-rw-r--r-- | spec/lexer_test.go | 5 | ||||
-rw-r--r-- | spec/syntax_error.go | 3 |
3 files changed, 10 insertions, 1 deletions
diff --git a/spec/lexer.go b/spec/lexer.go index 2be3918..a1bd6fc 100644 --- a/spec/lexer.go +++ b/spec/lexer.go @@ -160,6 +160,9 @@ func (l *lexer) lexAndSkipWSs() (*token, error) { case "kw_fragment": return newSymbolToken(tokenKindKWFragment), nil case "identifier": + if strings.HasPrefix(tok.Text(), "_") { + return nil, synErrAutoGenID + } return newIDToken(tok.Text()), nil case "terminal_open": var b strings.Builder diff --git a/spec/lexer_test.go b/spec/lexer_test.go index 2dc346e..0209b59 100644 --- a/spec/lexer_test.go +++ b/spec/lexer_test.go @@ -78,6 +78,11 @@ bar // This is the fourth comment. }, }, { + caption: "identifiers beginning with an underscore are not allowed because they are used only auto-generated identifiers", + src: `_abc`, + err: synErrAutoGenID, + }, + { caption: "an unclosed terminal is not a valid token", src: `"abc`, err: synErrUnclosedTerminal, diff --git a/spec/syntax_error.go b/spec/syntax_error.go index cefde12..59ef62d 100644 --- a/spec/syntax_error.go +++ b/spec/syntax_error.go @@ -18,9 +18,10 @@ func (e *SyntaxError) Error() string { var ( // lexical errors + synErrAutoGenID = newSyntaxError("you cannot define an identifier beginning with an underscore") synErrUnclosedTerminal = newSyntaxError("unclosed terminal") synErrInvalidEscSeq = newSyntaxError("invalid escape sequence") - synErrIncompletedEscSeq = newSyntaxError("incompleted escape sequence; unexpected EOF following \\") + synErrIncompletedEscSeq = newSyntaxError("incompleted escape sequence; unexpected EOF following a backslash") synErrZeroPos = newSyntaxError("a position must be greater than or equal to 1") // syntax errors |