node * PyParser_SimpleParseFile(FILE *fp, char *filename, int start) { node *n; perrdetail err; n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start, (char *)0, (char *)0, &err); if (n == NULL) err_input(&err); return n; }
int PyRun_InteractiveOne(FILE *fp, char *filename) { PyObject *m, *d, *v, *w; node *n; perrdetail err; char *ps1 = "", *ps2 = ""; v = PySys_GetObject("ps1"); if (v != NULL) { v = PyObject_Str(v); if (v == NULL) PyErr_Clear(); else if (PyString_Check(v)) ps1 = PyString_AsString(v); } w = PySys_GetObject("ps2"); if (w != NULL) { w = PyObject_Str(w); if (w == NULL) PyErr_Clear(); else if (PyString_Check(w)) ps2 = PyString_AsString(w); } n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, Py_single_input, ps1, ps2, &err); Py_XDECREF(v); Py_XDECREF(w); if (n == NULL) { if (err.error == E_EOF) { if (err.text) PyMem_DEL(err.text); return E_EOF; } err_input(&err); PyErr_Print(); return err.error; } m = PyImport_AddModule("__main__"); if (m == NULL) return -1; d = PyModule_GetDict(m); v = run_node(n, filename, d, d); if (v == NULL) { PyErr_Print(); return -1; } Py_DECREF(v); if (Py_FlushLine()) PyErr_Clear(); return 0; }
grammar * getgrammar(char *filename) { FILE *fp; node *n; grammar *g0, *g; perrdetail err; fp = fopen(filename, "r"); if (fp == NULL) { perror(filename); Py_Exit(1); } g0 = meta_grammar(); n = PyParser_ParseFile(fp, filename, g0, g0->g_start, (char *)NULL, (char *)NULL, &err); fclose(fp); if (n == NULL) { fprintf(stderr, "Parsing error %d, line %d.\n", err.error, err.lineno); if (err.text != NULL) { size_t len; int i; fprintf(stderr, "%s", err.text); len = strlen(err.text); if (len == 0 || err.text[len-1] != '\n') fprintf(stderr, "\n"); for (i = 0; i < err.offset; i++) { if (err.text[i] == '\t') putc('\t', stderr); else putc(' ', stderr); } fprintf(stderr, "^\n"); PyObject_FREE(err.text); } Py_Exit(1); } g = pgen(n); PyNode_Free(n); if (g == NULL) { printf("Bad grammar.\n"); Py_Exit(1); } return g; }