[Rd] Recursively parsing srcrefs
Romain Francois
romain at r-enthusiasts.com
Fri May 13 08:30:06 CEST 2011
Le 12/05/11 21:59, Hadley Wickham a écrit :
>
>>> Is it possible to "recursively" parse srcrefs to match the recursive
>>> structure of the underlying code? I'm interested in this because it's
>>
>> I don't understand what you mean by that. It is certainly possible to walk
>> through nested srcrefs, to zoom in on a particular location; that's what
>> findLineNum() does.
>
> Does the example below not help? Given the whole function, I want to
> be able to walk down the call tree, finding the matching src refs as I
> go. i.e. given f, how do I get f_inside?
>
> f<- function(x = T) {
> # This is a comment
> if (x) return(4)
> if (emergency_status()) return(T)
> }
>
> f_inside<- parse(text = "
> # This is a comment
> if (x) return(4)
> if (emergency_status()) return(T)
> ")
>
> findLineNum doesn't quite do what I want - it works on the text of the
> srcref, not on the parse tree.
>
> Here's another go at explaining what I want:
>
> h<- quote(
> 1 # one
> + # plus
> 2 # two
> )
>
> h[[1]] extracts +. What can I do to extract "+ # plus" (on an object
> created in the appropriate manner to keep the srcref)? Is that even
> possible?
Maybe the parser package can help you.
> x <- parser( "/tmp/test.R" )
> attr( x, "data" )
line1 col1 byte1 line2 col2 byte2 token id parent top_level
token.desc terminal text
1 1 0 0 1 1 1 263 1 3 0
SYMBOL TRUE h
2 1 1 1 1 3 3 265 2 32 0
LEFT_ASSIGN TRUE <-
3 1 0 0 1 1 1 77 3 32 0
expr FALSE
4 1 4 4 1 9 9 296 5 7 0
SYMBOL_FUNCTION_CALL TRUE quote
5 1 9 9 1 10 10 40 6 30 0
'(' TRUE (
6 1 4 4 1 9 9 77 7 30 0
expr FALSE
7 2 3 3 2 4 4 261 10 11 0
NUM_CONST TRUE 1
8 2 3 3 2 4 4 77 11 27 0
expr FALSE
9 2 5 5 2 10 10 289 13 27 0
COMMENT TRUE # one
10 3 3 3 3 4 4 43 16 27 0
'+' TRUE +
11 3 5 5 3 11 11 289 18 27 0
COMMENT TRUE # plus
12 4 3 3 4 4 4 261 21 22 0
NUM_CONST TRUE 2
13 4 3 3 4 4 4 77 22 27 0
expr FALSE
14 4 5 5 4 10 10 289 24 30 0
COMMENT TRUE # two
15 5 0 0 5 1 1 41 26 30 0
')' TRUE )
16 2 3 3 4 4 4 77 27 30 0
expr FALSE
17 1 4 4 5 1 1 77 30 32 0
expr FALSE
18 1 0 0 5 1 1 77 32 0 0
expr FALSE
Romain
> My eventual goal is something like
>
> f<- function(x) {
> # This is my function
> T
> }
>
> g<- fix_logical_abbreviations(f)
>
> which would be equivalent to
>
> g<- function(x) {
> # This is my function
> TRUE
> }
>
>
>> That last display looks like a bug indeed. I'll take a look.
>
> The key seems to be a leading newline:
>
> parse(text = "\nx")
> parse(text = "x")
>
> Hadley
>
>
--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
http://romain-francois.com
|- http://bit.ly/hdKhCy : Rcpp article in JSS
|- http://bit.ly/elZJRJ : Montpellier Comedie Club - Avril 2011
`- http://bit.ly/fhqbRC : Rcpp workshop in Chicago on April 28th
More information about the R-devel
mailing list