41 lines
735 B
C
41 lines
735 B
C
/*
|
|
* Copyright (c) Camden Dixie O'Brien
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
|
|
#ifndef FSA_H
|
|
#define FSA_H
|
|
|
|
#include <stdbool.h>
|
|
|
|
#define CHAR_COUNT 256
|
|
#define ALPHABET_SIZE (CHAR_COUNT + 1)
|
|
|
|
// Use one more than any valid char to represent empty string
|
|
#define EPSILON CHAR_COUNT
|
|
|
|
typedef struct {
|
|
int input, next;
|
|
} fsa_rule_t;
|
|
|
|
typedef struct {
|
|
bool final;
|
|
int count, capacity;
|
|
fsa_rule_t *rules;
|
|
} fsa_state_t;
|
|
|
|
typedef struct {
|
|
int count, capacity, initial;
|
|
fsa_state_t *states;
|
|
} fsa_t;
|
|
|
|
void fsa_init(fsa_t *fsa);
|
|
void fsa_free(const fsa_t *fsa);
|
|
|
|
int fsa_add_state(fsa_t *fsa);
|
|
void fsa_add_rule(fsa_t *fsa, int from, int to, int input);
|
|
|
|
bool fsa_accepts(const fsa_t *dfa, const char *input, int len);
|
|
|
|
#endif
|