From mtmorgan at fhcrc.org  Fri Jul 14 06:47:48 2006
From: mtmorgan at fhcrc.org (Martin Morgan)
Date: Thu, 13 Jul 2006 21:47:48 -0700
Subject: [Rd] [R] Continuation and parse
In-Reply-To: <44A282F7.8070901@sciviews.org> (Philippe Grosjean's message of
	"Wed, 28 Jun 2006 15:24:07 +0200")
References: <44A32C5B.3030409@bitwrit.com.au> <44A282F7.8070901@sciviews.org>
Message-ID: <6phlkqw3i8b.fsf@gopher1.fhcrc.org>

[this is from R-help, at the end of June]

Jim Lemon asked about parsing syntactically incorrect versus
incomplete lines, generating a couple of responses.

Philippe's suggestion isn't robust (e.g., "\nls)". Prof. Ripley's
comment lead me to R_ParseVector (the only exposed parse
routine). Unfortunately, this returns from parsing incomplete or
syntactically incorrect text with a PROTECT stack imbalance, so there
is no natural way to return from a .Call.

What I'd like is to have access to multiline console input after
parsing but before evaluation, or to return from a .Call like that
below with either the parsed expression or information about the
reason for failure. Any suggestions?

Thanks in advance,

Martin

SEXP parses(SEXP cmd) {
  ParseStatus status;
  SEXP res;
  res = R_ParseVector(cmd, 1, &status);
  return res;
}

/* > .Call("parses", "ls(") */
/* 25        SEXP res = R_ParseVector(cmd, 1, &status); */
/* (gdb) p R_PPStackTop */
/* $1 = 3 */
/* (gdb) next */
/* 26        return res; */
/* (gdb) p R_PPStackTop */
/* $2 = 5 */

R version 2.4.0 Under development (unstable) (2006-07-11 r38560)
x86_64-unknown-linux-gnu

Philippe Grosjean <phgrosjean at sciviews.org> writes:

> Well, you haven't used the search engines with the right key: the magic 
> words are:
>
>  > RSiteSearch("incomplete line")
>
> With the first document being my query (almost two years ago), and the 
> second one being Peter Dalgaard answer. You must adapt it to cope with 
> internationalization, but basically, you could use something like:
>
>  > grep("\n2:",try(parse(textConnection("ls)")), silent = TRUE))
> numeric(0)
>  > grep("\n2:",try(parse(textConnection("ls(")), silent = TRUE))
> [1] 1

From: Prof Brian Ripley <ripley>
Date: Wed, 28 Jun 2006 13:44:49 +0100 (BST)

On Wed, 28 Jun 2006, Jim Lemon wrote:

> Hi gurus,
>
> After an unsuccessful scrabble through the documentation and Jon's
> excellent search facility, I am no wiser as to how R recognizes an
> incomplete command line and politely raises its hand for more. The help
> page for parse gives no indication that it does anything more than spit
> the dummy when fed an incomplete command line, but something in there
> must recognize such ellipsis. Any hints?

It's internal. Look in src/main/main.c, in particular the R_Repl*
functions. In short, R_Parse1Buffer can return PARSE_INCOMPLETE.



[Rd] [R] Continuation and parse
Martin Morgan