aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--spec/lexer.go3
-rw-r--r--spec/lexer_test.go5
-rw-r--r--spec/syntax_error.go3
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