r3wp [groups: 83 posts: 189283]
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r3wp

[Parse] Discussion of PARSE dialect

BenBran
6-Jan-2010
[4800]
I get whats happening now.  If i compare buffer and file I see the 
clipped text:

>> probe file
== "index.html"

>> probe buffer
{GET /a.html HTTP/1.1
Host: localhost

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/531.21.8 
(KHTML, like Gecko) Version/4.0.4 Safar
i/531.21.10

Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-US
Accept-Encoding: gzip, deflate
Connection: keep-alive
Address: 127.0.0.1}

>>probe parse buffer ["get" ["http" | "/ " | copy file to " "]]
== false

>> probe file
== "/a.html"
 
Should I have been able to see the results instead of  == false?
Graham
6-Jan-2010
[4801x4]
false is the value returned by the parse function
if you want the value you have to change the parse rule
umm.. parse returns either true or false ...
true if the rule completes to the end, false otherwise
BenBran
6-Jan-2010
[4805]
ok I see.  Thanks.
BrianH
6-Jan-2010
[4806]
Was going to reply but Graham types faster :)
Graham
6-Jan-2010
[4807]
parse buffer [ "get" [ "http" | "/" | copy file to #" "  ( print 
file) ] to end ]
will return true
BrianH
6-Jan-2010
[4808x3]
PARSE returns true if the rule matches and covers the entire input, 
or false otherwise. Your rule matched but there was input left over. 
PARSE's return value doesn't matter in this case, just whether file 
is set or not. If you are using R3 you can do this too:
parse buffer [ "get" [ "http" | "/" | return to " "]]
That would return the file instead of setting a variable and not 
return false because of leftover input.
>> parse "GET /a.html HTTP/1.1" ["get " return to " "]
== "/a.html"

Note that /all is the default in R3 so you need to specify space 
after GET.
BenBran
6-Jan-2010
[4811]
for completeness in R3 - I tried the lines above:

>> parse "GET /a.html HTTP/1.1" ["get " return to " "]
** Script Error: Invalid argument: ?native?
** Where: halt-view
** Near: parse "GET /a.html HTTP/1.1" ["get " return to " "]

I must be missing something simple
BrianH
6-Jan-2010
[4812]
What version of REBOL are you using? system/version ...
BenBran
6-Jan-2010
[4813]
>> help system
SYSTEM is an object of value:
   version         tuple!    2.7.7.3.1
   build           date!     1-Jan-2010/12:15:27-8:00
   product         word!     View
   core            tuple!    2.7.7
   components      block!    length: 60
BrianH
6-Jan-2010
[4814]
That is R2, not R3.
BenBran
6-Jan-2010
[4815]
doh!
BrianH
6-Jan-2010
[4816]
You were right, it was something simple :)
BenBran
6-Jan-2010
[4817x2]
lol :-)
yes it works perfect in R3. Thanks again.
Graham
14-Jan-2010
[4819]
>> parse [ <tag> ] [ copy t tag! ]
== true
>> t
== [<tag>]

never noticed it made a block! before
ChristianE
14-Jan-2010
[4820x5]
>> parse [ <tag> ] [ set t tag! ]
== true
>> t
== <tag>
There's a difference between COPY and SET in block parsing mode.
From the docs:

SET - set the next value to a variable
COPY - copy the next match sequence to a variable
Good the remember when dealing with "sequences":

