Commit 093aee42 by Aaron Leung

Workin on Sass/CSS-specific lexical patterns. Also tweaking the primitive stuff as necessary.

parent bf9bed27
#include <stdio.h> #include <stdio.h>
#include "lexical_patterns.h" #include "lexical_patterns.h"
ALTERNATIVES_MATCHER(semicolon_or_lbrack, prefix_is_semicolon, prefix_is_lbrack);
CHARS_MATCHER(import, "@import");
CHARS_MATCHER(include, "@include");
CHARS_MATCHER(mixin, "@mixin");
CHARS_MATCHER(extend, "@extend");
static SEQUENCE_MATCHER(sign_and_identifier, prefix_is_sign, prefix_is_identifier); static SEQUENCE_MATCHER(sign_and_identifier, prefix_is_sign, prefix_is_identifier);
static ALTERNATIVES_MATCHER(word_initial, prefix_is_identifier, prefix_is_sign_and_identifier); static ALTERNATIVES_MATCHER(word_initial, prefix_is_identifier, prefix_is_sign_and_identifier);
static ALTERNATIVES_MATCHER(word_trailer, prefix_is_identifier, prefix_is_sign, prefix_is_digits); static ALTERNATIVES_MATCHER(word_trailer, prefix_is_identifier, prefix_is_sign, prefix_is_digits);
FIRST_REST_MATCHER(word, prefix_is_word_initial, prefix_is_word_trailer); FIRST_REST_MATCHER(word, prefix_is_word_initial, prefix_is_word_trailer);
SEQUENCE_MATCHER(class, prefix_is_dot, prefix_is_word);
SEQUENCE_MATCHER(id, prefix_is_hash, prefix_is_word);
SEQUENCE_MATCHER(pseudo_class, prefix_is_colon, prefix_is_word);
\ No newline at end of file
#include "prefix_primitives.h" #include "prefix_primitives.h"
DECLARE(semicolon_or_lbrack);
DECLARE(word); DECLARE(word);
DECLARE(class);
DECLARE(id);
DECLARE(pseudo_class);
...@@ -79,6 +79,11 @@ char *prefix_one_plus(char *src, prefix_matcher m) { ...@@ -79,6 +79,11 @@ char *prefix_one_plus(char *src, prefix_matcher m) {
return src; return src;
} }
char *prefix_find_first(char *src, prefix_matcher m) {
while (*src && !m(src)) src++;
return *src ? src : NULL;
}
SINGLE_CTYPE_MATCHER(space); SINGLE_CTYPE_MATCHER(space);
SINGLE_CTYPE_MATCHER(alpha); SINGLE_CTYPE_MATCHER(alpha);
SINGLE_CTYPE_MATCHER(digit); SINGLE_CTYPE_MATCHER(digit);
...@@ -112,6 +117,7 @@ CHAR_MATCHER (hyphen, '-'); ...@@ -112,6 +117,7 @@ CHAR_MATCHER (hyphen, '-');
CHAR_MATCHER (semicolon, ';'); CHAR_MATCHER (semicolon, ';');
CHAR_MATCHER (colon, ':'); CHAR_MATCHER (colon, ':');
CHAR_MATCHER (period, '.'); CHAR_MATCHER (period, '.');
CHAR_MATCHER (dot, '.');
CHAR_MATCHER (question, '?'); CHAR_MATCHER (question, '?');
CHAR_MATCHER (exclamation, '!'); CHAR_MATCHER (exclamation, '!');
CHAR_MATCHER (tilde, '~'); CHAR_MATCHER (tilde, '~');
...@@ -124,6 +130,7 @@ CHAR_MATCHER (pipe, '|'); ...@@ -124,6 +130,7 @@ CHAR_MATCHER (pipe, '|');
CHAR_MATCHER (slash, '/'); CHAR_MATCHER (slash, '/');
CHAR_MATCHER (backslash, '\\'); CHAR_MATCHER (backslash, '\\');
CHAR_MATCHER (asterisk, '*'); CHAR_MATCHER (asterisk, '*');
CHAR_MATCHER (star, '*');
CHAR_MATCHER (pound, '#'); CHAR_MATCHER (pound, '#');
CHAR_MATCHER (hash, '#'); CHAR_MATCHER (hash, '#');
...@@ -143,8 +150,8 @@ CHAR_MATCHER (eq, '='); ...@@ -143,8 +150,8 @@ CHAR_MATCHER (eq, '=');
CHAR_MATCHER (assign, '='); CHAR_MATCHER (assign, '=');
CHARS_MATCHER(equal, "=="); CHARS_MATCHER(equal, "==");
CLASS_CHAR_MATCHER(sign, "+-"); CHAR_CLASS_MATCHER(sign, "+-");
CLASS_CHAR_MATCHER(delimiter, "()[]{}"); CHAR_CLASS_MATCHER(delimiter, "()[]{}");
static ALTERNATIVES_MATCHER(identifier_initial, prefix_is_alphas, prefix_is_underscore); static ALTERNATIVES_MATCHER(identifier_initial, prefix_is_alphas, prefix_is_underscore);
static ALTERNATIVES_MATCHER(identifier_trailer, prefix_is_alnums, prefix_is_underscore); static ALTERNATIVES_MATCHER(identifier_trailer, prefix_is_alnums, prefix_is_underscore);
......
...@@ -13,12 +13,12 @@ char *prefix_is_ ## name(char *src) { \ ...@@ -13,12 +13,12 @@ char *prefix_is_ ## name(char *src) { \
return prefix_is_chars(src, prefix); \ return prefix_is_chars(src, prefix); \
} }
#define CLASS_CHAR_MATCHER(name, class) \ #define CHAR_CLASS_MATCHER(name, class) \
char *prefix_is_ ## name(char *src) { \ char *prefix_is_ ## name(char *src) { \
return prefix_is_one_of(src, class); \ return prefix_is_one_of(src, class); \
} }
#define CLASS_CHARS_MATCHER(name, class) \ #define CHARS_CLASS_MATCHER(name, class) \
char *prefix_is_ ## name(char *src) { \ char *prefix_is_ ## name(char *src) { \
return prefix_is_some_of(src, class); \ return prefix_is_some_of(src, class); \
} }
...@@ -83,6 +83,7 @@ char *_prefix_sequence(char *src, ...); ...@@ -83,6 +83,7 @@ char *_prefix_sequence(char *src, ...);
char *prefix_optional(char *src, prefix_matcher m); char *prefix_optional(char *src, prefix_matcher m);
char *prefix_zero_plus(char *src, prefix_matcher m); char *prefix_zero_plus(char *src, prefix_matcher m);
char *prefix_one_plus(char *src, prefix_matcher m); char *prefix_one_plus(char *src, prefix_matcher m);
char *prefix_find_first(char *src, prefix_matcher m);
DECLARE(space); DECLARE(space);
DECLARE(alpha); DECLARE(alpha);
...@@ -117,6 +118,7 @@ DECLARE(hyphen); ...@@ -117,6 +118,7 @@ DECLARE(hyphen);
DECLARE(semicolon); DECLARE(semicolon);
DECLARE(colon); DECLARE(colon);
DECLARE(period); DECLARE(period);
DECLARE(dot);
DECLARE(question); DECLARE(question);
DECLARE(exclamation); DECLARE(exclamation);
DECLARE(tilde); DECLARE(tilde);
...@@ -129,6 +131,7 @@ DECLARE(pipe); ...@@ -129,6 +131,7 @@ DECLARE(pipe);
DECLARE(slash); DECLARE(slash);
DECLARE(backslash); DECLARE(backslash);
DECLARE(asterisk); DECLARE(asterisk);
DECLARE(star);
DECLARE(pound); DECLARE(pound);
DECLARE(hash); DECLARE(hash);
......
...@@ -33,7 +33,7 @@ int main() { ...@@ -33,7 +33,7 @@ int main() {
char *words = "hello my name is aaron"; char *words = "hello my name is aaron";
char *id1 = "_identifier123{blah bloo}"; char *id1 = "_identifier123{blah bloo}";
char *non_id = "12non_ident_ifier_"; char *non_id = "12non_ident_ifier_";
char *word2 = "-blah-bl+ah_bl12-34+1:foo"; char *word2 = "-blah-bl+ah_bl12-34+1:foobar;";
char *non_word = "-12blah-bloo"; char *non_word = "-12blah-bloo";
char *selector = "#foo > :first-child { color: #abcdef; }"; char *selector = "#foo > :first-child { color: #abcdef; }";
char *lcomment = "// blah blah blah // end\n blah blah"; char *lcomment = "// blah blah blah // end\n blah blah";
...@@ -41,6 +41,8 @@ int main() { ...@@ -41,6 +41,8 @@ int main() {
char *integer1 = "3837483+3"; char *integer1 = "3837483+3";
char *integer2 = "+294739-4"; char *integer2 = "+294739-4";
char *integer3 = "-294729+1"; char *integer3 = "-294729+1";
char *class = ".blah-blah_bloo112-blah+blee4 hello";
char *id = "#foo_bar-baz123-hux blee";
test1(prefix_is_spaces, spaces); test1(prefix_is_spaces, spaces);
test1(prefix_is_spaces, words); test1(prefix_is_spaces, words);
...@@ -103,5 +105,13 @@ int main() { ...@@ -103,5 +105,13 @@ int main() {
test1(prefix_is_word, word2); test1(prefix_is_word, word2);
test1(prefix_is_word, integer3); test1(prefix_is_word, integer3);
test1(prefix_is_class, class);
test1(prefix_is_class, words);
test1(prefix_is_id, id);
test1(prefix_is_id, class);
testn(prefix_find_first, word2, prefix_is_semicolon_or_lbrack);
return 0; return 0;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment