aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyo Nihei <nihei.dev@gmail.com>2021-07-02 00:04:56 +0900
committerRyo Nihei <nihei.dev@gmail.com>2021-07-02 00:15:02 +0900
commit24d9877e822c400240a7e86cf8835971ed969ac7 (patch)
treef5bfca4fb67be35f5eadbda5249d31db79d331f9
parentSimplify syntax of modifiers and semantic actions (diff)
downloadcotia-24d9877e822c400240a7e86cf8835971ed969ac7.tar.gz
cotia-24d9877e822c400240a7e86cf8835971ed969ac7.tar.xz
Prohibit defining identifiers beginning with an underscore
Identifiers beginning with an underscore are used as auto-generated identifiers.
-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