>> parse [ <tag> </tag> ] [ copy t [ tag! tag!] ]
== true
>> t
== [<tag> </tag>]
>> parse [ <tag> </tag> ] [ set t [ tag! tag!] ]
== true
>> t
== <tag>
the = to.
Graham
14-Jan-2010
[4825]
I've always used 'set ... not sure why I used 'copy this time!
Graham
29-Jan-2010
[4826x3]
<?xml version="1.0"?>

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><SelectResponse 
xmlns="http://sdb.amazonaws.com/doc/2009-04-15/"><SelectResult><Item><Name>2010-01-29T09:54:48.000ZI3s3NjIxRjZERDI1MUY0QzQyMDk4M0JDMzkwMERGOEQxQTVDRDY5MzEwfQ==</Name><Attribute><Name>Subject</Name><Value>hello?</Value></Attribute><Attribute><Name>Userid</Name><Value>Guest</Value></Attribute><Attribute><Name>UTCDate</Name><Value>2010-01-29T09:54:48.000Z</Value></Attribute></Item><Item><Name>2010-01-29T09:58:36.000ZI3swMTZBODg3QjAxNDQ2NEU5OENCNTA3OTc5OTg0Mjc1MTJGQzkxQTc0fQ==</Name><Attribute><Name>Subject</Name><Value>First 
Message</Value></Attribute><Attribute><Name>Userid</Name><Value>Graham</Value></Attribute><Attribute><Name>UTCDate</Name><Value>2010-01-29T09:58:36.000Z</Value></Attribute></Item><Item><Name>2010-01-29T11:06:18.000ZI3tFREFCRUYwNTY4OTdBMzcwODM2NzJGQUE5MzAwRUE3NjYwMTMwMTY5fQ==</Name><Attribute><Name>Subject</Name><Value>Index 
working</Value></Attribute><Attribute><Name>Userid</Name><Value>Graham</Value></Attribute><Attribute><Name>UTCDate</Name><Value>2010-01-29T11:06:18.000Z</Value></Attribute></Item></SelectResult><ResponseMetadata><RequestId>14873461-626a-44bf-2d7d-c1b23694b2e0</RequestId><BoxUsage>0.0000411449</BoxUsage></ResponseMetadata></SelectResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
results: copy []
	parse result [
		thru <SelectResult> 
		some [
			thru <Item> copy item to </Item> (
				?? item

    if parse item [ thru <Name> copy itemid to </Name> thru {<Name>Subject</Name>} 
    thru <Value> copy subject to </Value> thru {<Name>Userid</Name>} 
    thru <Value> copy userid to </Value> thru {<Name>UTCDate</Name>} 
    thru <Value> copy utcdate to </Value> to end ][
					repend results [ utcdate itemid userid subject ]
				]
			)
		]
	]
This parse works fine in R2, but doesn't work in R3 ... I coudn't 
see why last night ... still can't ...
Steeve
29-Jan-2010
[4829x3]
Is that result a block or string ?
because in a string you can't find tag! values
i'm wrong 
T_T
Graham
29-Jan-2010
[4832]
It's a string ...
Steeve
29-Jan-2010
[4833]
but i'm still wrong ;-)
Graham
29-Jan-2010
[4834x2]
Yes, tags are a type of string ...
this is what I get for item 


e>2010-01-29T11:06:18.000ZI3tFREFCRUYwNTY4OTdBMzcwODM2NzJGQUE5MzAwRUE3NjYwMTMwMTY5fQ==</Name><Attribute><Name>Subject</Name><Value>Index 
working</Value></Attribute><Attribute><Name>Userid</Name><Value>Graham</Value></Attribute><Attribute><Name>UTCDate</Name><Value>2010-01-29T11:06:18.000Z</Value></Attribute>
Steeve
29-Jan-2010
[4836x2]
>> parse "<a><item>" [thru <a> ??]
end!: "item>"
== false
a bug
Graham
29-Jan-2010
[4838]
I'm not familiar with that ... what should it say?
Steeve
29-Jan-2010
[4839x2]
It should say:
>> parse "<a><item>" [thru <a> ??]
end!: "<item>"
== false
parsing thru a tag eat one more char
Graham
29-Jan-2010
[4841]
Ah .. ?? is a new debugging function
Steeve
29-Jan-2010
[4842]
yep
Graham
29-Jan-2010
[4843x2]
Should have known about it last night!  Would have saved me sometime 
:(
Well, this looks like an unreported bug ...
Steeve
29-Jan-2010
[4845]
exactly
Graham
29-Jan-2010
[4846]
Shall you or I curecode it?
Steeve
29-Jan-2010
[4847x2]
you
;-)
Graham
29-Jan-2010
[4849]
okey dokey