Commit 42a873b6 by Aaron Leung

Don't need these. Supplanted by text/.

parent 66f357fa
#include "prefix_primitives.h"
int prefix_starts_with_identifier(char *src) {
int p = prefix_is_alphas(src) || prefix_is_exactly(src, "_");
if (!p++) return 0;
while (src[p]) {
int q = prefix_is_alnums(src);
q = q ? q : prefix_is_exactly(src, "_");
if (!q) return p;
p += q;
}
}
DEFINE_EXACT_MATCHER(star, "*");
DEFINE_EXACT_MATCHER(dot, ".");
DEFINE_EXACT_MATCHER(hash, "#");
DEFINE_EXACT_MATCHER(adjacent_to, "+");
DEFINE_EXACT_MATCHER(precedes, "~");
DEFINE_EXACT_MATCHER(parent_of, ">");
prefix_matcher prefix_starts_with_ancestor_of = prefix_starts_with_spaces;
DEFINE_EXACT_MATCHER(exclamation, "!");
DEFINE_EXACT_MATCHER(dollar, "$");
DEFINE_EXACT_MATCHER(percent, "%");
DEFINE_EXACT_MATCHER(ampersand, "&");
DEFINE_EXACT_MATCHER(times, "*");
DEFINE_EXACT_MATCHER(comma, ",");
DEFINE_EXACT_MATCHER(hyphen, "-");
DEFINE_EXACT_MATCHER(minus, "-");
DEFINE_EXACT_MATCHER(slash, "/");
DEFINE_EXACT_MATCHER(divide, "/");
DEFINE_EXACT_MATCHER(colon, ":");
DEFINE_EXACT_MATCHER(semicolon, ";");
DEFINE_EXACT_MATCHER(lt, "<");
DEFINE_EXACT_MATCHER(lte, "<=");
DEFINE_EXACT_MATCHER(gt, ">");
DEFINE_EXACT_MATCHER(parent_of, ">");
DEFINE_EXACT_MATCHER(gte, ">=");
enum prefix_pattern_type {
ATOM,
SEQUENCE,
CHOICE,
OPTION,
AT_LEAST_ZERO,
AT_LEAST_ONE,
AT_LEAST_N,
AT_MOST_N,
EXACTLY_N,
END
};
typedef struct {
prefix_pattern_type tag;
int (*matcher)(char *);
} prefix_pattern_component;
typedef struct {
int length;
prefix_pattern_component *body;
} prefix_pattern;
#include <ctype.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include "prefix_primitives.h"
int prefix_is_exactly(char *src, char* pre) {
int p;
for (p = 0; pre[p] && src[p] == pre[p]; p++) ;
return pre[p] ? 0 : p;
}
int prefix_is_one_of(char *src, char *class) {
int i;
for (i = 0; class[i] && src[0] != class[i]; i++) ;
return class[i] ? 1 : 0;
}
int prefix_is_some_of(char *src, char *class) {
int p;
for (p = 0; prefix_is_one_of(src+p, class); p++) ;
return p;
}
int prefix_is_delimited_by(char *src, char *beg, char *end, int esc) {
int p, len = prefix_is_exactly(src, beg);
if (!len) return 0;
p = len;
while (1) {
if (src[p] == '\0') return 0;
len = prefix_is_exactly(src+p, end);
if (len && (!esc || src[p-1] != '\\')) return p + len;
p += len ? len : 1;
}
}
int _prefix_alternatives(char *src, ...) {
int p = 0;
va_list ap;
va_start(ap, src);
prefix_matcher m = va_arg(ap, prefix_matcher);
while (m && !(p = (*m)(src))) m = va_arg(ap, prefix_matcher);
va_end(ap);
return p;
}
int _prefix_sequence(char *src, ...) {
int p = 0, p_sum = 0;
va_list ap;
va_start(ap, src);
prefix_matcher m = va_arg(ap, prefix_matcher);
while (m && (p = (*m)(src))) p_sum += p, m = va_arg(ap, prefix_matcher);
va_end(ap);
return p ? p_sum : 0;
}
int prefix_optional(char *src, prefix_matcher m) {
int p = m(src);
return p ? p : -1;
}
DEFINE_SINGLE_CTYPE_MATCHER(space);
DEFINE_SINGLE_CTYPE_MATCHER(alpha);
DEFINE_SINGLE_CTYPE_MATCHER(digit);
DEFINE_SINGLE_CTYPE_MATCHER(xdigit);
DEFINE_SINGLE_CTYPE_MATCHER(alnum);
DEFINE_SINGLE_CTYPE_MATCHER(punct);
DEFINE_CTYPE_SEQUENCE_MATCHER(space);
DEFINE_CTYPE_SEQUENCE_MATCHER(alpha);
DEFINE_CTYPE_SEQUENCE_MATCHER(digit);
DEFINE_CTYPE_SEQUENCE_MATCHER(xdigit);
DEFINE_CTYPE_SEQUENCE_MATCHER(alnum);
DEFINE_CTYPE_SEQUENCE_MATCHER(punct);
DEFINE_TO_EOL_MATCHER(line_comment, "//");
DEFINE_DELIMITED_MATCHER(block_comment, "/*", "*/", 0);
DEFINE_DELIMITED_MATCHER(double_quoted_string, "\"", "\"", 1);
DEFINE_DELIMITED_MATCHER(single_quoted_string, "'", "'", 1);
DEFINE_DELIMITED_MATCHER(interpolant, "#{", "}", 0);
DEFINE_ALTERNATIVES_MATCHER(string, prefix_is_double_quoted_string,
prefix_is_single_quoted_string);
DEFINE_EXACT_MATCHER(lparen, "(");
DEFINE_EXACT_MATCHER(rparen, ")");
DEFINE_EXACT_MATCHER(lbrack, "[");
DEFINE_EXACT_MATCHER(rbrack, "]");
DEFINE_EXACT_MATCHER(lbrace, "{");
DEFINE_EXACT_MATCHER(rbrace, "}");
DEFINE_EXACT_MATCHER(underscore, "_");
DEFINE_EXACT_MATCHER(hyphen, "-");
DEFINE_EXACT_MATCHER(semicolon, ";");
DEFINE_EXACT_MATCHER(colon, ":");
DEFINE_EXACT_MATCHER(period, ".");
DEFINE_EXACT_MATCHER(question, "?");
DEFINE_EXACT_MATCHER(exclamation, "!");
DEFINE_EXACT_MATCHER(tilde, "~");
DEFINE_EXACT_MATCHER(backquote, "`");
DEFINE_EXACT_MATCHER(quote, "\"");
DEFINE_EXACT_MATCHER(apostrophe, "'");
DEFINE_EXACT_MATCHER(ampersand, "&");
DEFINE_EXACT_MATCHER(caret, "^");
DEFINE_EXACT_MATCHER(pipe, "|");
DEFINE_EXACT_MATCHER(slash, "/");
DEFINE_EXACT_MATCHER(backslash, "\\");
DEFINE_EXACT_MATCHER(asterisk, "*");
DEFINE_EXACT_MATCHER(pound, "#");
DEFINE_EXACT_MATCHER(hash, "#");
DEFINE_EXACT_MATCHER(plus, "+");
DEFINE_EXACT_MATCHER(minus, "-");
DEFINE_EXACT_MATCHER(times, "*");
DEFINE_EXACT_MATCHER(divide, "/");
DEFINE_EXACT_MATCHER(percent, "%");
DEFINE_EXACT_MATCHER(dollar, "$");
DEFINE_EXACT_MATCHER(gt, ">");
DEFINE_EXACT_MATCHER(gte, ">=");
DEFINE_EXACT_MATCHER(lt, "<");
DEFINE_EXACT_MATCHER(lte, "<=");
DEFINE_EXACT_MATCHER(eq, "=");
DEFINE_EXACT_MATCHER(assign, "=");
DEFINE_EXACT_MATCHER(equal, "==");
DEFINE_ALTERNATIVES_MATCHER(identifier_initial, prefix_is_alphas, prefix_is_underscore);
DEFINE_ALTERNATIVES_MATCHER(identifier_trailing, prefix_is_alnums, prefix_is_underscore);
DEFINE_FIRST_REST_MATCHER(identifier, prefix_is_identifier_initial, prefix_is_identifier_trailing);
DEFINE_SEQUENCE_MATCHER(hyphen_and_alpha, prefix_is_hyphen, prefix_is_alpha);
DEFINE_ALTERNATIVES_MATCHER(word_initial, prefix_is_identifier, prefix_is_hyphen_and_alpha);
DEFINE_ALTERNATIVES_MATCHER(word_trailing, prefix_is_alnums, prefix_is_hyphen, prefix_is_underscore);
DEFINE_FIRST_REST_MATCHER(word, prefix_is_word_initial, prefix_is_word_trailing);
typedef int(*prefix_matcher)(char *);
int prefix_is_exactly(char *, char*);
int prefix_is_one_of(char *, char *);
int prefix_is_some_of(char *, char *);
int prefix_is_delimited_by(char *, char *, char *, int);
int _prefix_alternatives(char *, ...);
int _prefix_sequence(char *, ...);
#define prefix_alternatives(src, ...) _prefix_alternatives(src, __VA_ARGS__, NULL)
#define prefix_sequence(src, ...) _prefix_sequence(src, __VA_ARGS__, NULL)
int prefix_optional(char *, prefix_matcher);
#define DECLARE_MATCHER(name) \
int prefix_is_ ## name(char *)
#define DEFINE_EXACT_MATCHER(name, prefix) \
int prefix_is_ ## name(char *src) { \
return prefix_is_exactly(src, prefix); \
}
#define DEFINE_SINGLE_CTYPE_MATCHER(type) \
int prefix_is_ ## type(char *src) { \
return is ## type(src[0]) ? 1 : 0; \
}
#define DEFINE_CTYPE_SEQUENCE_MATCHER(type) \
int prefix_is_ ## type ## s(char *src) { \
int p = 0; \
while (is ## type(src[p])) p++; \
return p; \
}
#define DEFINE_DELIMITED_MATCHER(name, begin, end, escapable) \
int prefix_is_ ## name(char *src) { \
return prefix_is_delimited_by(src, begin, end, escapable); \
}
#define DEFINE_TO_EOL_MATCHER(name, prefix) \
int prefix_is_ ## name(char *src) { \
int p = prefix_is_exactly(src, prefix); \
while (src[p] && src[p] != '\n') p++; \
return p; \
}
#define DEFINE_ALTERNATIVES_MATCHER(name, ...) \
int prefix_is_ ## name(char *src) { \
return prefix_alternatives(src, __VA_ARGS__); \
}
#define DEFINE_SEQUENCE_MATCHER(name, ...) \
int prefix_is_ ## name(char *src) { \
return prefix_sequence(src, __VA_ARGS__); \
}
#define DEFINE_OPTIONAL_MATCHER(name, matcher) \
int prefix_is_ ## name(char *src) { \
return prefix_optional(src, matcher); \
}
#define DEFINE_FIRST_REST_MATCHER(name, first_matcher, rest_matcher) \
int prefix_is_ ## name(char *src) { \
int p = first_matcher(src); \
int p_sum = p; \
while (p) { \
p = rest_matcher(src+p); \
p_sum += p; \
} \
return p_sum; \
}
DECLARE_MATCHER(space);
DECLARE_MATCHER(alpha);
DECLARE_MATCHER(digit);
DECLARE_MATCHER(xdigit);
DECLARE_MATCHER(alnum);
DECLARE_MATCHER(punct);
DECLARE_MATCHER(spaces);
DECLARE_MATCHER(alphas);
DECLARE_MATCHER(digits);
DECLARE_MATCHER(xdigits);
DECLARE_MATCHER(alnums);
DECLARE_MATCHER(puncts);
DECLARE_MATCHER(line_comment);
DECLARE_MATCHER(block_comment);
DECLARE_MATCHER(double_quoted_string);
DECLARE_MATCHER(single_quoted_string);
DECLARE_MATCHER(string);
DECLARE_MATCHER(interpolant);
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);
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include "prefix_primitives.h"
void printn(char *s, int n) {
int i;
printf("matched %d characters:\t", n);
for (i = 0; i < n; i++) {
putchar(s[i]);
}
putchar('\n');
}
int main() {
char *s = "'this \\'is\\' a \"string\" now' blah blah blah";
char *t = "/* this is a c comment \\*/ blah blah";
char *u = "#{ this is an interpolant \\} blah blah";
char *v = "hello my name is aaron";
char *w = "_identifier123";
char *x = "12nonidentifier_";
char *y = "-blah-blah_blah";
printn(s, prefix_is_string(s));
printn(s, prefix_is_one_of(s, "abcde+'"));
printn(s, prefix_is_some_of(s, "'abcdefghijklmnopqrstuvwxyz "));
printn(t, prefix_is_block_comment(t));
printn(u, prefix_is_interpolant(u));
printn(v, prefix_is_alphas(v));
printn(v, prefix_is_alpha(v));
printn(v, prefix_is_exactly(v, "hello"));
printn(x, prefix_sequence(x, prefix_is_digits, prefix_is_alnums));
printn(x, prefix_alternatives(x, prefix_is_hyphen, prefix_is_alphas, prefix_is_puncts, prefix_is_digits));
//printn(y, prefix_is_word(y));
printf("blah");
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