sassc 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.gitmodules +3 -0
- data/.travis.yml +9 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +24 -0
- data/Rakefile +21 -0
- data/ext/libsass/.editorconfig +15 -0
- data/ext/libsass/.gitattributes +2 -0
- data/ext/libsass/.gitignore +61 -0
- data/ext/libsass/.travis.yml +38 -0
- data/ext/libsass/COPYING +25 -0
- data/ext/libsass/INSTALL +1 -0
- data/ext/libsass/LICENSE +25 -0
- data/ext/libsass/Makefile +223 -0
- data/ext/libsass/Makefile.am +145 -0
- data/ext/libsass/Readme.md +93 -0
- data/ext/libsass/appveyor.yml +76 -0
- data/ext/libsass/ast.cpp +581 -0
- data/ext/libsass/ast.hpp +1949 -0
- data/ext/libsass/ast_def_macros.hpp +16 -0
- data/ext/libsass/ast_factory.hpp +87 -0
- data/ext/libsass/ast_fwd_decl.hpp +72 -0
- data/ext/libsass/b64/cencode.h +32 -0
- data/ext/libsass/b64/encode.h +77 -0
- data/ext/libsass/backtrace.hpp +81 -0
- data/ext/libsass/base64vlq.cpp +43 -0
- data/ext/libsass/base64vlq.hpp +28 -0
- data/ext/libsass/bind.cpp +187 -0
- data/ext/libsass/bind.hpp +18 -0
- data/ext/libsass/cencode.c +102 -0
- data/ext/libsass/color_names.hpp +324 -0
- data/ext/libsass/configure.ac +130 -0
- data/ext/libsass/constants.cpp +144 -0
- data/ext/libsass/constants.hpp +145 -0
- data/ext/libsass/context.cpp +507 -0
- data/ext/libsass/context.hpp +150 -0
- data/ext/libsass/contextualize.cpp +157 -0
- data/ext/libsass/contextualize.hpp +65 -0
- data/ext/libsass/copy_c_str.cpp +13 -0
- data/ext/libsass/copy_c_str.hpp +5 -0
- data/ext/libsass/debug.hpp +39 -0
- data/ext/libsass/environment.hpp +75 -0
- data/ext/libsass/error_handling.cpp +28 -0
- data/ext/libsass/error_handling.hpp +28 -0
- data/ext/libsass/eval.cpp +1149 -0
- data/ext/libsass/eval.hpp +80 -0
- data/ext/libsass/expand.cpp +430 -0
- data/ext/libsass/expand.hpp +77 -0
- data/ext/libsass/extconf.rb +6 -0
- data/ext/libsass/extend.cpp +1962 -0
- data/ext/libsass/extend.hpp +50 -0
- data/ext/libsass/file.cpp +291 -0
- data/ext/libsass/file.hpp +18 -0
- data/ext/libsass/functions.cpp +1565 -0
- data/ext/libsass/functions.hpp +187 -0
- data/ext/libsass/inspect.cpp +727 -0
- data/ext/libsass/inspect.hpp +108 -0
- data/ext/libsass/json.cpp +1411 -0
- data/ext/libsass/json.hpp +117 -0
- data/ext/libsass/kwd_arg_macros.hpp +23 -0
- data/ext/libsass/m4/.gitkeep +0 -0
- data/ext/libsass/mapping.hpp +17 -0
- data/ext/libsass/memory_manager.hpp +54 -0
- data/ext/libsass/node.cpp +251 -0
- data/ext/libsass/node.hpp +122 -0
- data/ext/libsass/operation.hpp +153 -0
- data/ext/libsass/output_compressed.cpp +401 -0
- data/ext/libsass/output_compressed.hpp +95 -0
- data/ext/libsass/output_nested.cpp +364 -0
- data/ext/libsass/output_nested.hpp +108 -0
- data/ext/libsass/parser.cpp +2016 -0
- data/ext/libsass/parser.hpp +264 -0
- data/ext/libsass/paths.hpp +69 -0
- data/ext/libsass/position.hpp +22 -0
- data/ext/libsass/posix/getopt.c +562 -0
- data/ext/libsass/posix/getopt.h +95 -0
- data/ext/libsass/prelexer.cpp +688 -0
- data/ext/libsass/prelexer.hpp +513 -0
- data/ext/libsass/remove_placeholders.cpp +59 -0
- data/ext/libsass/remove_placeholders.hpp +43 -0
- data/ext/libsass/res/resource.rc +35 -0
- data/ext/libsass/sass.cpp +33 -0
- data/ext/libsass/sass.h +60 -0
- data/ext/libsass/sass2scss.cpp +834 -0
- data/ext/libsass/sass2scss.h +110 -0
- data/ext/libsass/sass_context.cpp +709 -0
- data/ext/libsass/sass_context.h +120 -0
- data/ext/libsass/sass_functions.cpp +137 -0
- data/ext/libsass/sass_functions.h +90 -0
- data/ext/libsass/sass_interface.cpp +277 -0
- data/ext/libsass/sass_interface.h +97 -0
- data/ext/libsass/sass_util.cpp +136 -0
- data/ext/libsass/sass_util.hpp +259 -0
- data/ext/libsass/sass_values.cpp +337 -0
- data/ext/libsass/sass_values.h +124 -0
- data/ext/libsass/script/bootstrap +10 -0
- data/ext/libsass/script/branding +10 -0
- data/ext/libsass/script/ci-build-libsass +72 -0
- data/ext/libsass/script/ci-install-compiler +4 -0
- data/ext/libsass/script/ci-install-deps +19 -0
- data/ext/libsass/script/ci-report-coverage +25 -0
- data/ext/libsass/script/coveralls-debug +32 -0
- data/ext/libsass/script/spec +5 -0
- data/ext/libsass/script/tap-driver +652 -0
- data/ext/libsass/script/tap-runner +1 -0
- data/ext/libsass/source_map.cpp +133 -0
- data/ext/libsass/source_map.hpp +46 -0
- data/ext/libsass/subset_map.hpp +145 -0
- data/ext/libsass/support/libsass.pc.in +11 -0
- data/ext/libsass/test-driver +127 -0
- data/ext/libsass/test/test_node.cpp +98 -0
- data/ext/libsass/test/test_paths.cpp +29 -0
- data/ext/libsass/test/test_selector_difference.cpp +28 -0
- data/ext/libsass/test/test_specificity.cpp +28 -0
- data/ext/libsass/test/test_subset_map.cpp +472 -0
- data/ext/libsass/test/test_superselector.cpp +71 -0
- data/ext/libsass/test/test_unification.cpp +33 -0
- data/ext/libsass/to_c.cpp +61 -0
- data/ext/libsass/to_c.hpp +44 -0
- data/ext/libsass/to_string.cpp +29 -0
- data/ext/libsass/to_string.hpp +32 -0
- data/ext/libsass/token.hpp +32 -0
- data/ext/libsass/units.cpp +54 -0
- data/ext/libsass/units.hpp +10 -0
- data/ext/libsass/utf8.h +34 -0
- data/ext/libsass/utf8/checked.h +327 -0
- data/ext/libsass/utf8/core.h +329 -0
- data/ext/libsass/utf8/unchecked.h +228 -0
- data/ext/libsass/utf8_string.cpp +102 -0
- data/ext/libsass/utf8_string.hpp +36 -0
- data/ext/libsass/util.cpp +189 -0
- data/ext/libsass/util.hpp +26 -0
- data/ext/libsass/win/libsass.filters +291 -0
- data/ext/libsass/win/libsass.sln +28 -0
- data/ext/libsass/win/libsass.vcxproj +255 -0
- data/lib/sassc.rb +6 -0
- data/lib/sassc/engine.rb +13 -0
- data/lib/sassc/native.rb +44 -0
- data/lib/sassc/native/native_context_api.rb +140 -0
- data/lib/sassc/native/native_functions_api.rb +41 -0
- data/lib/sassc/native/sass_input_style.rb +11 -0
- data/lib/sassc/native/sass_output_style.rb +10 -0
- data/lib/sassc/native/sass_value.rb +95 -0
- data/lib/sassc/native/string_list.rb +8 -0
- data/lib/sassc/version.rb +3 -0
- data/sassc.gemspec +43 -0
- data/test/smoke_test.rb +171 -0
- data/test/test_helper.rb +4 -0
- metadata +281 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#ifndef __GETOPT_H__
|
|
2
|
+
/**
|
|
3
|
+
* DISCLAIMER
|
|
4
|
+
* This file has no copyright assigned and is placed in the Public Domain.
|
|
5
|
+
* This file is a part of the w64 mingw-runtime package.
|
|
6
|
+
*
|
|
7
|
+
* The w64 mingw-runtime package and its code is distributed in the hope that it
|
|
8
|
+
* will be useful but WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESSED OR
|
|
9
|
+
* IMPLIED ARE HEREBY DISCLAIMED. This includes but is not limited to
|
|
10
|
+
* warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
#define __GETOPT_H__
|
|
14
|
+
|
|
15
|
+
/* All the headers include this file. */
|
|
16
|
+
#include <crtdefs.h>
|
|
17
|
+
|
|
18
|
+
#ifdef __cplusplus
|
|
19
|
+
extern "C" {
|
|
20
|
+
#endif
|
|
21
|
+
|
|
22
|
+
extern int optind; /* index of first non-option in argv */
|
|
23
|
+
extern int optopt; /* single option character, as parsed */
|
|
24
|
+
extern int opterr; /* flag to enable built-in diagnostics... */
|
|
25
|
+
/* (user may set to zero, to suppress) */
|
|
26
|
+
|
|
27
|
+
extern char *optarg; /* pointer to argument of current option */
|
|
28
|
+
|
|
29
|
+
extern int getopt(int nargc, char * const *nargv, const char *options);
|
|
30
|
+
|
|
31
|
+
#ifdef _BSD_SOURCE
|
|
32
|
+
/*
|
|
33
|
+
* BSD adds the non-standard `optreset' feature, for reinitialisation
|
|
34
|
+
* of `getopt' parsing. We support this feature, for applications which
|
|
35
|
+
* proclaim their BSD heritage, before including this header; however,
|
|
36
|
+
* to maintain portability, developers are advised to avoid it.
|
|
37
|
+
*/
|
|
38
|
+
# define optreset __mingw_optreset
|
|
39
|
+
extern int optreset;
|
|
40
|
+
#endif
|
|
41
|
+
#ifdef __cplusplus
|
|
42
|
+
}
|
|
43
|
+
#endif
|
|
44
|
+
/*
|
|
45
|
+
* POSIX requires the `getopt' API to be specified in `unistd.h';
|
|
46
|
+
* thus, `unistd.h' includes this header. However, we do not want
|
|
47
|
+
* to expose the `getopt_long' or `getopt_long_only' APIs, when
|
|
48
|
+
* included in this manner. Thus, close the standard __GETOPT_H__
|
|
49
|
+
* declarations block, and open an additional __GETOPT_LONG_H__
|
|
50
|
+
* specific block, only when *not* __UNISTD_H_SOURCED__, in which
|
|
51
|
+
* to declare the extended API.
|
|
52
|
+
*/
|
|
53
|
+
#endif /* !defined(__GETOPT_H__) */
|
|
54
|
+
|
|
55
|
+
#if !defined(__UNISTD_H_SOURCED__) && !defined(__GETOPT_LONG_H__)
|
|
56
|
+
#define __GETOPT_LONG_H__
|
|
57
|
+
|
|
58
|
+
#ifdef __cplusplus
|
|
59
|
+
extern "C" {
|
|
60
|
+
#endif
|
|
61
|
+
|
|
62
|
+
struct option /* specification for a long form option... */
|
|
63
|
+
{
|
|
64
|
+
const char *name; /* option name, without leading hyphens */
|
|
65
|
+
int has_arg; /* does it take an argument? */
|
|
66
|
+
int *flag; /* where to save its status, or NULL */
|
|
67
|
+
int val; /* its associated status value */
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
enum /* permitted values for its `has_arg' field... */
|
|
71
|
+
{
|
|
72
|
+
no_argument = 0, /* option never takes an argument */
|
|
73
|
+
required_argument, /* option always requires an argument */
|
|
74
|
+
optional_argument /* option may take an argument */
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
extern int getopt_long(int nargc, char * const *nargv, const char *options,
|
|
78
|
+
const struct option *long_options, int *idx);
|
|
79
|
+
extern int getopt_long_only(int nargc, char * const *nargv, const char *options,
|
|
80
|
+
const struct option *long_options, int *idx);
|
|
81
|
+
/*
|
|
82
|
+
* Previous MinGW implementation had...
|
|
83
|
+
*/
|
|
84
|
+
#ifndef HAVE_DECL_GETOPT
|
|
85
|
+
/*
|
|
86
|
+
* ...for the long form API only; keep this for compatibility.
|
|
87
|
+
*/
|
|
88
|
+
# define HAVE_DECL_GETOPT 1
|
|
89
|
+
#endif
|
|
90
|
+
|
|
91
|
+
#ifdef __cplusplus
|
|
92
|
+
}
|
|
93
|
+
#endif
|
|
94
|
+
|
|
95
|
+
#endif /* !defined(__UNISTD_H_SOURCED__) && !defined(__GETOPT_LONG_H__) */
|
|
@@ -0,0 +1,688 @@
|
|
|
1
|
+
#include <cctype>
|
|
2
|
+
#include <cstddef>
|
|
3
|
+
#include <iostream>
|
|
4
|
+
#include <iomanip>
|
|
5
|
+
#include "constants.hpp"
|
|
6
|
+
#include "prelexer.hpp"
|
|
7
|
+
#include "util.hpp"
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
namespace Sass {
|
|
11
|
+
using namespace Constants;
|
|
12
|
+
|
|
13
|
+
namespace Prelexer {
|
|
14
|
+
using std::ptrdiff_t;
|
|
15
|
+
// Matches zero characters (always succeeds without consuming input).
|
|
16
|
+
const char* epsilon(char *src) {
|
|
17
|
+
return src;
|
|
18
|
+
}
|
|
19
|
+
// Matches the empty string.
|
|
20
|
+
const char* empty(char *src) {
|
|
21
|
+
return *src ? 0 : src;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Match any single character.
|
|
25
|
+
const char* any_char(const char* src) { return *src ? src+1 : src; }
|
|
26
|
+
|
|
27
|
+
// Match a single character satisfying the ctype predicates.
|
|
28
|
+
const char* space(const char* src) { return std::isspace(*src) ? src+1 : 0; }
|
|
29
|
+
const char* alpha(const char* src) { return std::isalpha(*src) || !Sass::Util::isAscii(*src) ? src+1 : 0; }
|
|
30
|
+
const char* digit(const char* src) { return std::isdigit(*src) ? src+1 : 0; }
|
|
31
|
+
const char* xdigit(const char* src) { return std::isxdigit(*src) ? src+1 : 0; }
|
|
32
|
+
const char* alnum(const char* src) { return std::isalnum(*src) || !Sass::Util::isAscii(*src) ? src+1 : 0; }
|
|
33
|
+
const char* punct(const char* src) { return std::ispunct(*src) ? src+1 : 0; }
|
|
34
|
+
// Match multiple ctype characters.
|
|
35
|
+
const char* spaces(const char* src) { return one_plus<space>(src); }
|
|
36
|
+
const char* alphas(const char* src) { return one_plus<alpha>(src); }
|
|
37
|
+
const char* digits(const char* src) { return one_plus<digit>(src); }
|
|
38
|
+
const char* xdigits(const char* src) { return one_plus<xdigit>(src); }
|
|
39
|
+
const char* alnums(const char* src) { return one_plus<alnum>(src); }
|
|
40
|
+
const char* puncts(const char* src) { return one_plus<punct>(src); }
|
|
41
|
+
|
|
42
|
+
// Match a line comment.
|
|
43
|
+
const char* line_comment(const char* src) { return to_endl<slash_slash>(src); }
|
|
44
|
+
// Match a line comment prefix.
|
|
45
|
+
const char* line_comment_prefix(const char* src) { return exactly<slash_slash>(src); }
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
// Match a block comment.
|
|
49
|
+
const char* block_comment(const char* src) {
|
|
50
|
+
return sequence< optional_spaces, delimited_by<slash_star, star_slash, false> >(src);
|
|
51
|
+
}
|
|
52
|
+
const char* block_comment_prefix(const char* src) {
|
|
53
|
+
return exactly<slash_star>(src);
|
|
54
|
+
}
|
|
55
|
+
// Match either comment.
|
|
56
|
+
const char* comment(const char* src) {
|
|
57
|
+
return alternatives<block_comment, line_comment>(src);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const char* newline(const char* src) {
|
|
61
|
+
return
|
|
62
|
+
alternatives<
|
|
63
|
+
exactly<'\n'>,
|
|
64
|
+
sequence< exactly<'\r'>, exactly<'\n'> >,
|
|
65
|
+
exactly<'\r'>,
|
|
66
|
+
exactly<'\f'>
|
|
67
|
+
>(src);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const char* whitespace(const char* src) {
|
|
71
|
+
return
|
|
72
|
+
alternatives<
|
|
73
|
+
newline,
|
|
74
|
+
exactly<' '>,
|
|
75
|
+
exactly<'\t'>
|
|
76
|
+
>(src);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const char* escape(const char* src) {
|
|
80
|
+
return
|
|
81
|
+
sequence<
|
|
82
|
+
exactly<'\\'>,
|
|
83
|
+
any_char
|
|
84
|
+
>(src);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Match double- and single-quoted strings.
|
|
88
|
+
const char* double_quoted_string(const char* src) {
|
|
89
|
+
src = exactly<'"'>(src);
|
|
90
|
+
if (!src) return 0;
|
|
91
|
+
const char* p;
|
|
92
|
+
while (1) {
|
|
93
|
+
if (!*src) return 0;
|
|
94
|
+
if((p = escape(src))) {
|
|
95
|
+
src = p;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
else if((p = exactly<'"'>(src))) {
|
|
99
|
+
return p;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
++src;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return 0;
|
|
106
|
+
}
|
|
107
|
+
const char* single_quoted_string(const char* src) {
|
|
108
|
+
src = exactly<'\''>(src);
|
|
109
|
+
if (!src) return 0;
|
|
110
|
+
const char* p;
|
|
111
|
+
while (1) {
|
|
112
|
+
if (!*src) return 0;
|
|
113
|
+
if((p = escape(src))) {
|
|
114
|
+
src = p;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
else if((p = exactly<'\''>(src))) {
|
|
118
|
+
return p;
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
++src;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return 0;
|
|
125
|
+
}
|
|
126
|
+
const char* string_constant(const char* src) {
|
|
127
|
+
return alternatives<double_quoted_string, single_quoted_string>(src);
|
|
128
|
+
}
|
|
129
|
+
// Match interpolants.
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
const char* interpolant(const char* src) {
|
|
133
|
+
return delimited_by<hash_lbrace, rbrace, false>(src);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Whitespace handling.
|
|
137
|
+
const char* optional_spaces(const char* src) { return optional<spaces>(src); }
|
|
138
|
+
const char* optional_comment(const char* src) { return optional<comment>(src); }
|
|
139
|
+
const char* spaces_and_comments(const char* src) {
|
|
140
|
+
return zero_plus< alternatives<spaces, comment> >(src);
|
|
141
|
+
}
|
|
142
|
+
const char* no_spaces(const char* src) {
|
|
143
|
+
return negate< spaces >(src);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const char* backslash_something(const char* src) {
|
|
147
|
+
return sequence< exactly<'\\'>, any_char >(src);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Match CSS identifiers.
|
|
151
|
+
const char* identifier(const char* src) {
|
|
152
|
+
return sequence< optional< exactly<'-'> >,
|
|
153
|
+
alternatives< alpha, exactly<'_'>, backslash_something >,
|
|
154
|
+
zero_plus< alternatives< alnum,
|
|
155
|
+
exactly<'-'>,
|
|
156
|
+
exactly<'_'>,
|
|
157
|
+
backslash_something > > >(src);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const char* identifier_fragment(const char* src) {
|
|
161
|
+
return one_plus< alternatives< alnum,
|
|
162
|
+
exactly<'-'>,
|
|
163
|
+
exactly<'_'>,
|
|
164
|
+
backslash_something > >(src);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Match CSS selectors.
|
|
168
|
+
const char* sel_ident(const char* src) {
|
|
169
|
+
return sequence< optional< alternatives< exactly<'-'>, exactly<'|'> > >,
|
|
170
|
+
alternatives< alpha, exactly<'_'>, backslash_something, exactly<'|'> >,
|
|
171
|
+
zero_plus< alternatives< alnum,
|
|
172
|
+
exactly<'-'>,
|
|
173
|
+
exactly<'_'>,
|
|
174
|
+
exactly<'|'>,
|
|
175
|
+
backslash_something > > >(src);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Match CSS css variables.
|
|
179
|
+
const char* custom_property_name(const char* src) {
|
|
180
|
+
return sequence< exactly<'-'>, exactly<'-'>, identifier >(src);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Match interpolant schemas
|
|
184
|
+
const char* identifier_schema(const char* src) {
|
|
185
|
+
// follows this pattern: (x*ix*)+ ... well, not quite
|
|
186
|
+
return sequence< one_plus< sequence< zero_plus< alternatives< identifier, exactly<'-'> > >,
|
|
187
|
+
interpolant,
|
|
188
|
+
zero_plus< alternatives< identifier, number, exactly<'-'> > > > >,
|
|
189
|
+
negate< exactly<'%'> > >(src);
|
|
190
|
+
}
|
|
191
|
+
const char* value_schema(const char* src) {
|
|
192
|
+
// follows this pattern: ([xyz]*i[xyz]*)+
|
|
193
|
+
return one_plus< sequence< zero_plus< alternatives< identifier, percentage, dimension, hex, number, string_constant > >,
|
|
194
|
+
interpolant,
|
|
195
|
+
zero_plus< alternatives< identifier, percentage, dimension, hex, number, string_constant, exactly<'%'> > > > >(src);
|
|
196
|
+
}
|
|
197
|
+
const char* filename_schema(const char* src) {
|
|
198
|
+
return one_plus< sequence< zero_plus< alternatives< identifier, number, exactly<'.'>, exactly<'/'> > >,
|
|
199
|
+
interpolant,
|
|
200
|
+
zero_plus< alternatives< identifier, number, exactly<'.'>, exactly<'/'> > > > >(src);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const char* filename(const char* src) {
|
|
204
|
+
return one_plus< alternatives< identifier, number, exactly<'.'> > >(src);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Match CSS '@' keywords.
|
|
208
|
+
const char* at_keyword(const char* src) {
|
|
209
|
+
return sequence<exactly<'@'>, identifier>(src);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const char* import(const char* src) {
|
|
213
|
+
return exactly<import_kwd>(src);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const char* media(const char* src) {
|
|
217
|
+
return exactly<media_kwd>(src);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const char* supports(const char* src) {
|
|
221
|
+
return exactly<supports_kwd>(src);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const char* keyframes(const char* src) {
|
|
225
|
+
return sequence< exactly<'@'>, optional< vendor_prefix >, exactly< keyframes_kwd > >(src);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const char* vendor_prefix(const char* src) {
|
|
229
|
+
return alternatives< exactly< vendor_opera_kwd >, exactly< vendor_webkit_kwd >, exactly< vendor_mozilla_kwd >, exactly< vendor_ms_kwd >, exactly< vendor_khtml_kwd > >(src);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const char* keyf(const char* src) {
|
|
233
|
+
return one_plus< alternatives< to, from, percentage > >(src);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
const char* mixin(const char* src) {
|
|
237
|
+
return exactly<mixin_kwd>(src);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const char* function(const char* src) {
|
|
241
|
+
return exactly<function_kwd>(src);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
const char* return_directive(const char* src) {
|
|
245
|
+
return exactly<return_kwd>(src);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const char* include(const char* src) {
|
|
249
|
+
return exactly<include_kwd>(src);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const char* content(const char* src) {
|
|
253
|
+
return exactly<content_kwd>(src);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
const char* extend(const char* src) {
|
|
257
|
+
return exactly<extend_kwd>(src);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
const char* if_directive(const char* src) {
|
|
262
|
+
return exactly<if_kwd>(src);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
const char* else_directive(const char* src) {
|
|
266
|
+
return exactly<else_kwd>(src);
|
|
267
|
+
}
|
|
268
|
+
const char* elseif_directive(const char* src) {
|
|
269
|
+
return sequence< else_directive,
|
|
270
|
+
spaces_and_comments,
|
|
271
|
+
exactly< if_after_else_kwd > >(src);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const char* for_directive(const char* src) {
|
|
275
|
+
return exactly<for_kwd>(src);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const char* from(const char* src) {
|
|
279
|
+
return exactly<from_kwd>(src);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const char* to(const char* src) {
|
|
283
|
+
return exactly<to_kwd>(src);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const char* through(const char* src) {
|
|
287
|
+
return exactly<through_kwd>(src);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const char* each_directive(const char* src) {
|
|
291
|
+
return exactly<each_kwd>(src);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
const char* in(const char* src) {
|
|
295
|
+
return exactly<in_kwd>(src);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
const char* while_directive(const char* src) {
|
|
299
|
+
return exactly<while_kwd>(src);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
const char* name(const char* src) {
|
|
303
|
+
return one_plus< alternatives< alnum,
|
|
304
|
+
exactly<'-'>,
|
|
305
|
+
exactly<'_'>,
|
|
306
|
+
exactly<'\\'> > >(src);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
const char* warn(const char* src) {
|
|
310
|
+
return exactly<warn_kwd>(src);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const char* err(const char* src) {
|
|
314
|
+
return exactly<error_kwd>(src);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const char* dbg(const char* src) {
|
|
318
|
+
return exactly<debug_kwd>(src);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const char* directive(const char* src) {
|
|
322
|
+
return sequence< exactly<'@'>, identifier >(src);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
const char* null(const char* src) {
|
|
326
|
+
return exactly<null_kwd>(src);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Match CSS type selectors
|
|
330
|
+
const char* namespace_prefix(const char* src) {
|
|
331
|
+
return sequence< optional< alternatives< identifier, exactly<'*'> > >,
|
|
332
|
+
exactly<'|'> >(src);
|
|
333
|
+
}
|
|
334
|
+
const char* type_selector(const char* src) {
|
|
335
|
+
return sequence< optional<namespace_prefix>, identifier>(src);
|
|
336
|
+
}
|
|
337
|
+
const char* hyphens_and_identifier(const char* src) {
|
|
338
|
+
return sequence< zero_plus< exactly< '-' > >, identifier >(src);
|
|
339
|
+
}
|
|
340
|
+
const char* hyphens_and_name(const char* src) {
|
|
341
|
+
return sequence< zero_plus< exactly< '-' > >, name >(src);
|
|
342
|
+
}
|
|
343
|
+
const char* universal(const char* src) {
|
|
344
|
+
return sequence< optional<namespace_prefix>, exactly<'*'> >(src);
|
|
345
|
+
}
|
|
346
|
+
// Match CSS id names.
|
|
347
|
+
const char* id_name(const char* src) {
|
|
348
|
+
return sequence<exactly<'#'>, name>(src);
|
|
349
|
+
}
|
|
350
|
+
// Match CSS class names.
|
|
351
|
+
const char* class_name(const char* src) {
|
|
352
|
+
return sequence<exactly<'.'>, identifier>(src);
|
|
353
|
+
}
|
|
354
|
+
// Attribute name in an attribute selector.
|
|
355
|
+
const char* attribute_name(const char* src) {
|
|
356
|
+
return alternatives< sequence< optional<namespace_prefix>, identifier>,
|
|
357
|
+
identifier >(src);
|
|
358
|
+
}
|
|
359
|
+
// match placeholder selectors
|
|
360
|
+
const char* placeholder(const char* src) {
|
|
361
|
+
return sequence<exactly<'%'>, identifier>(src);
|
|
362
|
+
}
|
|
363
|
+
// Match CSS numeric constants.
|
|
364
|
+
|
|
365
|
+
const char* sign(const char* src) {
|
|
366
|
+
return class_char<sign_chars>(src);
|
|
367
|
+
}
|
|
368
|
+
const char* unsigned_number(const char* src) {
|
|
369
|
+
return alternatives<sequence< zero_plus<digits>,
|
|
370
|
+
exactly<'.'>,
|
|
371
|
+
one_plus<digits> >,
|
|
372
|
+
digits>(src);
|
|
373
|
+
}
|
|
374
|
+
const char* number(const char* src) {
|
|
375
|
+
return sequence< optional<sign>, unsigned_number>(src);
|
|
376
|
+
}
|
|
377
|
+
const char* coefficient(const char* src) {
|
|
378
|
+
return alternatives< sequence< optional<sign>, digits >,
|
|
379
|
+
sign >(src);
|
|
380
|
+
}
|
|
381
|
+
const char* binomial(const char* src) {
|
|
382
|
+
return sequence< optional<sign>,
|
|
383
|
+
optional<digits>,
|
|
384
|
+
exactly<'n'>, optional_spaces,
|
|
385
|
+
sign, optional_spaces,
|
|
386
|
+
digits >(src);
|
|
387
|
+
}
|
|
388
|
+
const char* percentage(const char* src) {
|
|
389
|
+
return sequence< number, exactly<'%'> >(src);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
const char* em(const char* src) {
|
|
393
|
+
return sequence< number, exactly<em_kwd> >(src);
|
|
394
|
+
}
|
|
395
|
+
const char* dimension(const char* src) {
|
|
396
|
+
return sequence<number, identifier>(src);
|
|
397
|
+
}
|
|
398
|
+
const char* hex(const char* src) {
|
|
399
|
+
const char* p = sequence< exactly<'#'>, one_plus<xdigit> >(src);
|
|
400
|
+
ptrdiff_t len = p - src;
|
|
401
|
+
return (len != 4 && len != 7) ? 0 : p;
|
|
402
|
+
}
|
|
403
|
+
const char* hexa(const char* src) {
|
|
404
|
+
const char* p = sequence< exactly<'#'>, one_plus<xdigit> >(src);
|
|
405
|
+
ptrdiff_t len = p - src;
|
|
406
|
+
return (len != 4 && len != 7 && len != 9) ? 0 : p;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
const char* rgb_prefix(const char* src) {
|
|
410
|
+
return exactly<rgb_kwd>(src);
|
|
411
|
+
}
|
|
412
|
+
// Match CSS uri specifiers.
|
|
413
|
+
|
|
414
|
+
const char* uri_prefix(const char* src) {
|
|
415
|
+
return exactly<url_kwd>(src);
|
|
416
|
+
}
|
|
417
|
+
// TODO: rename the following two functions
|
|
418
|
+
const char* uri(const char* src) {
|
|
419
|
+
return sequence< exactly<url_kwd>,
|
|
420
|
+
optional<spaces>,
|
|
421
|
+
string_constant,
|
|
422
|
+
optional<spaces>,
|
|
423
|
+
exactly<')'> >(src);
|
|
424
|
+
}
|
|
425
|
+
const char* url_value(const char* src) {
|
|
426
|
+
return sequence< optional< sequence< identifier, exactly<':'> > >, // optional protocol
|
|
427
|
+
one_plus< sequence< zero_plus< exactly<'/'> >, filename > >, // one or more folders and/or trailing filename
|
|
428
|
+
optional< exactly<'/'> > >(src);
|
|
429
|
+
}
|
|
430
|
+
const char* url_schema(const char* src) {
|
|
431
|
+
return sequence< optional< sequence< identifier, exactly<':'> > >, // optional protocol
|
|
432
|
+
filename_schema >(src); // optional trailing slash
|
|
433
|
+
}
|
|
434
|
+
// Match CSS "!important" keyword.
|
|
435
|
+
const char* important(const char* src) {
|
|
436
|
+
return sequence< exactly<'!'>,
|
|
437
|
+
spaces_and_comments,
|
|
438
|
+
exactly<important_kwd> >(src);
|
|
439
|
+
}
|
|
440
|
+
// Match CSS "!optional" keyword.
|
|
441
|
+
const char* optional(const char* src) {
|
|
442
|
+
return sequence< exactly<'!'>,
|
|
443
|
+
spaces_and_comments,
|
|
444
|
+
exactly<optional_kwd> >(src);
|
|
445
|
+
}
|
|
446
|
+
// Match Sass "!default" keyword.
|
|
447
|
+
const char* default_flag(const char* src) {
|
|
448
|
+
return sequence< exactly<'!'>,
|
|
449
|
+
spaces_and_comments,
|
|
450
|
+
exactly<default_kwd> >(src);
|
|
451
|
+
}
|
|
452
|
+
// Match Sass "!global" keyword.
|
|
453
|
+
const char* global_flag(const char* src) {
|
|
454
|
+
return sequence< exactly<'!'>,
|
|
455
|
+
spaces_and_comments,
|
|
456
|
+
exactly<global_kwd> >(src);
|
|
457
|
+
}
|
|
458
|
+
// Match CSS pseudo-class/element prefixes.
|
|
459
|
+
const char* pseudo_prefix(const char* src) {
|
|
460
|
+
return sequence< exactly<':'>, optional< exactly<':'> > >(src);
|
|
461
|
+
}
|
|
462
|
+
// Match CSS function call openers.
|
|
463
|
+
const char* functional_schema(const char* src) {
|
|
464
|
+
return sequence< identifier_schema, exactly<'('> >(src);
|
|
465
|
+
}
|
|
466
|
+
const char* functional(const char* src) {
|
|
467
|
+
return sequence< identifier, exactly<'('> >(src);
|
|
468
|
+
}
|
|
469
|
+
// Match the CSS negation pseudo-class.
|
|
470
|
+
const char* pseudo_not(const char* src) {
|
|
471
|
+
return exactly< pseudo_not_kwd >(src);
|
|
472
|
+
}
|
|
473
|
+
// Match CSS 'odd' and 'even' keywords for functional pseudo-classes.
|
|
474
|
+
const char* even(const char* src) {
|
|
475
|
+
return exactly<even_kwd>(src);
|
|
476
|
+
}
|
|
477
|
+
const char* odd(const char* src) {
|
|
478
|
+
return exactly<odd_kwd>(src);
|
|
479
|
+
}
|
|
480
|
+
// Match CSS attribute-matching operators.
|
|
481
|
+
const char* exact_match(const char* src) { return exactly<'='>(src); }
|
|
482
|
+
const char* class_match(const char* src) { return exactly<tilde_equal>(src); }
|
|
483
|
+
const char* dash_match(const char* src) { return exactly<pipe_equal>(src); }
|
|
484
|
+
const char* prefix_match(const char* src) { return exactly<caret_equal>(src); }
|
|
485
|
+
const char* suffix_match(const char* src) { return exactly<dollar_equal>(src); }
|
|
486
|
+
const char* substring_match(const char* src) { return exactly<star_equal>(src); }
|
|
487
|
+
// Match CSS combinators.
|
|
488
|
+
const char* adjacent_to(const char* src) {
|
|
489
|
+
return sequence< optional_spaces, exactly<'+'> >(src);
|
|
490
|
+
}
|
|
491
|
+
const char* precedes(const char* src) {
|
|
492
|
+
return sequence< optional_spaces, exactly<'~'> >(src);
|
|
493
|
+
}
|
|
494
|
+
const char* parent_of(const char* src) {
|
|
495
|
+
return sequence< optional_spaces, exactly<'>'> >(src);
|
|
496
|
+
}
|
|
497
|
+
const char* ancestor_of(const char* src) {
|
|
498
|
+
return sequence< spaces, negate< exactly<'{'> > >(src);
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// Match SCSS variable names.
|
|
502
|
+
const char* variable(const char* src) {
|
|
503
|
+
return sequence<exactly<'$'>, identifier>(src);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
// Match Sass boolean keywords.
|
|
507
|
+
const char* true_val(const char* src) {
|
|
508
|
+
return exactly<true_kwd>(src);
|
|
509
|
+
}
|
|
510
|
+
const char* false_val(const char* src) {
|
|
511
|
+
return exactly<false_kwd>(src);
|
|
512
|
+
}
|
|
513
|
+
const char* and_op(const char* src) {
|
|
514
|
+
return exactly<and_kwd>(src);
|
|
515
|
+
}
|
|
516
|
+
const char* or_op(const char* src) {
|
|
517
|
+
return exactly<or_kwd>(src);
|
|
518
|
+
}
|
|
519
|
+
const char* not_op(const char* src) {
|
|
520
|
+
return exactly<not_kwd>(src);
|
|
521
|
+
}
|
|
522
|
+
const char* eq_op(const char* src) {
|
|
523
|
+
return exactly<eq>(src);
|
|
524
|
+
}
|
|
525
|
+
const char* neq_op(const char* src) {
|
|
526
|
+
return exactly<neq>(src);
|
|
527
|
+
}
|
|
528
|
+
const char* gt_op(const char* src) {
|
|
529
|
+
return exactly<gt>(src);
|
|
530
|
+
}
|
|
531
|
+
const char* gte_op(const char* src) {
|
|
532
|
+
return exactly<gte>(src);
|
|
533
|
+
}
|
|
534
|
+
const char* lt_op(const char* src) {
|
|
535
|
+
return exactly<lt>(src);
|
|
536
|
+
}
|
|
537
|
+
const char* lte_op(const char* src) {
|
|
538
|
+
return exactly<lte>(src);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// match specific IE syntax
|
|
542
|
+
const char* ie_progid(const char* src) {
|
|
543
|
+
return sequence <
|
|
544
|
+
exactly<progid_kwd>,
|
|
545
|
+
exactly<':'>,
|
|
546
|
+
alternatives< identifier_schema, identifier >,
|
|
547
|
+
zero_plus< sequence<
|
|
548
|
+
exactly<'.'>,
|
|
549
|
+
alternatives< identifier_schema, identifier >
|
|
550
|
+
> >,
|
|
551
|
+
zero_plus < sequence<
|
|
552
|
+
exactly<'('>,
|
|
553
|
+
spaces_and_comments,
|
|
554
|
+
optional < sequence<
|
|
555
|
+
alternatives< variable, identifier_schema, identifier >,
|
|
556
|
+
spaces_and_comments,
|
|
557
|
+
exactly<'='>,
|
|
558
|
+
spaces_and_comments,
|
|
559
|
+
alternatives< variable, identifier_schema, identifier, string_constant, number, hexa >,
|
|
560
|
+
zero_plus< sequence<
|
|
561
|
+
spaces_and_comments,
|
|
562
|
+
exactly<','>,
|
|
563
|
+
spaces_and_comments,
|
|
564
|
+
sequence<
|
|
565
|
+
alternatives< variable, identifier_schema, identifier >,
|
|
566
|
+
spaces_and_comments,
|
|
567
|
+
exactly<'='>,
|
|
568
|
+
spaces_and_comments,
|
|
569
|
+
alternatives< variable, identifier_schema, identifier, string_constant, number, hexa >
|
|
570
|
+
>
|
|
571
|
+
> >
|
|
572
|
+
> >,
|
|
573
|
+
spaces_and_comments,
|
|
574
|
+
exactly<')'>,
|
|
575
|
+
spaces_and_comments
|
|
576
|
+
> >
|
|
577
|
+
>(src);
|
|
578
|
+
}
|
|
579
|
+
const char* ie_expression(const char* src) {
|
|
580
|
+
return sequence < exactly<expression_kwd>, delimited_by< '(', ')', true> >(src);
|
|
581
|
+
}
|
|
582
|
+
const char* ie_property(const char* src) {
|
|
583
|
+
return alternatives < ie_expression, ie_progid >(src);
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
// const char* ie_args(const char* src) {
|
|
587
|
+
// return sequence< alternatives< ie_keyword_arg, value_schema, string_constant, interpolant, number, identifier, delimited_by< '(', ')', true> >,
|
|
588
|
+
// zero_plus< sequence< spaces_and_comments, exactly<','>, spaces_and_comments, alternatives< ie_keyword_arg, value_schema, string_constant, interpolant, number, identifier, delimited_by<'(', ')', true> > > > >(src);
|
|
589
|
+
// }
|
|
590
|
+
|
|
591
|
+
const char* ie_keyword_arg(const char* src) {
|
|
592
|
+
return sequence< alternatives< variable, identifier_schema, identifier >, spaces_and_comments, exactly<'='>, spaces_and_comments, alternatives< variable, identifier_schema, identifier, string_constant, number, hexa > >(src);
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
// Path matching functions.
|
|
596
|
+
const char* folder(const char* src) {
|
|
597
|
+
return sequence< zero_plus< any_char_except<'/'> >,
|
|
598
|
+
exactly<'/'> >(src);
|
|
599
|
+
}
|
|
600
|
+
const char* folders(const char* src) {
|
|
601
|
+
return zero_plus< folder >(src);
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
const char* chunk(const char* src) {
|
|
605
|
+
char inside_str = 0;
|
|
606
|
+
const char* p = src;
|
|
607
|
+
size_t depth = 0;
|
|
608
|
+
while (true) {
|
|
609
|
+
if (!*p) {
|
|
610
|
+
return 0;
|
|
611
|
+
}
|
|
612
|
+
else if (!inside_str && (*p == '"' || *p == '\'')) {
|
|
613
|
+
inside_str = *p;
|
|
614
|
+
}
|
|
615
|
+
else if (*p == inside_str && *(p-1) != '\\') {
|
|
616
|
+
inside_str = 0;
|
|
617
|
+
}
|
|
618
|
+
else if (*p == '(' && !inside_str) {
|
|
619
|
+
++depth;
|
|
620
|
+
}
|
|
621
|
+
else if (*p == ')' && !inside_str) {
|
|
622
|
+
if (depth == 0) return p;
|
|
623
|
+
else --depth;
|
|
624
|
+
}
|
|
625
|
+
++p;
|
|
626
|
+
}
|
|
627
|
+
// unreachable
|
|
628
|
+
return 0;
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
// follow the CSS spec more closely and see if this helps us scan URLs correctly
|
|
632
|
+
const char* NL(const char* src) {
|
|
633
|
+
return alternatives< exactly<'\n'>,
|
|
634
|
+
sequence< exactly<'\r'>, exactly<'\n'> >,
|
|
635
|
+
exactly<'\r'>,
|
|
636
|
+
exactly<'\f'> >(src);
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
const char* H(const char* src) {
|
|
640
|
+
return std::isxdigit(*src) ? src+1 : 0;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
const char* unicode(const char* src) {
|
|
644
|
+
return sequence< exactly<'\\'>,
|
|
645
|
+
between<H, 1, 6>,
|
|
646
|
+
optional< class_char<url_space_chars> > >(src);
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
const char* ESCAPE(const char* src) {
|
|
650
|
+
return alternatives< unicode, class_char<escape_chars> >(src);
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
const char* url(const char* src) {
|
|
654
|
+
return chunk(src);
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
const char* static_string(const char* src) {
|
|
658
|
+
const char* pos = src;
|
|
659
|
+
const char * s = string_constant(pos);
|
|
660
|
+
Token t(pos, s);
|
|
661
|
+
const unsigned int p = count_interval< interpolant >(t.begin, t.end);
|
|
662
|
+
return (p == 0) ? t.end : 0;
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
const char* static_component(const char* src) {
|
|
666
|
+
return alternatives< identifier,
|
|
667
|
+
static_string,
|
|
668
|
+
hex,
|
|
669
|
+
number,
|
|
670
|
+
sequence< exactly<'!'>, exactly<important_kwd> >
|
|
671
|
+
>(src);
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
const char* static_value(const char* src) {
|
|
675
|
+
return sequence< static_component,
|
|
676
|
+
zero_plus < sequence<
|
|
677
|
+
alternatives<
|
|
678
|
+
sequence< optional_spaces, exactly<'/'>, optional_spaces >,
|
|
679
|
+
sequence< optional_spaces, exactly<','>, optional_spaces >,
|
|
680
|
+
spaces
|
|
681
|
+
>,
|
|
682
|
+
static_component
|
|
683
|
+
> >,
|
|
684
|
+
alternatives< exactly<';'>, exactly<'}'> >
|
|
685
|
+
>(src);
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
}
|