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 "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 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);
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"
DECLARE(word);
\ No newline at end of file
DECLARE(semicolon_or_lbrack);
DECLARE(word);
DECLARE(class);
DECLARE(id);
DECLARE(pseudo_class);
......@@ -79,6 +79,11 @@ char *prefix_one_plus(char *src, prefix_matcher m) {
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(alpha);
SINGLE_CTYPE_MATCHER(digit);
......@@ -112,6 +117,7 @@ CHAR_MATCHER (hyphen, '-');
CHAR_MATCHER (semicolon, ';');
CHAR_MATCHER (colon, ':');
CHAR_MATCHER (period, '.');
CHAR_MATCHER (dot, '.');
CHAR_MATCHER (question, '?');
CHAR_MATCHER (exclamation, '!');
CHAR_MATCHER (tilde, '~');
......@@ -124,6 +130,7 @@ CHAR_MATCHER (pipe, '|');
CHAR_MATCHER (slash, '/');
CHAR_MATCHER (backslash, '\\');
CHAR_MATCHER (asterisk, '*');
CHAR_MATCHER (star, '*');
CHAR_MATCHER (pound, '#');
CHAR_MATCHER (hash, '#');
......@@ -143,8 +150,8 @@ CHAR_MATCHER (eq, '=');
CHAR_MATCHER (assign, '=');
CHARS_MATCHER(equal, "==");
CLASS_CHAR_MATCHER(sign, "+-");
CLASS_CHAR_MATCHER(delimiter, "()[]{}");
CHAR_CLASS_MATCHER(sign, "+-");
CHAR_CLASS_MATCHER(delimiter, "()[]{}");
static ALTERNATIVES_MATCHER(identifier_initial, prefix_is_alphas, prefix_is_underscore);
static ALTERNATIVES_MATCHER(identifier_trailer, prefix_is_alnums, prefix_is_underscore);
......
......@@ -13,12 +13,12 @@ char *prefix_is_ ## name(char *src) { \
return prefix_is_chars(src, prefix); \
}
#define CLASS_CHAR_MATCHER(name, class) \
#define CHAR_CLASS_MATCHER(name, class) \
char *prefix_is_ ## name(char *src) { \
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) { \
return prefix_is_some_of(src, class); \
}
......@@ -83,6 +83,7 @@ char *_prefix_sequence(char *src, ...);
char *prefix_optional(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_find_first(char *src, prefix_matcher m);
DECLARE(space);
DECLARE(alpha);
......@@ -117,6 +118,7 @@ DECLARE(hyphen);
DECLARE(semicolon);
DECLARE(colon);
DECLARE(period);
DECLARE(dot);
DECLARE(question);
DECLARE(exclamation);
DECLARE(tilde);
......@@ -129,6 +131,7 @@ DECLARE(pipe);
DECLARE(slash);
DECLARE(backslash);
DECLARE(asterisk);
DECLARE(star);
DECLARE(pound);
DECLARE(hash);
......
......@@ -33,7 +33,7 @@ int main() {
char *words = "hello my name is aaron";
char *id1 = "_identifier123{blah bloo}";
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 *selector = "#foo > :first-child { color: #abcdef; }";
char *lcomment = "// blah blah blah // end\n blah blah";
......@@ -41,6 +41,8 @@ int main() {
char *integer1 = "3837483+3";
char *integer2 = "+294739-4";
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, words);
......@@ -102,6 +104,14 @@ int main() {
test1(prefix_is_word, word2);
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;
}
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