Commit be6d8f2d by Aaron Leung

Basic combinators for tokenizing. Unfortunately, I can't use va_args because it…

Basic combinators for tokenizing. Unfortunately, I can't use va_args because it can't handle the signatures of function pointers.
parent b382474c
#include <ctype.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include "prefix_primitives.h"
int prefix_is_exactly(char *src, char* pre) {
......@@ -33,6 +34,12 @@ int prefix_is_delimited_by(char *src, char *beg, char *end, int esc) {
}
}
int prefix_try_alternatives(char *src, int (*m[])(char *)) {
int p = 0;
while (m && !(p = (*m)(src))) m++;
return p;
}
DEFINE_SINGLE_CTYPE_MATCHER(space);
DEFINE_SINGLE_CTYPE_MATCHER(alpha);
DEFINE_SINGLE_CTYPE_MATCHER(digit);
......@@ -52,8 +59,12 @@ DEFINE_DELIMITED_MATCHER(single_quoted_string, "'", "'", 1);
DEFINE_DELIMITED_MATCHER(interpolant, "#{", "}", 0);
int prefix_is_string(char *src) {
int len = prefix_is_double_quoted_string(src);
return len ? len : prefix_is_single_quoted_string(src);
int (*ms[])(char *) = {
prefix_is_double_quoted_string,
prefix_is_single_quoted_string,
NULL
};
return prefix_try_alternatives(src, ms);
}
DEFINE_EXACT_MATCHER(lparen, "(");
......
......@@ -16,14 +16,16 @@ void printn(char *s, int n) {
int main() {
char *s = "'this \\'is\\' a \"string\" now' blah blah blah";
char *t = "/* this is a c comment \\x */ blah blah";
char *u = "#{ this is an interpolant \\x } 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";
int (*funcs[])(char *) = { prefix_is_string, prefix_is_block_comment, NULL };
printn(s, prefix_is_string(s));
printn(s, funcs[0](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(t, funcs[1](t));
printn(u, prefix_is_interpolant(u));
printn(v, prefix_is_alphas(v));
printn(v, prefix_is_one_alpha(v));
......
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