Skip to content
Snippets Groups Projects
Select Git revision
  • 2d5f281e5267473a5634d0a5c18eb0e6a15717f6
  • master default protected
  • johannes
  • partial_parser
  • Aloui_Dary
  • ignore_punct
  • AC
  • classifier
  • fixhelp
  • libmacaon2
  • error_predictor
  • morpho
  • ssrnn
  • tfparsing
  • silvio
  • tagger_options
  • maca_trans_frame_parser
  • alexis
  • new_config
  • tagparse
  • maca_graph_parser
21 results

l_rule.c

Blame
  • l_rule.c 2.37 KiB
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    #include "util.h"
    
    
    int l_rule_is_applicable(char *form, char *l_rule)
    {
      int i,j;
      int sep_index;
      int lemma_suffix_length;
      int form_suffix_length;
      int form_length = strlen(form);
      int l_rule_length = strlen(l_rule);
      
      for(sep_index=1; sep_index < l_rule_length; sep_index++)
        if(l_rule[sep_index] == '@')
          break;
      
      lemma_suffix_length = l_rule_length - 1 - sep_index;
      form_suffix_length = sep_index - 1;
    
      for(j=0, i=form_length - form_suffix_length; j < sep_index; i++, j++)
        if((l_rule[j] != '*') && (l_rule[j] != form[i]))
          return 0;
      return 1;
    }
    
    char *apply_l_rule(char *form, char *l_rule)
    {
      int i,j;
      int sep_index;
      int lemma_suffix_length;
      int form_suffix_length;
      char *lemma = NULL;
      int form_length = strlen(form);
      int l_rule_length = strlen(l_rule);
      int lemma_length;
      
      for(sep_index=1; sep_index < l_rule_length; sep_index++)
        if(l_rule[sep_index] == '@')
          break;
      
      lemma_suffix_length = l_rule_length - 1 - sep_index;
      form_suffix_length = sep_index - 1;
    
      lemma_length = form_length + lemma_suffix_length - form_suffix_length;
      if(lemma_length < form_length)
        lemma_length = form_length;
      lemma = (char *) memalloc((lemma_length + 1) * sizeof(char)); 
      strcpy(lemma, form);
    
      for(j=0, i=form_length - form_suffix_length; j < lemma_suffix_length; i++, j++){
        lemma[i] = l_rule[sep_index + j + 1];
      }
      lemma[i] = 0;
      return lemma;
    }
      
    
    char *compute_l_rule(char *lemma, char *form, int strict)
    {
      int breakpoint,j,k;
      int lemma_suffix_length;
      int form_suffix_length;
      int lemma_length = strlen(lemma);
      int form_length = strlen(form);
      char *l_rule;
      
      for(breakpoint=0; (breakpoint < lemma_length) && (breakpoint < form_length); breakpoint++)
        if(form[breakpoint] != lemma[breakpoint])
          break;
    
      lemma_suffix_length = lemma_length - breakpoint;
      form_suffix_length = form_length - breakpoint;
    
      //  printf("lemma suffix length = %d form suffix length = %d\n", lemma_suffix_length, form_suffix_length);
      l_rule = (char *)memalloc((lemma_suffix_length + form_suffix_length + 3) * sizeof(char));
    
      j = 0;
      l_rule[j++] = '@'; 
      for(k=0; k < form_suffix_length; k++)
        l_rule[j++] = strict? form[breakpoint + k] : '*';
      l_rule[j++] = '@';
      for(k=0; k < lemma_suffix_length; k++)
        l_rule[j++] = lemma[breakpoint + k];
      l_rule[j] = 0;
      return l_rule;
    }