Commit 7c4ca347 by Aaron Leung

Another combinator, matcher for identifiers.

parent b9ed4b32
...@@ -78,20 +78,63 @@ DEFINE_SINGLE_CTYPE_MATCHER(digit); ...@@ -78,20 +78,63 @@ DEFINE_SINGLE_CTYPE_MATCHER(digit);
DEFINE_SINGLE_CTYPE_MATCHER(xdigit); DEFINE_SINGLE_CTYPE_MATCHER(xdigit);
DEFINE_SINGLE_CTYPE_MATCHER(alnum); DEFINE_SINGLE_CTYPE_MATCHER(alnum);
DEFINE_SINGLE_CTYPE_MATCHER(punct); DEFINE_SINGLE_CTYPE_MATCHER(punct);
DEFINE_CTYPE_SEQUENCE_MATCHER(space); DEFINE_CTYPE_SEQUENCE_MATCHER(space);
DEFINE_CTYPE_SEQUENCE_MATCHER(alpha); DEFINE_CTYPE_SEQUENCE_MATCHER(alpha);
DEFINE_CTYPE_SEQUENCE_MATCHER(digit); DEFINE_CTYPE_SEQUENCE_MATCHER(digit);
DEFINE_CTYPE_SEQUENCE_MATCHER(xdigit); DEFINE_CTYPE_SEQUENCE_MATCHER(xdigit);
DEFINE_CTYPE_SEQUENCE_MATCHER(alnum); DEFINE_CTYPE_SEQUENCE_MATCHER(alnum);
DEFINE_CTYPE_SEQUENCE_MATCHER(punct); DEFINE_CTYPE_SEQUENCE_MATCHER(punct);
DEFINE_TO_EOL_MATCHER(line_comment, "//"); DEFINE_TO_EOL_MATCHER(line_comment, "//");
DEFINE_DELIMITED_MATCHER(block_comment, "/*", "*/", 0); DEFINE_DELIMITED_MATCHER(block_comment, "/*", "*/", 0);
DEFINE_DELIMITED_MATCHER(double_quoted_string, "\"", "\"", 1); DEFINE_DELIMITED_MATCHER(double_quoted_string, "\"", "\"", 1);
DEFINE_DELIMITED_MATCHER(single_quoted_string, "\'", "\'", 1); DEFINE_DELIMITED_MATCHER(single_quoted_string, "\'", "\'", 1);
DEFINE_DELIMITED_MATCHER(interpolant, "#{", "}", 0); DEFINE_DELIMITED_MATCHER(interpolant, "#{", "}", 0);
// int main() { DEFINE_CHAR_MATCHER (lparen, '(');
// char *p = prefix_sequence("hello", prefix_is_alphas); DEFINE_CHAR_MATCHER (rparen, ')');
// if (!*p) putchar('0'); DEFINE_CHAR_MATCHER (lbrack, '[');
// return 0; DEFINE_CHAR_MATCHER (rbrack, ']');
// } DEFINE_CHAR_MATCHER (lbrace, '{');
\ No newline at end of file DEFINE_CHAR_MATCHER (rbrace, '}');
DEFINE_CHAR_MATCHER (underscore, '_');
DEFINE_CHAR_MATCHER (hyphen, '-');
DEFINE_CHAR_MATCHER (semicolon, ';');
DEFINE_CHAR_MATCHER (colon, ':');
DEFINE_CHAR_MATCHER (period, '.');
DEFINE_CHAR_MATCHER (question, '?');
DEFINE_CHAR_MATCHER (exclamation, '!');
DEFINE_CHAR_MATCHER (tilde, '~');
DEFINE_CHAR_MATCHER (backquote, '`');
DEFINE_CHAR_MATCHER (quote, '\"');
DEFINE_CHAR_MATCHER (apostrophe, '\'');
DEFINE_CHAR_MATCHER (ampersand, '&');
DEFINE_CHAR_MATCHER (caret, '^');
DEFINE_CHAR_MATCHER (pipe, '|');
DEFINE_CHAR_MATCHER (slash, '/');
DEFINE_CHAR_MATCHER (backslash, '\\');
DEFINE_CHAR_MATCHER (asterisk, '*');
DEFINE_CHAR_MATCHER (pound, '#');
DEFINE_CHAR_MATCHER (hash, '#');
DEFINE_CHAR_MATCHER (plus, '+');
DEFINE_CHAR_MATCHER (minus, '-');
DEFINE_CHAR_MATCHER (times, '*');
DEFINE_CHAR_MATCHER (divide, '/');
DEFINE_CHAR_MATCHER (percent, '%');
DEFINE_CHAR_MATCHER (dollar, '$');
DEFINE_CHAR_MATCHER (gt, '>');
DEFINE_CHARS_MATCHER(gte, ">=");
DEFINE_CHAR_MATCHER (lt, '<');
DEFINE_CHARS_MATCHER(lte, "<=");
DEFINE_CHAR_MATCHER (eq, '=');
DEFINE_CHAR_MATCHER (assign, '=');
DEFINE_CHARS_MATCHER(equal, "==");
static DEFINE_ALTERNATIVES_MATCHER(identifier_initial, prefix_is_alphas, prefix_is_underscore);
static DEFINE_ALTERNATIVES_MATCHER(identifier_trailer, prefix_is_alnums, prefix_is_underscore);
DEFINE_FIRST_REST_MATCHER(identifier, prefix_is_identifier_initial, prefix_is_identifier_trailer);
\ No newline at end of file
...@@ -3,6 +3,11 @@ typedef char *(*prefix_matcher)(char *); ...@@ -3,6 +3,11 @@ typedef char *(*prefix_matcher)(char *);
#define DECLARE_MATCHER(name) \ #define DECLARE_MATCHER(name) \
char *prefix_is_ ## name(char *) char *prefix_is_ ## name(char *)
#define DEFINE_CHAR_MATCHER(name, prefix) \
char *prefix_is_ ## name(char *src) { \
return prefix_is_char(src, prefix); \
}
#define DEFINE_CHARS_MATCHER(name, prefix) \ #define DEFINE_CHARS_MATCHER(name, prefix) \
char *prefix_is_ ## name(char *src) { \ char *prefix_is_ ## name(char *src) { \
return prefix_is_chars(src, prefix); \ return prefix_is_chars(src, prefix); \
...@@ -32,6 +37,27 @@ char *prefix_is_ ## name(char *src) { \ ...@@ -32,6 +37,27 @@ char *prefix_is_ ## name(char *src) { \
return prefix_is_delimited_by(src, begin, end, escapable); \ return prefix_is_delimited_by(src, begin, end, escapable); \
} }
#define DEFINE_ALTERNATIVES_MATCHER(name, ...) \
char *prefix_is_ ## name(char *src) { \
return prefix_alternatives(src, __VA_ARGS__); \
}
#define DEFINE_SEQUENCE_MATCHER(name, ...) \
char *prefix_is_ ## name(char *src) { \
return prefix_sequence(src, __VA_ARGS__); \
}
#define DEFINE_OPTIONAL_MATCHER(name, matcher) \
char *prefix_is_ ## name(char *src) { \
return prefix_optional(src, matcher); \
}
#define DEFINE_FIRST_REST_MATCHER(name, first_matcher, rest_matcher) \
char *prefix_is_ ## name(char *src) { \
if (src = first_matcher(src)) src = prefix_zero_plus(src, rest_matcher); \
return src; \
}
char *prefix_is_char(char *src, char pre); char *prefix_is_char(char *src, char pre);
char *prefix_is_chars(char *src, char *pre); char *prefix_is_chars(char *src, char *pre);
char *prefix_is_one_of(char *src, char *class); char *prefix_is_one_of(char *src, char *class);
...@@ -63,4 +89,49 @@ DECLARE_MATCHER(line_comment); ...@@ -63,4 +89,49 @@ DECLARE_MATCHER(line_comment);
DECLARE_MATCHER(block_comment); DECLARE_MATCHER(block_comment);
DECLARE_MATCHER(double_quoted_string); DECLARE_MATCHER(double_quoted_string);
DECLARE_MATCHER(single_quoted_string); DECLARE_MATCHER(single_quoted_string);
DECLARE_MATCHER(interpolant); DECLARE_MATCHER(interpolant);
\ No newline at end of file
DECLARE_MATCHER(lparen);
DECLARE_MATCHER(rparen);
DECLARE_MATCHER(lbrack);
DECLARE_MATCHER(rbrack);
DECLARE_MATCHER(lbrace);
DECLARE_MATCHER(rbrace);
DECLARE_MATCHER(underscore);
DECLARE_MATCHER(hyphen);
DECLARE_MATCHER(semicolon);
DECLARE_MATCHER(colon);
DECLARE_MATCHER(period);
DECLARE_MATCHER(question);
DECLARE_MATCHER(exclamation);
DECLARE_MATCHER(tilde);
DECLARE_MATCHER(backquote);
DECLARE_MATCHER(quote);
DECLARE_MATCHER(apostrophe);
DECLARE_MATCHER(ampersand);
DECLARE_MATCHER(caret);
DECLARE_MATCHER(pipe);
DECLARE_MATCHER(slash);
DECLARE_MATCHER(backslash);
DECLARE_MATCHER(asterisk);
DECLARE_MATCHER(pound);
DECLARE_MATCHER(hash);
DECLARE_MATCHER(plus);
DECLARE_MATCHER(minus);
DECLARE_MATCHER(times);
DECLARE_MATCHER(divide);
DECLARE_MATCHER(percent);
DECLARE_MATCHER(dollar);
DECLARE_MATCHER(gt);
DECLARE_MATCHER(gte);
DECLARE_MATCHER(lt);
DECLARE_MATCHER(lte);
DECLARE_MATCHER(eq);
DECLARE_MATCHER(assign);
DECLARE_MATCHER(equal);
DECLARE_MATCHER(identifier);
...@@ -28,7 +28,7 @@ int main() { ...@@ -28,7 +28,7 @@ int main() {
char *noncomment = "/* blah blah"; char *noncomment = "/* blah blah";
char *interpolant = "#{ this is an interpolant \\} blah blah"; char *interpolant = "#{ this is an interpolant \\} blah blah";
char *words = "hello my name is aaron"; char *words = "hello my name is aaron";
char *id1 = "_identifier123"; char *id1 = "_identifier123{blah bloo}";
char *non_id = "12non_ident_ifier_"; char *non_id = "12non_ident_ifier_";
char *word2 = "-blah-blah_blah"; char *word2 = "-blah-blah_blah";
char *selector = "#foo > :first-child { color: #abcdef; }"; char *selector = "#foo > :first-child { color: #abcdef; }";
...@@ -73,6 +73,9 @@ int main() { ...@@ -73,6 +73,9 @@ int main() {
testn(prefix_one_plus, words, prefix_is_alphas); testn(prefix_one_plus, words, prefix_is_alphas);
testn(prefix_one_plus, non_id, prefix_is_alphas); testn(prefix_one_plus, non_id, prefix_is_alphas);
test1(prefix_is_identifier, id1);
test1(prefix_is_identifier, non_id);
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