static fsg_model_t * get_fsg(jsgf_t *grammar, const char *name) { logmath_t *lmath; fsg_model_t *fsg; jsgf_rule_t *rule; /* Take the -toprule if specified. */ if (name) { rule = jsgf_get_rule(grammar, name); if (rule == NULL) { E_ERROR("Start rule %s not found\n", name); return NULL; } } else { rule = jsgf_get_public_rule(grammar); if (rule == NULL) { E_ERROR("No public rules found in grammar %s\n", jsgf_grammar_name(grammar)); return NULL; } else { E_INFO("No -toprule was given; grabbing the first public rule: " "'%s' of the grammar '%s'.\n", jsgf_rule_name(rule), jsgf_grammar_name(grammar)); } } lmath = logmath_init(1.0001, 0, 0); fsg = jsgf_build_fsg_raw(grammar, rule, lmath, 1.0); return fsg; }
jsgf_rule_t * jsgf_get_public_rule(jsgf_t * grammar) { jsgf_rule_iter_t *itor; jsgf_rule_t *public_rule = NULL; for (itor = jsgf_rule_iter(grammar); itor; itor = jsgf_rule_iter_next(itor)) { jsgf_rule_t *rule = jsgf_rule_iter_rule(itor); if (jsgf_rule_public(rule)) { const char *rule_name = jsgf_rule_name(rule); char *dot_pos; if ((dot_pos = strrchr(rule_name + 1, '.')) == NULL) { public_rule = rule; jsgf_rule_iter_free(itor); break; } if (0 == strncmp(rule_name + 1, jsgf_grammar_name(grammar), dot_pos - rule_name - 1)) { public_rule = rule; jsgf_rule_iter_free(itor); break; } } } return public_rule; }
int main(int argc, char *argv[]) { logmath_t *lmath; fsg_model_t *fsg; jsgf_t *jsgf; jsgf_rule_t *rule; lmath = logmath_init(1.0001, 0, 0); /* Test loading */ jsgf = jsgf_parse_file(LMDIR "/polite.gram", NULL); TEST_ASSERT(jsgf); rule = jsgf_get_rule(jsgf, "polite.startPolite"); TEST_ASSERT(rule); fsg = jsgf_build_fsg(jsgf, rule, lmath, 7.5); TEST_ASSERT(fsg); TEST_EQUAL_STRING("polite", jsgf_grammar_name(jsgf)); TEST_ASSERT(fsg_model_add_silence(fsg, "<sil>", -1, 0.3)); TEST_ASSERT(fsg_model_add_silence(fsg, "++NOISE++", -1, 0.3)); TEST_ASSERT(fsg_model_add_alt(fsg, "please", "please(2)")); jsgf_grammar_free(jsgf); fsg_model_write(fsg, stdout); fsg_model_free(fsg); /* Or do everything at once */ fsg = jsgf_read_file(LMDIR "/public.gram", lmath, 1.0); fsg_model_free(fsg); /* Test grammar with keywords inside */ jsgf = jsgf_parse_file(LMDIR "/public.gram", NULL); TEST_ASSERT(jsgf); jsgf_grammar_free(jsgf); jsgf = jsgf_parse_string("#JSGF V1.0; grammar test; public <choice> = yes | no;", NULL); TEST_ASSERT(jsgf); rule = jsgf_get_rule(jsgf, "test.choice"); TEST_ASSERT(rule); fsg = jsgf_build_fsg(jsgf, rule, lmath, 7.5); fsg_model_write(fsg, stdout); fsg_model_free(fsg); jsgf_grammar_free(jsgf); logmath_free(lmath); return 0; }