From e5ba9aaa6e4d2b45c5aa492b7a31e4bd94fbcc4c Mon Sep 17 00:00:00 2001 From: Shunsuke Michii Date: Tue, 4 Oct 2016 02:43:03 +0900 Subject: [PATCH 1/2] Add parsing begin of symbol. --- scanner/scanner.go | 13 ++++++++++++- scanner/scanner_test.go | 38 ++++++++++++++++++++++++++++++++++++++ token/token.go | 1 + 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/scanner/scanner.go b/scanner/scanner.go index 86cd3cb..2e09968 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -405,10 +405,21 @@ func scanDiv(s *Scanner) (token.Token, []byte) { return token.Div, nil } +func isSymbolPrefix(c byte) bool { + return (('!' <= c && c != '#' && c <= '\'') || + ('*' <= c && c != ',' && c != '.' && c <= '9') || + ('<' <= c && c != '?' && c <= '[') || + ('^' <= c && c <= 'z') || + c == '~') +} + func scanColon(s *Scanner) (token.Token, []byte) { - if s.char == ':' { + switch { + case s.char == ':': s.next() return token.Colon2, nil + case isSymbolPrefix(s.char): + return token.SymbolBegin, nil } return token.Colon, nil } diff --git a/scanner/scanner_test.go b/scanner/scanner_test.go index 95137e6..ad3334a 100644 --- a/scanner/scanner_test.go +++ b/scanner/scanner_test.go @@ -324,6 +324,44 @@ var rules = map[string][]struct { {3, token.IdentLocalVar, []byte("b")}, }, + // symbol + ":a": { + {0, token.SymbolBegin, nil}, + {1, token.IdentLocalVar, []byte("a")}, + }, + ":@a": { + {0, token.SymbolBegin, nil}, + {1, token.IdentInstanceVar, []byte("@a")}, + }, + ":@@a": { + {0, token.SymbolBegin, nil}, + {1, token.IdentClassVar, []byte("@@a")}, + }, + ":$a": { + {0, token.SymbolBegin, nil}, + {1, token.IdentGlobalVar, []byte("$a")}, + }, + ":<<": { + {0, token.SymbolBegin, nil}, + {1, token.LShift, nil}, + }, + ":'a'": { + {0, token.SymbolBegin, nil}, + {1, token.String, []byte("a")}, + }, + ":\"a\"": { + {0, token.SymbolBegin, nil}, + {1, token.String, []byte("a")}, + }, + ":\"#{a}\"": { + {0, token.SymbolBegin, nil}, + {1, token.StringPart, nil}, + {2, token.InsertBegin, nil}, + {4, token.IdentLocalVar, []byte("a")}, + {5, token.InsertEnd, nil}, + {6, token.String, nil}, + }, + // keywords "__LINE__": {{0, token.KeywordLINE, nil}}, "__ENCODING__": {{0, token.KeywordENCODING, nil}}, diff --git a/token/token.go b/token/token.go index 966c24e..fb900da 100644 --- a/token/token.go +++ b/token/token.go @@ -27,6 +27,7 @@ const ( HeredocEnd InsertBegin InsertEnd + SymbolBegin // brackets: LParen // ( From b57d6499ef42453cf24ffa89796a9b9ad676c9fa Mon Sep 17 00:00:00 2001 From: Shunsuke Michii Date: Tue, 4 Oct 2016 02:57:48 +0900 Subject: [PATCH 2/2] Make isSymbolPrefix to lookup table. --- scanner/scanner.go | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/scanner/scanner.go b/scanner/scanner.go index 2e09968..a342645 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -405,12 +405,31 @@ func scanDiv(s *Scanner) (token.Token, []byte) { return token.Div, nil } +var symbolPrefixMap = [...]bool{ + '!': true, + '"': true, + '$': true, + '%': true, + '&': true, + '\'': true, + '*': true, + '+': true, + '-': true, + '/': true, + '<': true, + '=': true, + '>': true, + '@': true, + '[': true, + '^': true, + '_': true, + '`': true, + '|': true, + '~': true, +} + func isSymbolPrefix(c byte) bool { - return (('!' <= c && c != '#' && c <= '\'') || - ('*' <= c && c != ',' && c != '.' && c <= '9') || - ('<' <= c && c != '?' && c <= '[') || - ('^' <= c && c <= 'z') || - c == '~') + return token.IsAlnum(c) || symbolPrefixMap[c] } func scanColon(s *Scanner) (token.Token, []byte) {