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 <ctype.h>
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <stdarg.h>
#include "prefix_primitives.h" #include "prefix_primitives.h"
int prefix_is_exactly(char *src, char* pre) { 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) { ...@@ -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(space);
DEFINE_SINGLE_CTYPE_MATCHER(alpha); DEFINE_SINGLE_CTYPE_MATCHER(alpha);
DEFINE_SINGLE_CTYPE_MATCHER(digit); DEFINE_SINGLE_CTYPE_MATCHER(digit);
...@@ -52,8 +59,12 @@ DEFINE_DELIMITED_MATCHER(single_quoted_string, "'", "'", 1); ...@@ -52,8 +59,12 @@ DEFINE_DELIMITED_MATCHER(single_quoted_string, "'", "'", 1);
DEFINE_DELIMITED_MATCHER(interpolant, "#{", "}", 0); DEFINE_DELIMITED_MATCHER(interpolant, "#{", "}", 0);
int prefix_is_string(char *src) { int prefix_is_string(char *src) {
int len = prefix_is_double_quoted_string(src); int (*ms[])(char *) = {
return len ? len : prefix_is_single_quoted_string(src); prefix_is_double_quoted_string,
prefix_is_single_quoted_string,
NULL
};
return prefix_try_alternatives(src, ms);
} }
DEFINE_EXACT_MATCHER(lparen, "("); DEFINE_EXACT_MATCHER(lparen, "(");
......
...@@ -16,14 +16,16 @@ void printn(char *s, int n) { ...@@ -16,14 +16,16 @@ void printn(char *s, int n) {
int main() { int main() {
char *s = "'this \\'is\\' a \"string\" now' blah blah blah"; char *s = "'this \\'is\\' a \"string\" now' blah blah blah";
char *t = "/* this is a c comment \\x */ blah blah"; char *t = "/* this is a c comment \\*/ blah blah";
char *u = "#{ this is an interpolant \\x } blah blah"; char *u = "#{ this is an interpolant \\} blah blah";
char *v = "hello my name is aaron"; char *v = "hello my name is aaron";
printn(s, prefix_is_string(s)); int (*funcs[])(char *) = { prefix_is_string, prefix_is_block_comment, NULL };
printn(s, funcs[0](s));
printn(s, prefix_is_one_of(s, "abcde+'")); printn(s, prefix_is_one_of(s, "abcde+'"));
printn(s, prefix_is_some_of(s, "'abcdefghijklmnopqrstuvwxyz ")); 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(u, prefix_is_interpolant(u));
printn(v, prefix_is_alphas(v)); printn(v, prefix_is_alphas(v));
printn(v, prefix_is_one_alpha(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