1 /***********************************************************
2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
7 Permission to use, copy, modify, and distribute this software and its
8 documentation for any purpose and without fee is hereby granted,
9 provided that the above copyright notice appear in all copies and that
10 both that copyright notice and this permission notice appear in
11 supporting documentation, and that the names of Stichting Mathematisch
12 Centrum or CWI or Corporation for National Research Initiatives or
13 CNRI not be used in advertising or publicity pertaining to
14 distribution of the software without specific, written prior
17 While CWI is the initial source for this software, a modified version
18 is made available by the Corporation for National Research Initiatives
19 (CNRI) at the Internet address ftp://ftp.python.org.
21 STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22 REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23 MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24 CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26 PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28 PERFORMANCE OF THIS SOFTWARE.
30 ******************************************************************/
32 /* Parser-tokenizer link implementation */
34 #include "pgenheaders.h"
35 #include "tokenizer.h"
46 static node
*parsetok
Py_PROTO((struct tok_state
*, grammar
*, int,
49 /* Parse input coming from a string. Return error code, print some errors. */
52 PyParser_ParseString(s
, g
, start
, err_ret
)
58 struct tok_state
*tok
;
60 err_ret
->error
= E_OK
;
61 err_ret
->filename
= NULL
;
66 if ((tok
= PyTokenizer_FromString(s
)) == NULL
) {
67 err_ret
->error
= E_NOMEM
;
71 return parsetok(tok
, g
, start
, err_ret
);
75 /* Parse input coming from a file. Return error code, print some errors. */
78 PyParser_ParseFile(fp
, filename
, g
, start
, ps1
, ps2
, err_ret
)
86 struct tok_state
*tok
;
88 err_ret
->error
= E_OK
;
89 err_ret
->filename
= filename
;
94 if ((tok
= PyTokenizer_FromFile(fp
, ps1
, ps2
)) == NULL
) {
95 err_ret
->error
= E_NOMEM
;
98 if (Py_TabcheckFlag
|| Py_VerboseFlag
) {
99 tok
->filename
= filename
;
100 tok
->altwarning
= (filename
!= NULL
);
101 if (Py_TabcheckFlag
>= 2)
107 int tabsize
= guesstabsize(filename
);
109 tok
->tabsize
= tabsize
;
113 return parsetok(tok
, g
, start
, err_ret
);
116 /* Parse input coming from the given tokenizer structure.
117 Return error code. */
120 parsetok(tok
, g
, start
, err_ret
)
121 struct tok_state
*tok
;
130 if ((ps
= PyParser_New(g
, start
)) == NULL
) {
131 fprintf(stderr
, "no mem for new parser\n");
132 err_ret
->error
= E_NOMEM
;
142 type
= PyTokenizer_Get(tok
, &a
, &b
);
143 if (type
== ERRORTOKEN
) {
144 err_ret
->error
= tok
->done
;
147 if (type
== ENDMARKER
&& started
) {
148 type
= NEWLINE
; /* Add an extra newline */
153 len
= b
- a
; /* XXX this may compute NULL - NULL */
154 str
= PyMem_NEW(char, len
+ 1);
156 fprintf(stderr
, "no mem for next token\n");
157 err_ret
->error
= E_NOMEM
;
161 strncpy(str
, a
, len
);
163 if ((err_ret
->error
=
164 PyParser_AddToken(ps
, (int)type
, str
,
165 tok
->lineno
)) != E_OK
) {
166 if (err_ret
->error
!= E_DONE
)
172 if (err_ret
->error
== E_DONE
) {
182 if (tok
->lineno
<= 1 && tok
->done
== E_EOF
)
183 err_ret
->error
= E_EOF
;
184 err_ret
->lineno
= tok
->lineno
;
185 err_ret
->offset
= tok
->cur
- tok
->buf
;
186 if (tok
->buf
!= NULL
) {
187 int len
= tok
->inp
- tok
->buf
;
188 err_ret
->text
= malloc(len
+ 1);
189 if (err_ret
->text
!= NULL
) {
191 strncpy(err_ret
->text
, tok
->buf
, len
);
192 err_ret
->text
[len
] = '\0';
197 PyTokenizer_Free(tok
);