Select Git revision
movements.c
-
Alexis Nasr authored
added feature s0seg that cheks wheter s0 is eos, this feature helps discriminate between EOS and REDUCE
Alexis Nasr authoredadded feature s0seg that cheks wheter s0 is eos, this feature helps discriminate between EOS and REDUCE
movements.c 6.80 KiB
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"util.h"
#include"movements.h"
#include"mvt_tagset.h"
int movement_apply(config *c, int mvt_code, mvt_tagset *tagset, int root_code, tm *machine)
{
int result = 0;
int mvt_type = mvt_tagset_get_type(tagset, mvt_code);
int mvt_label = mvt_tagset_get_label(tagset, mvt_code);
switch(mvt_type){
case MVT_FWD :
result = movement_forward(c);
break;
case MVT_SHIFT :
result = movement_shift(c);
break;
case MVT_REDUCE :
result = movement_reduce(c);
break;
case MVT_EOS :
result = movement_eos(c);
break;
case MVT_ROOT :
result = movement_root(c, root_code);
break;
case MVT_LEFT :
result = movement_left_arc(c, mvt_label);
break;
case MVT_RIGHT :
result = movement_right_arc(c, mvt_label);
break;
case MVT_POS :
result = movement_add_pos(c, mvt_label);
// result = movement_forward(c);
break;
case MVT_CPOS :
result = movement_add_cpos(c, mvt_label);
break;
case MVT_MORPHO :
result = movement_add_morpho(c, mvt_label);
break;
}
if(machine)
c->current_state_nb = tm_delta(machine, c->current_state_nb, mvt_code);
return result;
}
int movement_forward(config *c)
{
return word_buffer_move_right(c->bf);
}
int movement_eos(config *c)
{
if(stack_is_empty(config_get_stack(c))) return 0;
word *s0 = stack_top(config_get_stack(c));
/* word on top of stack is already eos */
if(word_get_sent_seg(s0) == 1) return 0;
/* set word on the top of the stack to eos */
word_set_sent_seg(s0, 1);
config_push_mvt(c, MVT_EOS, -1, s0, NULL);
return 1;
}
int movement_eos_undo(config *c)
{
word *gov = mvt_get_gov(mvt_stack_top(config_get_history(c)));
/* word on the top of the stack is not eos anymore */
word_set_sent_seg(gov, 0);
mvt_free(config_pop_mvt(c));
return 1;
}
int movement_left_arc(config *c, int label)
{
if(stack_is_empty(config_get_stack(c))) return 0;
/* if(word_buffer_is_empty(config_get_buffer(c))) return 0; */
/* word on top of the stack should not have a governor */ // com here bug ?
if(word_get_gov(stack_top(config_get_stack(c))) != WORD_INVALID_GOV) return 0;
word *gov = word_buffer_b0(config_get_buffer(c));
word *dep = stack_top(config_get_stack(c));
int dist = (word_get_index(gov)) - (word_get_index(dep));
/* create a new dependency */
word_set_gov(dep, dist);
word_set_label(dep, label);
gov->lspan = dep->lspan;
config_push_mvt(c, MVT_LEFT, label, gov, dep);
stack_pop(config_get_stack(c));
return 1;
}
int movement_left_arc_undo(config *c)
{
word *dep = mvt_get_dep(mvt_stack_top(config_get_history(c)));
/* undo dependency */
word_set_gov(dep, WORD_INVALID_GOV);
word_set_label(dep, -1);
mvt_free(config_pop_mvt(c));
stack_push(config_get_stack(c), dep);
return 1;
}
int movement_right_arc(config *c, int label)
{
if(stack_is_empty(config_get_stack(c))) return 0;
if(word_buffer_end(config_get_buffer(c))) return 0;
word *gov = stack_top(config_get_stack(c));
word *dep = word_buffer_b0(config_get_buffer(c));
int dist = (word_get_index(gov)) - (word_get_index(dep));
/* create a new dependency */
word_set_gov(dep, dist);
word_set_label(dep, label);
gov->rspan = dep->rspan;
stack_push(config_get_stack(c), word_buffer_b0(config_get_buffer(c)));
word_buffer_move_right(config_get_buffer(c));
config_push_mvt(c, MVT_RIGHT, label, gov, dep);
return 1;
}
int movement_right_arc_undo(config *c)
{
word *dep = mvt_get_dep(mvt_stack_top(config_get_history(c)));
/* undo dependency */
word_set_gov(dep, WORD_INVALID_GOV);
word_set_label(dep, -1);
stack_pop(config_get_stack(c));
word_buffer_move_left(config_get_buffer(c));
mvt_free(config_pop_mvt(c));
return 1;
}
int movement_shift(config *c)
{
/* if(word_buffer_is_empty(config_get_buffer(c))) return 0; */
if(word_buffer_end(config_get_buffer(c))) return 0;
word *b0 = word_buffer_b0(config_get_buffer(c));
stack_push(config_get_stack(c), b0);
config_push_mvt(c, MVT_SHIFT, -1, b0, NULL);
word_buffer_move_right(config_get_buffer(c));
return 1;
}
int movement_shift_undo(config *c)
{
stack_pop(config_get_stack(c));
mvt_free(config_pop_mvt(c));
word_buffer_move_left(config_get_buffer(c));
return 1;
}
int movement_reduce(config *c)
{
if(stack_nbelem(config_get_stack(c)) <= 1) return 0;
word *s0 = stack_top(config_get_stack(c));
/* word on top of stack must have a governor */
if(word_get_gov(s0) == WORD_INVALID_GOV) return 0;
config_push_mvt(c, MVT_REDUCE, -1, s0, NULL);
stack_pop(config_get_stack(c));
return 1;
}
int movement_reduce_undo(config *c)
{
word *gov = mvt_get_gov(mvt_stack_top(config_get_history(c)));
mvt_free(config_pop_mvt(c));
stack_push(config_get_stack(c), gov);
return 1;
}
int movement_root(config *c, int root_code)
{
if(stack_is_empty(config_get_stack(c))) return 0;
word *s0 = stack_top(config_get_stack(c));
word_set_gov(s0, 0);
word_set_label(s0, root_code);
s0->is_root = 1;
/*---- ajout 19/12/17 ----------*/
// word_set_sent_seg(word_buffer_get_word_n(config_get_buffer(c), s0->rspan), 1);
/*-----------------------------*/
stack_pop(config_get_stack(c));
config_push_mvt(c, MVT_ROOT, -1, s0, NULL);
return 1;
}
int movement_root_undo(config *c)
{
word *gov = mvt_get_gov(mvt_stack_top(config_get_history(c)));
if(gov == NULL) return 0;
word_set_gov(gov, WORD_INVALID_GOV);
word_set_label(gov, -1);
gov->is_root = 0;
stack_push(config_get_stack(c), gov);
mvt_free(config_pop_mvt(c));
return 1;
}
int movement_add_pos(config *c, int pos)
{
if(word_buffer_b0(config_get_buffer(c)) == NULL) return 0;
word *b0 = word_buffer_b0(config_get_buffer(c));
word_set_pos(b0, pos);
config_push_mvt(c, MVT_POS, pos, b0, NULL);
return 1;
}
int movement_add_pos_undo(config *c)
{
word *gov = mvt_get_gov(mvt_stack_top(config_get_history(c)));
word_set_pos(gov, -1);
mvt_free(config_pop_mvt(c));
return 1;
}
int movement_add_morpho(config *c, int morpho)
{
if(word_buffer_b0(config_get_buffer(c)) == NULL) return 0;
word *b0 = word_buffer_b0(config_get_buffer(c));
word_set_feats(b0, morpho);
config_push_mvt(c, MVT_MORPHO, morpho, b0, NULL);
return 1;
}
int movement_add_morpho_undo(config *c)
{
word *gov = mvt_get_gov(mvt_stack_top(config_get_history(c)));
word_set_feats(gov, -1);
mvt_free(config_pop_mvt(c));
return 1;
}
int movement_add_cpos(config *c, int cpos)
{
if(word_buffer_b0(config_get_buffer(c)) == NULL) return 0;
word *b0 = word_buffer_b0(config_get_buffer(c));
if(word_get_cpos(b0) != -1) return 0;
word_set_cpos(b0, cpos);
config_push_mvt(c, MVT_CPOS, cpos, b0, NULL);
return 1;
}
int movement_add_cpos_undo(config *c)
{
word *gov = mvt_get_gov(mvt_stack_top(config_get_history(c)));
word_set_cpos(gov, -1);
mvt_free(config_pop_mvt(c));
return 1;
}