如果你查看源代码SASS 词法分析器 https://github.com/nex3/sass/blob/stable/lib/sass/script/lexer.rb, 你会看到的:
# A hash of regular expressions that are used for tokenizing.
REGULAR_EXPRESSIONS = {
:whitespace => /\s+/,
:comment => COMMENT,
:single_line_comment => SINGLE_LINE_COMMENT,
:variable => /(\$)(#{IDENT})/,
:ident => /(#{IDENT})(\()?/,
:number => /(-)?(?:(\d*\.\d+)|(\d+))([a-zA-Z%]+)?/,
:color => HEXCOLOR,
:bool => /(true|false)\b/,
:null => /null\b/,
:ident_op => %r{(#{Regexp.union(*IDENT_OP_NAMES.map{|s| Regexp.new(Regexp.escape(s) + "(?!#{NMCHAR}|\Z)")})})},
:op => %r{(#{Regexp.union(*OP_NAMES)})},
}
其中引用了IDENT
定义在a中的字符集单独的文件 https://github.com/nex3/sass/blob/e7bd7963e78ca84b216d8e059347d599d178a67f/lib/sass/scss/rx.rb:
s = if Sass::Util.ruby1_8?
'\200-\377'
elsif Sass::Util.macruby?
'\u0080-\uD7FF\uE000-\uFFFD\U00010000-\U0010FFFF'
else
'\u{80}-\u{D7FF}\u{E000}-\u{FFFD}\u{10000}-\u{10FFFF}'
end
H = /[0-9a-fA-F]/
UNICODE = /\\#{H}{1,6}[ \t\r\n\f]?/
NONASCII = /[#{s}]/
ESCAPE = /#{UNICODE}|\\[ -~#{s}]/
NMSTART = /[_a-zA-Z]|#{NONASCII}|#{ESCAPE}/
NMCHAR = /[a-zA-Z0-9_-]|#{NONASCII}|#{ESCAPE}/
IDENT = /-?#{NMSTART}#{NMCHAR}*/
因此,变量名称看起来可以包含:
- 任何 ASCII 字母。
- 任何数字 0-9(只要它不是名称中的第一个字符)。
- 下划线和连字符。
- ASCII 标点符号 (
!"#$%&'()*+,./:;<=>?@[]^{|}~
) 和空格(如果使用反斜杠转义)。
- 范围内的 Unicode 字符
0080-D7FF
, E000-FFFD
, or 10000-10FFFF
.
- Unicode 十六进制转义序列,例如
\00E4
.