diff --git a/mode/go.py b/mode/go.py index 4bfee0d..8e3d9d2 100644 --- a/mode/go.py +++ b/mode/go.py @@ -16,21 +16,23 @@ chr1 = '[a-zA-Z_]' chr2 = '[a-zA-Z0-9_]' word = chr1 + chr2 + '*' +escaped = [ + PatternRule('escaped', r'\\[abfnrtv\\\'"]'), + PatternRule('octal', r'\\[0-7]{3}'), + PatternRule('hex', r'\\x[a-fA-F0-9]{2}'), + PatternRule('unicode', r'\\u[a-fA-F0-9]{4}'), + PatternRule('unicode', r'\\U[a-fA-F0-9]{8}'), + PatternRule('illegal', r'\\.*'), +] + class StringGrammar(Grammar): - rules = [ - PatternRule('escaped', r'\\[abfnrtv\\\'"]'), - PatternRule('octal', r'\\[0-7]{3}'), - PatternRule('hex', r'\\x[a-fA-F0-9]{2}'), - PatternRule('unicode', r'\\u[a-fA-F0-9]{4}'), - PatternRule('unicode', r'\\U[a-fA-F0-9]{8}'), - PatternRule('illegal', r'\\.*'), - PatternRule('data', r'[^\\"]+'), - ] + rules = escaped + [PatternRule('data', r'[^\\"]+')] + +class CharGrammar(Grammar): + rules = escaped + [PatternRule('data', r"[^\\']+")] class RawStringGrammar(Grammar): - rules = [ - PatternRule('data', '[^`]+'), - ] + rules = [PatternRule('data', '[^`]+')] class GoGrammar(Grammar): rules = [ @@ -51,7 +53,7 @@ class GoGrammar(Grammar): PatternRule('go.integer', r'(?:[1-9][0-9]*|0[0-9]*|0[xX][a-fA-F0-9]+)'), - RegionRule('go.char', "'", StringGrammar, "'"), + RegionRule('go.char', "'", CharGrammar, "'"), RegionRule('go.string', '"', StringGrammar, '"'), RegionRule('go.string', '`', RawStringGrammar, '`'), ]