Commit af1018ed by Aaron Leung

Refactoring and fixing stuff.

parent a4b84541
enum sss_type {
ATOM,
SEQUENCE,
CHOICE,
OPTION,
AT_LEAST_ZERO,
AT_LEAST_ONE,
AT_LEAST_N,
AT_MOST_N,
EXACTLY_N,
END
};
typedef struct {
sss_type tag;
int (*matcher)(char *);
} sss_component;
typedef struct {
int length;
sss_component *body;
} sss_pattern;
#include <ctype.h>
#include <string.h>
#include "prefix_primitives.h"
int prefix_is_exactly(char *src, char* pre) {
int p = 0;
while (1) {
if (pre[p] == '\0') return p;
if (pre[p] != src[p]) return 0;
p++;
}
}
int prefix_is_delimited_by(char *src, char *beg, char *end, int esc) {
int p = 0;
int 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;
}
}
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_TO_EOL_MATCHER(line_comment, "//");
DEFINE_DELIMITED_MATCHER(block_comment, "/*", "*/", 0);
DEFINE_DELIMITED_MATCHER(dqstring, "\"", "\"", 1);
DEFINE_DELIMITED_MATCHER(sqstring, "'", "'", 1);
DEFINE_DELIMITED_MATCHER(interpolant, "#{", "}", 0);
int prefix_is_string_constant(char *src) {
int len = prefix_is_dqstring(src);
len = len ? len : prefix_is_sqstring(src);
return len;
}
int prefix_is_exactly(char *, char*);
int prefix_is_delimited_by(char *, char *, char *, int);
#define DECLARE_MATCHER(name) \
int prefix_is_ ## name(char *)
#define DEFINE_SINGLE_CTYPE_MATCHER(type) \
int prefix_is_one_ ## 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++])) ; \
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; \
}
DECLARE_MATCHER(spaces);
DECLARE_MATCHER(alphas);
DECLARE_MATCHER(digits);
DECLARE_MATCHER(xdigits);
DECLARE_MATCHER(alnums);
DECLARE_MATCHER(line_comment);
DECLARE_MATCHER(block_comment);
DECLARE_MATCHER(dqstring);
DECLARE_MATCHER(sqstring);
DECLARE_MATCHER(interpolant);
DECLARE_MATCHER(string_constant);
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