2 /* Parser-tokenizer link implementation */
4 #include "pgenheaders.h"
16 static node
*parsetok(struct tok_state
*, grammar
*, int, perrdetail
*);
18 /* Parse input coming from a string. Return error code, print some errors. */
21 PyParser_ParseString(char *s
, grammar
*g
, int start
, perrdetail
*err_ret
)
23 struct tok_state
*tok
;
25 err_ret
->error
= E_OK
;
26 err_ret
->filename
= NULL
;
31 err_ret
->expected
= -1;
33 if ((tok
= PyTokenizer_FromString(s
)) == NULL
) {
34 err_ret
->error
= E_NOMEM
;
38 if (Py_TabcheckFlag
|| Py_VerboseFlag
) {
39 tok
->filename
= "<string>";
40 tok
->altwarning
= (tok
->filename
!= NULL
);
41 if (Py_TabcheckFlag
>= 2)
45 return parsetok(tok
, g
, start
, err_ret
);
49 /* Parse input coming from a file. Return error code, print some errors. */
52 PyParser_ParseFile(FILE *fp
, char *filename
, grammar
*g
, int start
,
53 char *ps1
, char *ps2
, perrdetail
*err_ret
)
55 struct tok_state
*tok
;
57 err_ret
->error
= E_OK
;
58 err_ret
->filename
= filename
;
63 if ((tok
= PyTokenizer_FromFile(fp
, ps1
, ps2
)) == NULL
) {
64 err_ret
->error
= E_NOMEM
;
67 if (Py_TabcheckFlag
|| Py_VerboseFlag
) {
68 tok
->filename
= filename
;
69 tok
->altwarning
= (filename
!= NULL
);
70 if (Py_TabcheckFlag
>= 2)
75 return parsetok(tok
, g
, start
, err_ret
);
78 /* Parse input coming from the given tokenizer structure.
82 parsetok(struct tok_state
*tok
, grammar
*g
, int start
, perrdetail
*err_ret
)
88 if ((ps
= PyParser_New(g
, start
)) == NULL
) {
89 fprintf(stderr
, "no mem for new parser\n");
90 err_ret
->error
= E_NOMEM
;
100 type
= PyTokenizer_Get(tok
, &a
, &b
);
101 if (type
== ERRORTOKEN
) {
102 err_ret
->error
= tok
->done
;
105 if (type
== ENDMARKER
&& started
) {
106 type
= NEWLINE
; /* Add an extra newline */
111 len
= b
- a
; /* XXX this may compute NULL - NULL */
112 str
= PyMem_NEW(char, len
+ 1);
114 fprintf(stderr
, "no mem for next token\n");
115 err_ret
->error
= E_NOMEM
;
119 strncpy(str
, a
, len
);
121 if ((err_ret
->error
=
122 PyParser_AddToken(ps
, (int)type
, str
, tok
->lineno
,
123 &(err_ret
->expected
))) != E_OK
) {
124 if (err_ret
->error
!= E_DONE
)
130 if (err_ret
->error
== E_DONE
) {
140 if (tok
->lineno
<= 1 && tok
->done
== E_EOF
)
141 err_ret
->error
= E_EOF
;
142 err_ret
->lineno
= tok
->lineno
;
143 err_ret
->offset
= tok
->cur
- tok
->buf
;
144 if (tok
->buf
!= NULL
) {
145 size_t len
= tok
->inp
- tok
->buf
;
146 err_ret
->text
= PyMem_NEW(char, len
+ 1);
147 if (err_ret
->text
!= NULL
) {
149 strncpy(err_ret
->text
, tok
->buf
, len
);
150 err_ret
->text
[len
] = '\0';
155 PyTokenizer_Free(tok
);