update fst struct

This commit is contained in:
yihaoDeng 2021-11-24 20:03:20 +08:00
parent c5d5397874
commit d674fcc8ba
2 changed files with 28 additions and 11 deletions

View File

@ -99,15 +99,15 @@ FstState fstStateCreateFrom(FstSlice* data, CompiledAddr addr);
FstState fstStateCreate(State state); FstState fstStateCreate(State state);
//compile //compile
void fstStateCompileForOneTransNext(FstState* state, FstCountingWriter *w, CompiledAddr addr, uint8_t inp); void fstStateCompileForOneTransNext(FstCountingWriter *w, CompiledAddr addr, uint8_t inp);
void fstStateCompileForOneTrans(FstState* state, FstCountingWriter *w, CompiledAddr addr, FstTransition trn); void fstStateCompileForOneTrans(FstCountingWriter *w, CompiledAddr addr, FstTransition trn);
void fstStateCompileForAnyTrans(FstState* state, FstCountingWriter *w, CompiledAddr addr, FstBuilderNode *node); void fstStateCompileForAnyTrans(FstCountingWriter *w, CompiledAddr addr, FstBuilderNode *node);
// set_comm_input // set_comm_input
void fstStateSetCommInput(FstState* state, uint8_t inp); void fstStateSetCommInput(FstState* state, uint8_t inp);
// comm_input // comm_input
uint8_t fstStateCommInput(FstState* state); uint8_t fstStateCommInput(FstState* state, bool *null);
// input_len // input_len

View File

@ -187,14 +187,24 @@ FstState fstStateCreate(State state){
return stateDict[idx]; return stateDict[idx];
} }
//compile //compile
void fstStateCompileForOneTransNext(FstState* state, FstCountingWriter *w, CompiledAddr addr, uint8_t inp) { void fstStateCompileForOneTransNext(FstCountingWriter *w, CompiledAddr addr, uint8_t inp) {
FstState s = fstStateCreate(OneTransNext);
fstStateSetCommInput(&s, inp);
bool null = false;
uint8_t v = fstStateCommInput(&s, &null);
if (null) {
// w->write_all(&[inp])
}
// w->write_all(&[s.val])
return ; return ;
} }
void fstStateCompileForOneTrans(FstState* state, FstCountingWriter *w, CompiledAddr addr, FstTransition trn) { void fstStateCompileForOneTrans(FstCountingWriter *w, CompiledAddr addr, FstTransition trn) {
return ; return ;
} }
void fstStateCompileForAnyTrans(FstState* state, FstCountingWriter *w, CompiledAddr addr, FstBuilderNode *node) { void fstStateCompileForAnyTrans(FstCountingWriter *w, CompiledAddr addr, FstBuilderNode *node) {
return; return;
} }
@ -208,9 +218,13 @@ void fstStateSetCommInput(FstState* s, uint8_t inp) {
} }
// comm_input // comm_input
uint8_t fstStateCommInput(FstState* s) { uint8_t fstStateCommInput(FstState* s, bool *null) {
assert(s->state == OneTransNext || s->state == OneTrans); assert(s->state == OneTransNext || s->state == OneTrans);
uint8_t v = s->val & 0b00111111; uint8_t v = s->val & 0b00111111;
if (v == 0) {
*null = true;
return v;
}
//v = 0 indicate that common_input is None //v = 0 indicate that common_input is None
return v == 0 ? 0 : COMMON_INPUT(v); return v == 0 ? 0 : COMMON_INPUT(v);
} }
@ -219,7 +233,9 @@ uint8_t fstStateCommInput(FstState* s) {
uint64_t fstStateInputLen(FstState* s) { uint64_t fstStateInputLen(FstState* s) {
assert(s->state == OneTransNext || s->state == OneTrans); assert(s->state == OneTransNext || s->state == OneTrans);
return fstStateCommInput(s) == 0 ? 1 : 0; bool null = false;
fstStateCommInput(s, &null);
return null ? 1 : 0 ;
} }
@ -250,8 +266,9 @@ uint64_t fstStateEndAddrForAnyTrans(FstState *state, uint64_t version, FstSlice
uint8_t fstStateInput(FstState *s, FstNode *node) { uint8_t fstStateInput(FstState *s, FstNode *node) {
assert(s->state == OneTransNext || s->state == OneTrans); assert(s->state == OneTransNext || s->state == OneTrans);
FstSlice *slice = &node->data; FstSlice *slice = &node->data;
uint8_t inp = fstStateCommInput(s); bool null = false;
return inp != 0 ? inp : slice->data[slice->start - 1]; uint8_t inp = fstStateCommInput(s, &null);
return null == false ? inp : slice->data[slice->start - 1];
} }
uint8_t fstStateInputForAnyTrans(FstState *s, FstNode *node, uint64_t i) { uint8_t fstStateInputForAnyTrans(FstState *s, FstNode *node, uint64_t i) {
assert(s->state == AnyTrans); assert(s->state == AnyTrans);