jsgf_t * jsgf_parse_string(const char *string, jsgf_t * parent) { yyscan_t yyscanner; jsgf_t *jsgf; int yyrv; YY_BUFFER_STATE buf; yylex_init(&yyscanner); buf = yy_scan_string(string, yyscanner); jsgf = jsgf_grammar_new(parent); if (!parent) jsgf_set_search_path(jsgf, NULL); yyrv = yyparse(yyscanner, jsgf); if (yyrv != 0) { E_ERROR("Failed to parse JSGF grammar from input string\n"); jsgf_grammar_free(jsgf); yy_delete_buffer(buf, yyscanner); yylex_destroy(yyscanner); return NULL; } yy_delete_buffer(buf, yyscanner); yylex_destroy(yyscanner); return jsgf; }
jsgf_t * jsgf_parse_file(const char *filename, jsgf_t *parent) { yyscan_t yyscanner; jsgf_t *jsgf; int yyrv; FILE *in = NULL; yylex_init(&yyscanner); if (filename == NULL) { yyset_in(stdin, yyscanner); } else { in = fopen(filename, "r"); if (in == NULL) { E_ERROR_SYSTEM("Failed to open %s for parsing", filename); return NULL; } yyset_in(in, yyscanner); } jsgf = jsgf_grammar_new(parent); yyrv = yyparse(yyscanner, jsgf); if (yyrv != 0) { E_ERROR("Failed to parse JSGF grammar from '%s'\n", filename ? filename : "(stdin)"); jsgf_grammar_free(jsgf); yylex_destroy(yyscanner); return NULL; } if (in) fclose(in); yylex_destroy(yyscanner); return jsgf; }