mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			107 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /***********************************************************
 | |
| Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
 | |
| The Netherlands.
 | |
| 
 | |
|                         All Rights Reserved
 | |
| 
 | |
| Permission to use, copy, modify, and distribute this software and its 
 | |
| documentation for any purpose and without fee is hereby granted, 
 | |
| provided that the above copyright notice appear in all copies and that
 | |
| both that copyright notice and this permission notice appear in 
 | |
| supporting documentation, and that the names of Stichting Mathematisch
 | |
| Centrum or CWI not be used in advertising or publicity pertaining to
 | |
| distribution of the software without specific, written prior permission.
 | |
| 
 | |
| STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
 | |
| THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
 | |
| FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
 | |
| FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | |
| WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 | |
| ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
 | |
| OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | |
| 
 | |
| ******************************************************************/
 | |
| 
 | |
| /* Raw interface to the parser. */
 | |
| 
 | |
| #include "allobjects.h"
 | |
| #include "node.h"
 | |
| #include "token.h"
 | |
| #include "pythonrun.h"
 | |
| #include "graminit.h"
 | |
| #include "errcode.h"
 | |
| 
 | |
| static object *
 | |
| node2tuple(n)
 | |
| 	node *n;
 | |
| {
 | |
| 	if (n == NULL) {
 | |
| 		INCREF(None);
 | |
| 		return None;
 | |
| 	}
 | |
| 	if (ISNONTERMINAL(TYPE(n))) {
 | |
| 		int i;
 | |
| 		object *v, *w;
 | |
| 		v = newtupleobject(1 + NCH(n));
 | |
| 		if (v == NULL)
 | |
| 			return v;
 | |
| 		w = newintobject(TYPE(n));
 | |
| 		if (w == NULL) {
 | |
| 			DECREF(v);
 | |
| 			return NULL;
 | |
| 		}
 | |
| 		settupleitem(v, 0, w);
 | |
| 		for (i = 0; i < NCH(n); i++) {
 | |
| 			w = node2tuple(CHILD(n, i));
 | |
| 			if (w == NULL) {
 | |
| 				DECREF(v);
 | |
| 				return NULL;
 | |
| 			}
 | |
| 			settupleitem(v, i+1, w);
 | |
| 		}
 | |
| 		return v;
 | |
| 	}
 | |
| 	else if (ISTERMINAL(TYPE(n))) {
 | |
| 		return mkvalue("(is)", TYPE(n), STR(n));
 | |
| 	}
 | |
| 	else {
 | |
| 		err_setstr(SystemError, "unrecognized parse tree node type");
 | |
| 		return NULL;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| static object *
 | |
| parser_parsefile(self, args)
 | |
| 	object *self;
 | |
| 	object *args;
 | |
| {
 | |
| 	char *filename;
 | |
| 	FILE *fp;
 | |
| 	node *n = NULL;
 | |
| 	object *res;
 | |
| 	if (!getargs(args, "s", &filename))
 | |
| 		return NULL;
 | |
| 	fp = fopen(filename, "r");
 | |
| 	if (fp == NULL) {
 | |
| 		err_errno(IOError);
 | |
| 		return NULL;
 | |
| 	}
 | |
| 	n = parse_file(fp, filename, file_input);
 | |
| 	fclose(fp);
 | |
| 	if (n == NULL)
 | |
| 		return NULL;
 | |
| 	res = node2tuple(n);
 | |
| 	freetree(n);
 | |
| 	return res;
 | |
| }
 | |
| 
 | |
| static struct methodlist parser_methods[] = {
 | |
| 	{"parsefile", parser_parsefile},
 | |
| 	{0, 0} /* Sentinel */
 | |
| };
 | |
| 
 | |
| void
 | |
| initparser()
 | |
| {
 | |
| 	initmodule("parser", parser_methods);
 | |
| }
 | 
