diff options
author | Ryo Nihei <nihei.dev@gmail.com> | 2021-07-02 00:04:56 +0900 |
---|---|---|
committer | Ryo Nihei <nihei.dev@gmail.com> | 2021-07-02 00:15:02 +0900 |
commit | 24d9877e822c400240a7e86cf8835971ed969ac7 (patch) | |
tree | f5bfca4fb67be35f5eadbda5249d31db79d331f9 | |
parent | Simplify syntax of modifiers and semantic actions (diff) | |
download | cotia-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.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 |