Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
node-sass
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
楚学文
node-sass
Commits
7eb9753c
Commit
7eb9753c
authored
Mar 15, 2012
by
Aaron Leung
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Const correctness!
parent
193110d6
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
215 additions
and
171 deletions
+215
-171
prelexer.cpp
prelexer.cpp
+66
-61
prelexer.hpp
prelexer.hpp
+109
-108
token.cpp
token.cpp
+38
-1
token.hpp
token.hpp
+2
-1
No files found.
prelexer.cpp
View file @
7eb9753c
...
...
@@ -5,74 +5,74 @@ namespace Sass {
namespace
Prelexer
{
// Matches zero characters (always succeeds without consuming input).
c
har
*
epsilon
(
char
*
src
)
{
c
onst
char
*
epsilon
(
char
*
src
)
{
return
src
;
}
// Matches the empty string.
c
har
*
empty
(
char
*
src
)
{
c
onst
char
*
empty
(
char
*
src
)
{
return
*
src
?
0
:
src
;
}
// Match any single character.
c
har
*
any_char
(
char
*
src
)
{
return
*
src
?
src
++
:
src
;
}
c
onst
char
*
any_char
(
const
char
*
src
)
{
return
*
src
?
src
++
:
src
;
}
// Match a single character satisfying the ctype predicates.
c
har
*
space
(
char
*
src
)
{
return
std
::
isspace
(
*
src
)
?
src
+
1
:
0
;
}
c
har
*
alpha
(
char
*
src
)
{
return
std
::
isalpha
(
*
src
)
?
src
+
1
:
0
;
}
c
har
*
digit
(
char
*
src
)
{
return
std
::
isdigit
(
*
src
)
?
src
+
1
:
0
;
}
c
har
*
xdigit
(
char
*
src
)
{
return
std
::
isxdigit
(
*
src
)
?
src
+
1
:
0
;
}
c
har
*
alnum
(
char
*
src
)
{
return
std
::
isalnum
(
*
src
)
?
src
+
1
:
0
;
}
c
har
*
punct
(
char
*
src
)
{
return
std
::
ispunct
(
*
src
)
?
src
+
1
:
0
;
}
c
onst
char
*
space
(
const
char
*
src
)
{
return
std
::
isspace
(
*
src
)
?
src
+
1
:
0
;
}
c
onst
char
*
alpha
(
const
char
*
src
)
{
return
std
::
isalpha
(
*
src
)
?
src
+
1
:
0
;
}
c
onst
char
*
digit
(
const
char
*
src
)
{
return
std
::
isdigit
(
*
src
)
?
src
+
1
:
0
;
}
c
onst
char
*
xdigit
(
const
char
*
src
)
{
return
std
::
isxdigit
(
*
src
)
?
src
+
1
:
0
;
}
c
onst
char
*
alnum
(
const
char
*
src
)
{
return
std
::
isalnum
(
*
src
)
?
src
+
1
:
0
;
}
c
onst
char
*
punct
(
const
char
*
src
)
{
return
std
::
ispunct
(
*
src
)
?
src
+
1
:
0
;
}
// Match multiple ctype characters.
c
har
*
spaces
(
char
*
src
)
{
return
one_plus
<
space
>
(
src
);
}
c
har
*
alphas
(
char
*
src
)
{
return
one_plus
<
alpha
>
(
src
);
}
c
har
*
digits
(
char
*
src
)
{
return
one_plus
<
digit
>
(
src
);
}
c
har
*
xdigits
(
char
*
src
)
{
return
one_plus
<
xdigit
>
(
src
);
}
c
har
*
alnums
(
char
*
src
)
{
return
one_plus
<
alnum
>
(
src
);
}
c
har
*
puncts
(
char
*
src
)
{
return
one_plus
<
punct
>
(
src
);
}
c
onst
char
*
spaces
(
const
char
*
src
)
{
return
one_plus
<
space
>
(
src
);
}
c
onst
char
*
alphas
(
const
char
*
src
)
{
return
one_plus
<
alpha
>
(
src
);
}
c
onst
char
*
digits
(
const
char
*
src
)
{
return
one_plus
<
digit
>
(
src
);
}
c
onst
char
*
xdigits
(
const
char
*
src
)
{
return
one_plus
<
xdigit
>
(
src
);
}
c
onst
char
*
alnums
(
const
char
*
src
)
{
return
one_plus
<
alnum
>
(
src
);
}
c
onst
char
*
puncts
(
const
char
*
src
)
{
return
one_plus
<
punct
>
(
src
);
}
// Match a line comment.
extern
const
char
slash_slash
[]
=
"//"
;
c
har
*
line_comment
(
char
*
src
)
{
return
to_endl
<
slash_slash
>
(
src
);
}
c
onst
char
*
line_comment
(
const
char
*
src
)
{
return
to_endl
<
slash_slash
>
(
src
);
}
// Match a block comment.
extern
const
char
slash_star
[]
=
"/*"
;
extern
const
char
star_slash
[]
=
"*/"
;
c
har
*
block_comment
(
char
*
src
)
{
c
onst
char
*
block_comment
(
const
char
*
src
)
{
return
delimited_by
<
slash_star
,
star_slash
,
false
>
(
src
);
}
// Match either comment.
c
har
*
comment
(
char
*
src
)
{
c
onst
char
*
comment
(
const
char
*
src
)
{
return
alternatives
<
block_comment
,
line_comment
>
(
src
);
}
// Match double- and single-quoted strings.
c
har
*
double_quoted_string
(
char
*
src
)
{
c
onst
char
*
double_quoted_string
(
const
char
*
src
)
{
return
delimited_by
<
'"'
,
'"'
,
true
>
(
src
);
}
c
har
*
single_quoted_string
(
char
*
src
)
{
c
onst
char
*
single_quoted_string
(
const
char
*
src
)
{
return
delimited_by
<
'\''
,
'\''
,
true
>
(
src
);
}
c
har
*
string_constant
(
char
*
src
)
{
c
onst
char
*
string_constant
(
const
char
*
src
)
{
return
alternatives
<
double_quoted_string
,
single_quoted_string
>
(
src
);
}
// Match interpolants.
extern
const
char
hash_lbrace
[]
=
"#{"
;
extern
const
char
rbrace
[]
=
"}"
;
c
har
*
interpolant
(
char
*
src
)
{
c
onst
char
*
interpolant
(
const
char
*
src
)
{
return
delimited_by
<
hash_lbrace
,
rbrace
,
false
>
(
src
);
}
// Whitespace handling.
c
har
*
optional_spaces
(
char
*
src
)
{
return
optional
<
spaces
>
(
src
);
}
c
har
*
optional_comment
(
char
*
src
)
{
return
optional
<
comment
>
(
src
);
}
c
har
*
spaces_and_comments
(
char
*
src
)
{
c
onst
char
*
optional_spaces
(
const
char
*
src
)
{
return
optional
<
spaces
>
(
src
);
}
c
onst
char
*
optional_comment
(
const
char
*
src
)
{
return
optional
<
comment
>
(
src
);
}
c
onst
char
*
spaces_and_comments
(
const
char
*
src
)
{
return
zero_plus
<
alternatives
<
spaces
,
comment
>
>
(
src
);
}
c
har
*
no_spaces
(
char
*
src
)
{
c
onst
char
*
no_spaces
(
const
char
*
src
)
{
return
negate
<
spaces
>
(
src
);
}
// Match CSS identifiers.
c
har
*
identifier
(
char
*
src
)
{
c
onst
char
*
identifier
(
const
char
*
src
)
{
return
sequence
<
optional
<
exactly
<
'-'
>
>
,
alternatives
<
alpha
,
exactly
<
'_'
>
>
,
zero_plus
<
alternatives
<
alnum
,
...
...
@@ -80,72 +80,77 @@ namespace Sass {
exactly
<
'_'
>
>
>
>
(
src
);
}
// Match CSS '@' keywords.
c
har
*
at_keyword
(
char
*
src
)
{
c
onst
char
*
at_keyword
(
const
char
*
src
)
{
return
sequence
<
exactly
<
'@'
>
,
identifier
>
(
src
);
}
char
*
name
(
char
*
src
)
{
extern
const
char
import_kwd
[]
=
"@import"
;
const
char
*
import
(
const
char
*
src
)
{
return
exactly
<
import_kwd
>
(
src
);
}
const
char
*
name
(
const
char
*
src
)
{
return
one_plus
<
alternatives
<
alnum
,
exactly
<
'-'
>
,
exactly
<
'_'
>
>
>
(
src
);
}
// Match CSS type selectors
c
har
*
namespace_prefix
(
char
*
src
)
{
c
onst
char
*
namespace_prefix
(
const
char
*
src
)
{
return
sequence
<
optional
<
alternatives
<
identifier
,
exactly
<
'*'
>
>
>
,
exactly
<
'|'
>
>
(
src
);
}
c
har
*
type_selector
(
char
*
src
)
{
c
onst
char
*
type_selector
(
const
char
*
src
)
{
return
sequence
<
optional
<
namespace_prefix
>
,
identifier
>
(
src
);
}
c
har
*
universal
(
char
*
src
)
{
c
onst
char
*
universal
(
const
char
*
src
)
{
return
sequence
<
optional
<
namespace_prefix
>
,
exactly
<
'*'
>
>
(
src
);
}
// Match CSS id names.
c
har
*
id_name
(
char
*
src
)
{
c
onst
char
*
id_name
(
const
char
*
src
)
{
return
sequence
<
exactly
<
'#'
>
,
name
>
(
src
);
}
// Match CSS class names.
c
har
*
class_name
(
char
*
src
)
{
c
onst
char
*
class_name
(
const
char
*
src
)
{
return
sequence
<
exactly
<
'.'
>
,
identifier
>
(
src
);
}
// Match CSS numeric constants.
extern
const
char
sign_chars
[]
=
"-+"
;
c
har
*
sign
(
char
*
src
)
{
c
onst
char
*
sign
(
const
char
*
src
)
{
return
class_char
<
sign_chars
>
(
src
);
}
c
har
*
unsigned_number
(
char
*
src
)
{
c
onst
char
*
unsigned_number
(
const
char
*
src
)
{
return
alternatives
<
sequence
<
zero_plus
<
digits
>
,
exactly
<
'.'
>
,
one_plus
<
digits
>
>
,
digits
>
(
src
);
}
c
har
*
number
(
char
*
src
)
{
c
onst
char
*
number
(
const
char
*
src
)
{
return
sequence
<
optional
<
sign
>
,
unsigned_number
>
(
src
);
}
c
har
*
coefficient
(
char
*
src
)
{
c
onst
char
*
coefficient
(
const
char
*
src
)
{
return
alternatives
<
sequence
<
optional
<
sign
>
,
digits
>
,
sign
>
(
src
);
}
c
har
*
binomial
(
char
*
src
)
{
c
onst
char
*
binomial
(
const
char
*
src
)
{
return
sequence
<
optional
<
sign
>
,
optional
<
digits
>
,
exactly
<
'n'
>
,
optional_spaces
,
sign
,
optional_spaces
,
digits
>
(
src
);
}
c
har
*
percentage
(
char
*
src
)
{
c
onst
char
*
percentage
(
const
char
*
src
)
{
return
sequence
<
number
,
exactly
<
'%'
>
>
(
src
);
}
c
har
*
dimension
(
char
*
src
)
{
c
onst
char
*
dimension
(
const
char
*
src
)
{
return
sequence
<
number
,
identifier
>
(
src
);
}
c
har
*
hex
(
char
*
src
)
{
char
*
p
=
sequence
<
exactly
<
'#'
>
,
one_plus
<
xdigit
>
>
(
src
);
c
onst
char
*
hex
(
const
char
*
src
)
{
c
onst
c
har
*
p
=
sequence
<
exactly
<
'#'
>
,
one_plus
<
xdigit
>
>
(
src
);
int
len
=
p
-
src
;
return
(
len
!=
4
&&
len
!=
7
)
?
0
:
p
;
}
// Match CSS uri specifiers.
extern
const
char
url_call
[]
=
"url("
;
c
har
*
uri
(
char
*
src
)
{
c
onst
char
*
uri
(
const
char
*
src
)
{
return
sequence
<
exactly
<
url_call
>
,
optional
<
spaces
>
,
string_constant
,
...
...
@@ -153,20 +158,20 @@ namespace Sass {
exactly
<
')'
>
>
(
src
);
}
// Match CSS pseudo-class/element prefixes.
c
har
*
pseudo_prefix
(
char
*
src
)
{
c
onst
char
*
pseudo_prefix
(
const
char
*
src
)
{
return
sequence
<
exactly
<
':'
>
,
optional
<
exactly
<
':'
>
>
>
(
src
);
}
// Match CSS function call openers.
c
har
*
functional
(
char
*
src
)
{
c
onst
char
*
functional
(
const
char
*
src
)
{
return
sequence
<
identifier
,
exactly
<
'('
>
>
(
src
);
}
// Match CSS 'odd' and 'even' keywords for functional pseudo-classes.
extern
const
char
even_chars
[]
=
"even"
;
extern
const
char
odd_chars
[]
=
"odd"
;
c
har
*
even
(
char
*
src
)
{
c
onst
char
*
even
(
const
char
*
src
)
{
return
exactly
<
even_chars
>
(
src
);
}
c
har
*
odd
(
char
*
src
)
{
c
onst
char
*
odd
(
const
char
*
src
)
{
return
exactly
<
odd_chars
>
(
src
);
}
// Match CSS attribute-matching operators.
...
...
@@ -175,37 +180,37 @@ namespace Sass {
extern
const
char
caret_equal
[]
=
"^="
;
extern
const
char
dollar_equal
[]
=
"$="
;
extern
const
char
star_equal
[]
=
"*="
;
c
har
*
exact_match
(
char
*
src
)
{
return
exactly
<
'='
>
(
src
);
}
c
har
*
class_match
(
char
*
src
)
{
return
exactly
<
tilde_equal
>
(
src
);
}
c
har
*
dash_match
(
char
*
src
)
{
return
exactly
<
pipe_equal
>
(
src
);
}
c
har
*
prefix_match
(
char
*
src
)
{
return
exactly
<
caret_equal
>
(
src
);
}
c
har
*
suffix_match
(
char
*
src
)
{
return
exactly
<
dollar_equal
>
(
src
);
}
c
har
*
substring_match
(
char
*
src
)
{
return
exactly
<
star_equal
>
(
src
);
}
c
onst
char
*
exact_match
(
const
char
*
src
)
{
return
exactly
<
'='
>
(
src
);
}
c
onst
char
*
class_match
(
const
char
*
src
)
{
return
exactly
<
tilde_equal
>
(
src
);
}
c
onst
char
*
dash_match
(
const
char
*
src
)
{
return
exactly
<
pipe_equal
>
(
src
);
}
c
onst
char
*
prefix_match
(
const
char
*
src
)
{
return
exactly
<
caret_equal
>
(
src
);
}
c
onst
char
*
suffix_match
(
const
char
*
src
)
{
return
exactly
<
dollar_equal
>
(
src
);
}
c
onst
char
*
substring_match
(
const
char
*
src
)
{
return
exactly
<
star_equal
>
(
src
);
}
// Match CSS combinators.
c
har
*
adjacent_to
(
char
*
src
)
{
c
onst
char
*
adjacent_to
(
const
char
*
src
)
{
return
sequence
<
optional_spaces
,
exactly
<
'+'
>
>
(
src
);
}
c
har
*
precedes
(
char
*
src
)
{
c
onst
char
*
precedes
(
const
char
*
src
)
{
return
sequence
<
optional_spaces
,
exactly
<
'~'
>
>
(
src
);
}
c
har
*
parent_of
(
char
*
src
)
{
c
onst
char
*
parent_of
(
const
char
*
src
)
{
return
sequence
<
optional_spaces
,
exactly
<
'>'
>
>
(
src
);
}
c
har
*
ancestor_of
(
char
*
src
)
{
c
onst
char
*
ancestor_of
(
const
char
*
src
)
{
return
sequence
<
spaces
,
negate
<
exactly
<
'{'
>
>
>
(
src
);
}
// Match SCSS variable names.
c
har
*
variable
(
char
*
src
)
{
c
onst
char
*
variable
(
const
char
*
src
)
{
return
sequence
<
exactly
<
'$'
>
,
name
>
(
src
);
}
// Path matching functions.
c
har
*
folder
(
char
*
src
)
{
c
onst
char
*
folder
(
const
char
*
src
)
{
return
sequence
<
zero_plus
<
any_char_except
<
'/'
>
>
,
exactly
<
'/'
>
>
(
src
);
}
c
har
*
folders
(
char
*
src
)
{
c
onst
char
*
folders
(
const
char
*
src
)
{
return
zero_plus
<
folder
>
(
src
);
}
}
...
...
prelexer.hpp
View file @
7eb9753c
...
...
@@ -2,17 +2,17 @@ namespace Sass {
namespace
Prelexer
{
typedef
int
(
*
ctype_predicate
)(
int
);
typedef
c
har
*
(
*
prelexer
)(
char
*
);
typedef
c
onst
char
*
(
*
prelexer
)(
const
char
*
);
// Match a single character literal.
template
<
char
pre
>
c
har
*
exactly
(
char
*
src
)
{
c
onst
char
*
exactly
(
const
char
*
src
)
{
return
*
src
==
pre
?
src
+
1
:
0
;
}
// Match a string constant.
template
<
const
char
*
prefix
>
c
har
*
exactly
(
char
*
src
)
{
c
onst
char
*
exactly
(
const
char
*
src
)
{
const
char
*
pre
=
prefix
;
while
(
*
pre
&&
*
src
==
*
pre
)
++
src
,
++
pre
;
return
*
pre
?
0
:
src
;
...
...
@@ -20,13 +20,13 @@ namespace Sass {
// Match a single character that satifies the supplied ctype predicate.
template
<
ctype_predicate
pred
>
c
har
*
class_char
(
char
*
src
)
{
c
onst
char
*
class_char
(
const
char
*
src
)
{
return
pred
(
*
src
)
?
src
+
1
:
0
;
}
// Match a single character that is a member of the supplied class.
template
<
const
char
*
char_class
>
c
har
*
class_char
(
char
*
src
)
{
c
onst
char
*
class_char
(
const
char
*
src
)
{
const
char
*
cc
=
char_class
;
while
(
*
cc
&&
*
src
!=
*
cc
)
++
cc
;
return
*
cc
?
src
+
1
:
0
;
...
...
@@ -34,23 +34,23 @@ namespace Sass {
// Match a sequence of characters that all satisfy the supplied ctype predicate.
template
<
ctype_predicate
pred
>
c
har
*
class_chars
(
char
*
src
)
{
char
*
p
=
src
;
c
onst
char
*
class_chars
(
const
char
*
src
)
{
c
onst
c
har
*
p
=
src
;
while
(
pred
(
*
p
))
++
p
;
return
p
==
src
?
0
:
p
;
}
// Match a sequence of characters that are all members of the supplied class.
template
<
const
char
*
char_class
>
c
har
*
class_chars
(
char
*
src
)
{
char
*
p
=
src
;
c
onst
char
*
class_chars
(
const
char
*
src
)
{
c
onst
c
har
*
p
=
src
;
while
(
class_char
<
char_class
>
(
p
))
++
p
;
return
p
==
src
?
0
:
p
;
}
// Match a sequence of characters up to the next newline.
template
<
const
char
*
prefix
>
c
har
*
to_endl
(
char
*
src
)
{
c
onst
char
*
to_endl
(
const
char
*
src
)
{
if
(
!
(
src
=
exactly
<
prefix
>
(
src
)))
return
0
;
while
(
*
src
&&
*
src
!=
'\n'
)
++
src
;
return
src
;
...
...
@@ -58,10 +58,10 @@ namespace Sass {
// Match a sequence of characters delimited by the supplied chars.
template
<
char
beg
,
char
end
,
bool
esc
>
c
har
*
delimited_by
(
char
*
src
)
{
c
onst
char
*
delimited_by
(
const
char
*
src
)
{
src
=
exactly
<
beg
>
(
src
);
if
(
!
src
)
return
0
;
char
*
stop
;
c
onst
c
har
*
stop
;
while
(
1
)
{
if
(
!*
src
)
return
0
;
stop
=
exactly
<
end
>
(
src
);
...
...
@@ -72,10 +72,10 @@ namespace Sass {
// Match a sequence of characters delimited by the supplied strings.
template
<
const
char
*
beg
,
const
char
*
end
,
bool
esc
>
c
har
*
delimited_by
(
char
*
src
)
{
c
onst
char
*
delimited_by
(
const
char
*
src
)
{
src
=
exactly
<
beg
>
(
src
);
if
(
!
src
)
return
0
;
char
*
stop
;
c
onst
c
har
*
stop
;
while
(
1
)
{
if
(
!*
src
)
return
0
;
stop
=
exactly
<
end
>
(
src
);
...
...
@@ -85,45 +85,45 @@ namespace Sass {
}
// Match any single character.
c
har
*
any_char
(
char
*
src
);
c
onst
char
*
any_char
(
const
char
*
src
);
// Match any single character except the supplied one.
template
<
char
c
>
c
har
*
any_char_except
(
char
*
src
)
{
c
onst
char
*
any_char_except
(
const
char
*
src
)
{
return
(
*
src
&&
*
src
!=
c
)
?
src
+
1
:
0
;
}
// Matches zero characters (always succeeds without consuming input).
c
har
*
epsilon
(
char
*
);
c
onst
char
*
epsilon
(
const
char
*
);
// Matches the empty string.
c
har
*
empty
(
char
*
);
c
onst
char
*
empty
(
const
char
*
);
// Succeeds of the supplied matcher fails, and vice versa.
template
<
prelexer
mx
>
c
har
*
negate
(
char
*
src
)
{
c
onst
char
*
negate
(
const
char
*
src
)
{
return
mx
(
src
)
?
0
:
src
;
}
// Tries the matchers in sequence and returns the first match (or none)
template
<
prelexer
mx1
,
prelexer
mx2
>
c
har
*
alternatives
(
char
*
src
)
{
char
*
rslt
;
c
onst
char
*
alternatives
(
const
char
*
src
)
{
c
onst
c
har
*
rslt
;
(
rslt
=
mx1
(
src
))
||
(
rslt
=
mx2
(
src
));
return
rslt
;
}
// Same as above, but with 3 arguments.
template
<
prelexer
mx1
,
prelexer
mx2
,
prelexer
mx3
>
c
har
*
alternatives
(
char
*
src
)
{
char
*
rslt
;
c
onst
char
*
alternatives
(
const
char
*
src
)
{
c
onst
c
har
*
rslt
;
(
rslt
=
mx1
(
src
))
||
(
rslt
=
mx2
(
src
))
||
(
rslt
=
mx3
(
src
));
return
rslt
;
}
// Same as above, but with 4 arguments.
template
<
prelexer
mx1
,
prelexer
mx2
,
prelexer
mx3
,
prelexer
mx4
>
c
har
*
alternatives
(
char
*
src
)
{
char
*
rslt
;
c
onst
char
*
alternatives
(
const
char
*
src
)
{
c
onst
c
har
*
rslt
;
(
rslt
=
mx1
(
src
))
||
(
rslt
=
mx2
(
src
))
||
(
rslt
=
mx3
(
src
))
||
(
rslt
=
mx4
(
src
));
return
rslt
;
...
...
@@ -132,8 +132,8 @@ namespace Sass {
// Same as above, but with 5 arguments.
template
<
prelexer
mx1
,
prelexer
mx2
,
prelexer
mx3
,
prelexer
mx4
,
prelexer
mx5
>
c
har
*
alternatives
(
char
*
src
)
{
char
*
rslt
;
c
onst
char
*
alternatives
(
const
char
*
src
)
{
c
onst
c
har
*
rslt
;
(
rslt
=
mx1
(
src
))
||
(
rslt
=
mx2
(
src
))
||
(
rslt
=
mx3
(
src
))
||
(
rslt
=
mx4
(
src
))
||
(
rslt
=
mx5
(
src
));
return
rslt
;
...
...
@@ -142,8 +142,8 @@ namespace Sass {
// Same as above, but with 6 arguments.
template
<
prelexer
mx1
,
prelexer
mx2
,
prelexer
mx3
,
prelexer
mx4
,
prelexer
mx5
,
prelexer
mx6
>
c
har
*
alternatives
(
char
*
src
)
{
char
*
rslt
;
c
onst
char
*
alternatives
(
const
char
*
src
)
{
c
onst
c
har
*
rslt
;
(
rslt
=
mx1
(
src
))
||
(
rslt
=
mx2
(
src
))
||
(
rslt
=
mx3
(
src
))
||
(
rslt
=
mx4
(
src
))
||
(
rslt
=
mx5
(
src
))
||
(
rslt
=
mx6
(
src
));
return
rslt
;
...
...
@@ -151,24 +151,24 @@ namespace Sass {
// Tries the matchers in sequence and succeeds if they all succeed.
template
<
prelexer
mx1
,
prelexer
mx2
>
c
har
*
sequence
(
char
*
src
)
{
char
*
rslt
=
src
;
c
onst
char
*
sequence
(
const
char
*
src
)
{
c
onst
c
har
*
rslt
=
src
;
(
rslt
=
mx1
(
rslt
))
&&
(
rslt
=
mx2
(
rslt
));
return
rslt
;
}
// Same as above, but with 3 arguments.
template
<
prelexer
mx1
,
prelexer
mx2
,
prelexer
mx3
>
c
har
*
sequence
(
char
*
src
)
{
char
*
rslt
=
src
;
c
onst
char
*
sequence
(
const
char
*
src
)
{
c
onst
c
har
*
rslt
=
src
;
(
rslt
=
mx1
(
rslt
))
&&
(
rslt
=
mx2
(
rslt
))
&&
(
rslt
=
mx3
(
rslt
));
return
rslt
;
}
// Same as above, but with 4 arguments.
template
<
prelexer
mx1
,
prelexer
mx2
,
prelexer
mx3
,
prelexer
mx4
>
c
har
*
sequence
(
char
*
src
)
{
char
*
rslt
=
src
;
c
onst
char
*
sequence
(
const
char
*
src
)
{
c
onst
c
har
*
rslt
=
src
;
(
rslt
=
mx1
(
rslt
))
&&
(
rslt
=
mx2
(
rslt
))
&&
(
rslt
=
mx3
(
rslt
))
&&
(
rslt
=
mx4
(
rslt
));
return
rslt
;
...
...
@@ -178,8 +178,8 @@ namespace Sass {
template
<
prelexer
mx1
,
prelexer
mx2
,
prelexer
mx3
,
prelexer
mx4
,
prelexer
mx5
>
c
har
*
sequence
(
char
*
src
)
{
char
*
rslt
=
src
;
c
onst
char
*
sequence
(
const
char
*
src
)
{
c
onst
c
har
*
rslt
=
src
;
(
rslt
=
mx1
(
rslt
))
&&
(
rslt
=
mx2
(
rslt
))
&&
(
rslt
=
mx3
(
rslt
))
&&
(
rslt
=
mx4
(
rslt
))
&&
(
rslt
=
mx5
(
rslt
));
...
...
@@ -190,8 +190,8 @@ namespace Sass {
template
<
prelexer
mx1
,
prelexer
mx2
,
prelexer
mx3
,
prelexer
mx4
,
prelexer
mx5
,
prelexer
mx6
>
c
har
*
sequence
(
char
*
src
)
{
char
*
rslt
=
src
;
c
onst
char
*
sequence
(
const
char
*
src
)
{
c
onst
c
har
*
rslt
=
src
;
(
rslt
=
mx1
(
rslt
))
&&
(
rslt
=
mx2
(
rslt
))
&&
(
rslt
=
mx3
(
rslt
))
&&
(
rslt
=
mx4
(
rslt
))
&&
(
rslt
=
mx5
(
rslt
))
&&
(
rslt
=
mx6
(
rslt
));
...
...
@@ -203,8 +203,8 @@ namespace Sass {
prelexer
mx3
,
prelexer
mx4
,
prelexer
mx5
,
prelexer
mx6
,
prelexer
mx7
>
c
har
*
sequence
(
char
*
src
)
{
char
*
rslt
=
src
;
c
onst
char
*
sequence
(
const
char
*
src
)
{
c
onst
c
har
*
rslt
=
src
;
(
rslt
=
mx1
(
rslt
))
&&
(
rslt
=
mx2
(
rslt
))
&&
(
rslt
=
mx3
(
rslt
))
&&
(
rslt
=
mx4
(
rslt
))
&&
(
rslt
=
mx5
(
rslt
))
&&
(
rslt
=
mx6
(
rslt
))
&&
...
...
@@ -214,125 +214,126 @@ namespace Sass {
// Match a pattern or not. Always succeeds.
template
<
prelexer
mx
>
c
har
*
optional
(
char
*
src
)
{
char
*
p
=
mx
(
src
);
c
onst
char
*
optional
(
const
char
*
src
)
{
c
onst
c
har
*
p
=
mx
(
src
);
return
p
?
p
:
src
;
}
// Match zero or more of the supplied pattern
template
<
prelexer
mx
>
c
har
*
zero_plus
(
char
*
src
)
{
char
*
p
=
mx
(
src
);
c
onst
char
*
zero_plus
(
const
char
*
src
)
{
c
onst
c
har
*
p
=
mx
(
src
);
while
(
p
)
src
=
p
,
p
=
mx
(
src
);
return
src
;
}
// Match one or more of the supplied pattern
template
<
prelexer
mx
>
c
har
*
one_plus
(
char
*
src
)
{
char
*
p
=
mx
(
src
);
c
onst
char
*
one_plus
(
const
char
*
src
)
{
c
onst
c
har
*
p
=
mx
(
src
);
if
(
!
p
)
return
0
;
while
(
p
)
src
=
p
,
p
=
mx
(
src
);
return
src
;
}
// Match a single character satisfying the ctype predicates.
c
har
*
space
(
char
*
src
);
c
har
*
alpha
(
char
*
src
);
c
har
*
digit
(
char
*
src
);
c
har
*
xdigit
(
char
*
src
);
c
har
*
alnum
(
char
*
src
);
c
har
*
punct
(
char
*
src
);
c
onst
char
*
space
(
const
char
*
src
);
c
onst
char
*
alpha
(
const
char
*
src
);
c
onst
char
*
digit
(
const
char
*
src
);
c
onst
char
*
xdigit
(
const
char
*
src
);
c
onst
char
*
alnum
(
const
char
*
src
);
c
onst
char
*
punct
(
const
char
*
src
);
// Match multiple ctype characters.
c
har
*
spaces
(
char
*
src
);
c
har
*
alphas
(
char
*
src
);
c
har
*
digits
(
char
*
src
);
c
har
*
xdigits
(
char
*
src
);
c
har
*
alnums
(
char
*
src
);
c
har
*
puncts
(
char
*
src
);
c
onst
char
*
spaces
(
const
char
*
src
);
c
onst
char
*
alphas
(
const
char
*
src
);
c
onst
char
*
digits
(
const
char
*
src
);
c
onst
char
*
xdigits
(
const
char
*
src
);
c
onst
char
*
alnums
(
const
char
*
src
);
c
onst
char
*
puncts
(
const
char
*
src
);
// Match a line comment.
c
har
*
line_comment
(
char
*
src
);
c
onst
char
*
line_comment
(
const
char
*
src
);
// Match a block comment.
c
har
*
block_comment
(
char
*
src
);
c
onst
char
*
block_comment
(
const
char
*
src
);
// Match either.
c
har
*
comment
(
char
*
src
);
c
onst
char
*
comment
(
const
char
*
src
);
// Match double- and single-quoted strings.
c
har
*
double_quoted_string
(
char
*
src
);
c
har
*
single_quoted_string
(
char
*
src
);
c
har
*
string_constant
(
char
*
src
);
c
onst
char
*
double_quoted_string
(
const
char
*
src
);
c
onst
char
*
single_quoted_string
(
const
char
*
src
);
c
onst
char
*
string_constant
(
const
char
*
src
);
// Match interpolants.
c
har
*
interpolant
(
char
*
src
);
c
onst
char
*
interpolant
(
const
char
*
src
);
// Whitespace handling.
c
har
*
optional_spaces
(
char
*
src
);
c
har
*
optional_comment
(
char
*
src
);
c
har
*
spaces_and_comments
(
char
*
src
);
c
har
*
no_spaces
(
char
*
src
);
c
onst
char
*
optional_spaces
(
const
char
*
src
);
c
onst
char
*
optional_comment
(
const
char
*
src
);
c
onst
char
*
spaces_and_comments
(
const
char
*
src
);
c
onst
char
*
no_spaces
(
const
char
*
src
);
// Match a CSS identifier.
c
har
*
identifier
(
char
*
src
);
c
onst
char
*
identifier
(
const
char
*
src
);
// Match CSS '@' keywords.
char
*
at_keyword
(
char
*
src
);
const
char
*
at_keyword
(
const
char
*
src
);
const
char
*
import
(
const
char
*
src
);
// Match CSS type selectors
c
har
*
namespace_prefix
(
char
*
src
);
c
har
*
type_selector
(
char
*
src
);
c
har
*
universal
(
char
*
src
);
c
onst
char
*
namespace_prefix
(
const
char
*
src
);
c
onst
char
*
type_selector
(
const
char
*
src
);
c
onst
char
*
universal
(
const
char
*
src
);
// Match CSS id names.
c
har
*
id_name
(
char
*
src
);
c
onst
char
*
id_name
(
const
char
*
src
);
// Match CSS class names.
c
har
*
class_name
(
char
*
src
);
c
onst
char
*
class_name
(
const
char
*
src
);
// Match CSS numeric constants.
c
har
*
sign
(
char
*
src
);
c
har
*
unsigned_number
(
char
*
src
);
c
har
*
number
(
char
*
src
);
c
har
*
coefficient
(
char
*
src
);
c
har
*
binomial
(
char
*
src
);
c
har
*
percentage
(
char
*
src
);
c
har
*
dimension
(
char
*
src
);
c
har
*
hex
(
char
*
src
);
c
onst
char
*
sign
(
const
char
*
src
);
c
onst
char
*
unsigned_number
(
const
char
*
src
);
c
onst
char
*
number
(
const
char
*
src
);
c
onst
char
*
coefficient
(
const
char
*
src
);
c
onst
char
*
binomial
(
const
char
*
src
);
c
onst
char
*
percentage
(
const
char
*
src
);
c
onst
char
*
dimension
(
const
char
*
src
);
c
onst
char
*
hex
(
const
char
*
src
);
// Match CSS uri specifiers.
c
har
*
uri
(
char
*
src
);
c
onst
char
*
uri
(
const
char
*
src
);
// Match CSS pseudo-class/element prefixes
c
har
*
pseudo_prefix
(
char
*
src
);
c
onst
char
*
pseudo_prefix
(
const
char
*
src
);
// Match CSS function call openers.
c
har
*
functional
(
char
*
src
);
c
onst
char
*
functional
(
const
char
*
src
);
// Match CSS 'odd' and 'even' keywords for functional pseudo-classes.
c
har
*
even
(
char
*
src
);
c
har
*
odd
(
char
*
src
);
c
onst
char
*
even
(
const
char
*
src
);
c
onst
char
*
odd
(
const
char
*
src
);
// Match CSS attribute-matching operators.
c
har
*
exact_match
(
char
*
src
);
c
har
*
class_match
(
char
*
src
);
c
har
*
dash_match
(
char
*
src
);
c
har
*
prefix_match
(
char
*
src
);
c
har
*
suffix_match
(
char
*
src
);
c
har
*
substring_match
(
char
*
src
);
c
onst
char
*
exact_match
(
const
char
*
src
);
c
onst
char
*
class_match
(
const
char
*
src
);
c
onst
char
*
dash_match
(
const
char
*
src
);
c
onst
char
*
prefix_match
(
const
char
*
src
);
c
onst
char
*
suffix_match
(
const
char
*
src
);
c
onst
char
*
substring_match
(
const
char
*
src
);
// Match CSS combinators.
c
har
*
adjacent_to
(
char
*
src
);
c
har
*
precedes
(
char
*
src
);
c
har
*
parent_of
(
char
*
src
);
c
har
*
ancestor_of
(
char
*
src
);
c
onst
char
*
adjacent_to
(
const
char
*
src
);
c
onst
char
*
precedes
(
const
char
*
src
);
c
onst
char
*
parent_of
(
const
char
*
src
);
c
onst
char
*
ancestor_of
(
const
char
*
src
);
// Match SCSS variable names.
c
har
*
variable
(
char
*
src
);
c
onst
char
*
variable
(
const
char
*
src
);
// Path matching functions.
c
har
*
folder
(
char
*
src
);
c
har
*
folders
(
char
*
src
);
c
onst
char
*
folder
(
const
char
*
src
);
c
onst
char
*
folders
(
const
char
*
src
);
// Utility functions for finding and counting characters in a string.
template
<
char
c
>
c
har
*
find_first
(
char
*
src
)
{
c
onst
char
*
find_first
(
const
char
*
src
)
{
while
(
*
src
&&
*
src
!=
c
)
++
src
;
return
*
src
?
src
:
0
;
}
template
<
prelexer
mx
>
c
har
*
find_first
(
char
*
src
)
{
c
onst
char
*
find_first
(
const
char
*
src
)
{
while
(
*
src
&&
!
mx
(
src
))
++
src
;
return
*
src
?
src
:
0
;
}
template
<
char
c
>
unsigned
int
count_interval
(
c
har
*
beg
,
char
*
end
)
{
unsigned
int
count_interval
(
c
onst
char
*
beg
,
const
char
*
end
)
{
unsigned
int
counter
=
0
;
while
(
beg
<
end
&&
*
beg
)
{
if
(
*
beg
==
c
)
++
counter
;
...
...
@@ -341,10 +342,10 @@ namespace Sass {
return
counter
;
}
template
<
prelexer
mx
>
unsigned
int
count_interval
(
c
har
*
beg
,
char
*
end
)
{
unsigned
int
count_interval
(
c
onst
char
*
beg
,
const
char
*
end
)
{
unsigned
int
counter
=
0
;
while
(
beg
<
end
&&
*
beg
)
{
char
*
p
;
c
onst
c
har
*
p
;
if
(
p
=
mx
(
beg
))
{
++
counter
;
beg
=
p
;
...
...
token.cpp
View file @
7eb9753c
...
...
@@ -5,7 +5,44 @@ namespace Sass {
Token
::
Token
(
const
char
*
begin
,
const
char
*
end
)
:
begin
(
begin
),
end
(
end
)
{
}
void
Token
::
stream_unquoted
(
std
::
stringstream
&
buf
)
const
{
string
Token
::
unquote
()
const
{
string
result
;
const
char
*
p
=
begin
;
if
(
*
begin
==
'\''
||
*
begin
==
'"'
)
{
++
p
;
while
(
p
<
end
)
{
if
(
*
p
==
'\\'
)
{
switch
(
*
(
++
p
))
{
case
'n'
:
result
+=
'\n'
;
break
;
case
't'
:
result
+=
'\t'
;
break
;
case
'b'
:
result
+=
'\b'
;
break
;
case
'r'
:
result
+=
'\r'
;
break
;
case
'f'
:
result
+=
'\f'
;
break
;
case
'v'
:
result
+=
'\v'
;
break
;
case
'a'
:
result
+=
'\a'
;
break
;
case
'\\'
:
result
+=
'\\'
;
break
;
default
:
result
+=
*
p
;
break
;
}
}
else
if
(
p
==
end
-
1
)
{
return
result
;
}
else
{
result
+=
*
p
;
}
++
p
;
}
return
result
;
}
else
{
while
(
p
<
end
)
{
result
+=
*
(
p
++
);
}
return
result
;
}
}
void
Token
::
unquote_to_stream
(
std
::
stringstream
&
buf
)
const
{
const
char
*
p
=
begin
;
if
(
*
begin
==
'\''
||
*
begin
==
'"'
)
{
++
p
;
...
...
token.hpp
View file @
7eb9753c
...
...
@@ -15,7 +15,8 @@ namespace Sass {
inline
operator
string
()
const
{
return
string
(
begin
,
end
-
begin
);
}
void
stream_unquoted
(
std
::
stringstream
&
buf
)
const
;
string
unquote
()
const
;
void
unquote_to_stream
(
std
::
stringstream
&
buf
)
const
;
bool
operator
<
(
const
Token
&
rhs
)
const
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment