summaryrefslogtreecommitdiff
path: root/src/test/check_bsr.c
blob: 4a6ba4eed4f11f760bae504f4bc3b82a10a8ba10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "util.h"
#include "str.h"
#include "utf8.h"
#include "grammar.h"
#include "list.h"
#include "../bsr.h"

#define READ_INTO_CPA(N, U, I, VA, VI, CP) do {         \
    U = new_utf8(N, 1);                                 \
    I = get_info((str *)U, 0);                          \
    VA = MYALLOC(NUM, 1);                               \
    VI = 0;                                             \
    for (NUM index = 0;                                 \
         I.value >= 0 && index < str_length((str *) U); \
         index += I.step, VI++) {                       \
      I = get_info((str *)U, index);                    \
      *(VA+VI) = I.value;                               \
    }                                                   \
    CP = MYALLOC(cpa, 1);                               \
    CP->array = VA;                                     \
    CP->size = VI;                                      \
    add_to_list(names, CP);                             \
    destroy_str((str *)U, 1);                           \
  } while (0)

#define READ_TNT_STRING(LEFT, FORMAT, LEN, ...) do {            \
    tnt_string = new_tnt_string(FORMAT, LEN, __VA_ARGS__);      \
    if (!tnt_string) {                                          \
      fleprintf("left = %d, f = %s, l = %d, "                   \
                "cannot create tnt string\n",                   \
                LEFT, FORMAT, LEN);                             \
      map_list(rules, destroy_rule_and_free_all);               \
      destroy_list(rules, 0);                                   \
      map_list(names, destroy_cpa_and_free_all);                \
      destroy_list(names, 0);                                   \
      return 1;                                                 \
    }                                                           \
    rule = new_rule(LEFT, tnt_string);                          \
    add_to_list(rules, rule);                                   \
  } while (0)


int
main(int UNUSED argc, char ** UNUSED argv)
{
  /* have a grammar for testing */
  List *tnt_string = NULL;
  Rule *rule = NULL;
  List *rules = new_list();
  List *names = new_list();

  char *name = MYALLOC(char, 2);
  *(name+1) = 0;
  *name = 'E';

  utf8* uname = NULL;

  str_info info = EMPTY_STR_INFO;

  NUM *varray = NULL;
  NUM vindex = 0;
  cpa *cpap = NULL;

  READ_INTO_CPA(name, uname, info, varray, vindex, cpap);

  name = MYALLOC(char, 2);
  *(name+1) = 0;
  *name = 'T';

  READ_INTO_CPA(name, uname, info, varray, vindex, cpap);

  name = MYALLOC(char, 2);
  *(name+1) = 0;
  *name = 'F';

  READ_INTO_CPA(name, uname, info, varray, vindex, cpap);

  name = MYALLOC(char, 2);
  *(name+1) = 0;
  *name = 'D';

  READ_INTO_CPA(name, uname, info, varray, vindex, cpap);

  READ_TNT_STRING(0, "n", 1, (NT) 1);
  READ_TNT_STRING(0, "ntn", 3, (NT) 1, (T) 43, (NT) 1);

  READ_TNT_STRING(1, "n", 1, (NT) 2);
  READ_TNT_STRING(1, "ntn", 3, (NT) 2, (T) 42, (NT) 2);

  READ_TNT_STRING(2, "n", 1, (NT) 3);
  READ_TNT_STRING(2, "tnt", 3, (T) 40, (NT) 0, (T) 41);

  READ_TNT_STRING(3, "tn", 2, (T) 48, (NT) 3);
  READ_TNT_STRING(3, "tn", 2, (T) 49, (NT) 3);
  READ_TNT_STRING(3, "tn", 2, (T) 50, (NT) 3);
  READ_TNT_STRING(3, "tn", 2, (T) 51, (NT) 3);
  READ_TNT_STRING(3, "tn", 2, (T) 52, (NT) 3);
  READ_TNT_STRING(3, "tn", 2, (T) 53, (NT) 3);
  READ_TNT_STRING(3, "tn", 2, (T) 54, (NT) 3);
  READ_TNT_STRING(3, "tn", 2, (T) 55, (NT) 3);
  READ_TNT_STRING(3, "tn", 2, (T) 56, (NT) 3);
  READ_TNT_STRING(3, "tn", 2, (T) 57, (NT) 3);
  rule = new_rule(3, new_list());
  add_to_list(rules, rule);

  Grammar *g = new_grammar();

  build_grammar(g, rules, names);

  print_grammar(g);


  BOOL error = 0;
  bsr *bsrp = new_bsr(&error, g);

  if (error) goto cleanup;

  bsr_add(g, bsrp, 0, 0, 1, 0, 1, 2);
  bsr_add(g, bsrp, 0, 1, 1, 0, 1, 2);
  bsr_add(g, bsrp, 0, 1, 2, 0, 1, 2);
  
  if (bsr_find(bsrp, g, &error,
               0, 0, 1, 0, 1, 2)) {
    printf("Successfully found 0, 0, 1, 0, 1, 2\n");
  } else {
    fleprintf0("Fail to find 0, 0, 1, 0, 1, 2\n");
  }

  if (bsr_find(bsrp, g, &error,
               0, 0, 1, 0, 1, 3)) {
    fleprintf0("Accidentally found 0, 0, 1, 0, 1, 3\n");
  } else {
    printf("Indeed cannot find 0, 0, 1, 0, 1, 3\n");
  }

  bsr_print(bsrp, g, 1);

 cleanup:

  destroy_grammar(g, 1);

  destroy_list(rules, 1);

  destroy_bsr(bsrp);

  return 0;

}