summaryrefslogtreecommitdiff
path: root/src/test/check_cnp.c
blob: 7a0a3252fbc985af29691a02bdd06fdf6a9da095 (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
#include "../cnp.h"

#define READ_INTO_CPA(N, U, L, I, VA, VI, CP) do {      \
    U = new_utf8(N, L);                                 \
    I = get_info((str *)U, 0);                          \
    VA = MYALLOC(NUM, 2);                               \
    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 = 'B';

  utf8* uname = NULL;

  str_info info = EMPTY_STR_INFO;

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

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

  name = MYALLOC(char, 3);
  *(name+1) = 0;
  *name = 'U';

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

  /* name = MYALLOC(char, 2);
   * *(name+1) = 0;
   * *name = 'F';
   *
   * READ_INTO_CPA(name, uname, 1, info, varray, vindex, cpap);
   *
   * name = MYALLOC(char, 2);
   * *(name+1) = 0;
   * *name = 'D';
   *
   * READ_INTO_CPA(name, uname, 1, info, varray, vindex, cpap); */

  READ_TNT_STRING(0, "nn", 2, (NT) 1, (NT) 0);
  rule = new_rule(0, new_list());
  add_to_list(rules, rule);

  READ_TNT_STRING(1, "t", 1, (T) '>');
  READ_TNT_STRING(1, "t", 1, (T) '<');
  READ_TNT_STRING(1, "t", 1, (T) '+');
  READ_TNT_STRING(1, "t", 1, (T) '-');
  READ_TNT_STRING(1, "t", 1, (T) ',');
  READ_TNT_STRING(1, "t", 1, (T) '.');
  READ_TNT_STRING(1, "tnt", 3, (T) '[', (NT) 0, (T) ']');

  Grammar *g = new_grammar();

  build_grammar(g, rules, names);

  print_grammar(g);

  utf8 *string = new_utf8("[,[.[+]]-]", 10);

  printf("\nPrinting the input...\n%s\n", get_data((str *) string));

  Environment *env = cnp_parse(g, (str *) string);

  if (env) {
    if (!(env_error_p(env))) {
      printf("Successfully parsed the input:\n");
      bsr_print(env_bsrp(env), env_grammar(env), 1);
    } else {
      printf("There are errors!\n");
    }

    destroy_env(env);
  }

  destroy_grammar(g, 1);

  destroy_list(rules, 1);

  free(string);

  return 0;
}