[Rd] R_parseVector and syntax error [was: error messages while parsing with rniParse]
Romain Francois
romain.francois at dbmail.com
Fri Jun 19 09:18:51 CEST 2009
Duncan Murdoch wrote:
>
> Romain Francois wrote:
>> Duncan Murdoch wrote:
>>
>>> Simon Urbanek wrote:
>>>
>>>> On Jun 18, 2009, at 17:02 , Duncan Murdoch wrote:
>>>>
>>>>
>>>>> Romain Francois wrote:
>>>>>
>>>>>> Hello,
>>>>>>
>>>>>> [I'm redirecting this here from stats-rosuda-devel]
>>>>>>
>>>>>> When parsing R code through R_parseVector and the code generates
>>>>>> an error (syntax error), is there a way to grab the error.
>>>>>> It looks like yyerror populates the buffer "R_ParseErrorMsg",
>>>>>> but then the variable is not part of the public api.
>>>>>>
>>>>>> Would it be possible to add yet another entry point to the
>>>>>> parser that would basically wrap R_parseVector so that it would
>>>>>> have an extra char* argument that would bring back the error
>>>>>> message if there is an error?
>>>>>>
>>>>>>
>>>>>>
>>>>> I would oppose that. Suggest ways to reduce the complexity of
>>>>> the parser interface and I'd be interested. It's a nightmare to
>>>>> make any changes there.
>>>>>
>>>>> You can always call the R function wrapped in try(), so it's not
>>>>> as though this would give you anything that you don't already
>>>>> have access to.
>>>>>
>>>> I'm not quite following - we're talking about R_ParseVector in C
>>>> code so the point is that the C code gets access to the error
>>>> message so it can relay it to the user.
>>> I understood that. But the C code can get the error message by
>>> evaluating an R expression and looking at the result.
>>>
>>>
>>>> There are no R-level functions involved here. The issue here for
>>>> the moment is that this information is retrievable at R level but
>>>> not (officially) at the C level.
>>> I wouldn't mind exposing the underlying information in a clean way,
>>> but the string in R_ParseVector isn't all a front end should get.
>>>
>>
>> Great. Let's do that.
>> Is a function that simply returns some of the static variables used
>> by bison clean enough ?
>>
> It could be. I'd like a design that allows for the possibility of
> multiple syntax errors to be reported. I have parse_Rd doing that,
> though not committed yet. parse() is different because we have to be
> less tolerant of errors in R code than in Rd files. But we could
> still report multiple errors in one parse, not just stop at the first
> one.
This is an interesting problem. Just being curious here: how do you
continue parsing after a syntax error in parse ? Does it depend on the
kind of syntax error ? Do you use some of the recovery protocols of
bison (the special "error" token only appears in the very top level prog
symbol :
prog : END_OF_INPUT { return 0; }
| '\n' { return xxvalue(NULL,2,NULL); }
| expr_or_assign '\n' { return xxvalue($1,3,&@1); }
| expr_or_assign ';' { return xxvalue($1,4,&@1); }
| error { YYABORT; }
;
Anyway, what about using the extra information to structure an error
message of a custom condition class.
>
> Duncan Murdoch
>
>>> At the time of an R_ParseVector syntax error, the parser knows what
>>> token it couldn't handle, and it knows its classification, and the
>>> location in the file where it came from. Not all of that makes it
>>> through to the error message.
>>>
>>>> As for reducing complexity - technically, there is no complexity
>>>> added since all this is already in place ... [adding extra char *
>>>> argument to ParseVector may not be the best way but that's not
>>>> what I'm arguing for].
>>> It was what I was arguing against.
>>>
>>> Duncan Murdoch
>>>
>>>
>>>> Or am I missing something?
>>>> Cheers,
>>>> S
>>>>
>>>>
>>>>
>>>>
>>>>>> Romain
>>>>>>
>>>>>> Simon Urbanek wrote:
>>>>>>
>>>>>>
>>>>>>> On Jun 15, 2009, at 12:05 , Romain Francois wrote:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> Hello,
>>>>>>>>
>>>>>>>> In JRI, is there a way to get the error message that is
>>>>>>>> generated by the
>>>>>>>> parser through rniParse
>>>>>>>> For example, if I have this :
>>>>>>>>
>>>>>>>> long y = re.rniParse( "rnorm( 10 ))", 1 ) ;
>>>>>>>>
>>>>>>>> this obviously generates a parse error, so y will be the same as
>>>>>>>> (R_NilValue) :
>>>>>>>>
>>>>>>>> long null_id = re.rniEval( re.rniParse( "NULL", 1 ), 0 ) ;
>>>>>>>>
>>>>>>>> I guess the underlying question is : "Is R_ParseErrorMsg
>>>>>>>> exposed to
>>>>>>>> JRI".
>>>>>>>>
>>>>>>>>
>>>>>>> AFAICT R_ParseErrorMsg and friends are not exposed by the R API
>>>>>>> - they are not accessible outside, so they cannot be use by
>>>>>>> JRI. It would be nice if there was a way of accessing that
>>>>>>> info, but R doesn't currently support that.
>>>>>>>
>>>>>>> Cheers,
>>>>>>> Simon
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> The reason is I would like to bring back the message as part of an
>>>>>>>> exception generated when the code does not parse.
>>>>>>>>
>>>>>>>> Romain
>>>>>>>>
>>>>>>>>
>>>>>>
>>>>> ______________________________________________
>>>>> R-devel at r-project.org mailing list
>>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>>>
>>>>>
>>>>>
>>>
>>>
>>
>>
>>
>
>
>
--
Romain Francois
Independent R Consultant
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
More information about the R-devel
mailing list