static ATerm parse_string_pt(const char* string, ATerm tbl_term, ATerm start_term, ATerm path_term) { ATerm result = NULL; parse_table* tbl = NULL; const char* start = NULL; const char* path = NULL; STRSGLR_ensure_init(); STRSGLR_clear_parse_error(); tbl = parse_table_from_term(tbl_term); if(tbl == NULL) return NULL; // @todo: set the error term. if(AT_isString(start_term)) { start = AT_getString(start_term); } else { if(start_term != none_term) return NULL; } if(AT_isString(path_term)) { path = AT_getString(path_term); } else { return NULL; } result = SGparseString(string, (SGLR_ParseTable) tbl, start, path); if(result != NULL) { if(SGisParseError(result)) { parse_error_term = result; result = NULL; } } return result; }
int SG_Batch (int argc, char **argv) { ATerm parse_tree; parse_tree = SGparseFileUsingTable(program_name, parse_table_name, start_symbol, input_file_name, output_file_name); if (!SG_OUTPUT) { return 0; } if (!parse_tree) { ATwarning("%s: error in %s: unexpected error\n", program_name, input_file_name); return 2; } if (SGisParseError(parse_tree)) { ATermList errlist; ATerm errcode; AFun err; int c, line, col; errlist = (ATermList) ATgetArgument((ATermAppl) parse_tree, 0); errcode = ATgetArgument((ATermAppl) parse_tree, 1); c = ATgetInt((ATermInt) ATgetArgument(ATelementAt(errlist, 0), 0)); line = ATgetInt((ATermInt) ATgetArgument(ATelementAt(errlist, 1), 0)); col = ATgetInt((ATermInt) ATgetArgument(ATelementAt(errlist, 2), 0)); err = ATgetAFun(errcode); if (err == SG_EOF_Error_AFun) { ATwarning("%s: error in %s, line %d, col %d: end of file unexpected\n", program_name, input_file_name, line, col); } else if (err == SG_Plain_Error_AFun) { if (isprint(c)) { ATwarning("%s: error in %s, line %d, col %d: character `%c' (\\x%2.2x)" " unexpected\n", program_name, input_file_name, line, col, c, c); } else { ATwarning("%s: error in %s, line %d, col %d: character \\x%2.2x" " unexpected\n", program_name, input_file_name, line, col, c); } } else if (err == SG_Cycle_Error_AFun) { ATwarning("%s: error in %s, line %d, col %d: cycle detected, productions: %t\n", program_name, input_file_name, line, col, ATgetArgument(errcode, 0)); } else if (err == SG_Amb_Error_AFun) { int ambiescount = ATgetInt((ATermInt) ATgetArgument(errcode,0)); ATwarning("%s: error in %s, line %d, col %d: cannot represent %d ambiguit%s\n", program_name, input_file_name, line, col, ambiescount, (ambiescount > 1) ? "ies" : "y" ); } else if (err == SG_Too_Many_Ambiguities_Error_AFun) { ATwarning("%s: error in %s, line %d, col %d: too many ambiguities\n", program_name, input_file_name, line, col); } else { ATwarning("%s: error in %s, line %d, col %d: unknown error\n", program_name, input_file_name, line, col); } return 1; } else if(!SGisParseTree(parse_tree)) { ATwarning("%s: error: neither parse tree nor parse error for %s\n", program_name, input_file_name); return 1; } IF_VERBOSE( int nrambs; char *sort; nrambs = SGnrAmb(SG_NR_ASK); sort = SGsort(SG_GET, NULL); ATwarning("%s: %s parsed %s as sort %s, with %d ambiguit%s\n", program_name, parse_table_name, input_file_name, sort ? sort : "[undetermined]", nrambs, (nrambs==1)?"y":"ies"); );