World: r3wp
[I'm new] Ask any question, and a helpful person will try to answer.
older newer | first last |
PeterWood 23-Jun-2009 [3059x13] | Perhaps a good starting point is to think that when you "parse" something, you are asking does it conform to the rules I have supplied. If it does parse returns true, if it doesn't parse returns false. >> parse "abcdefghi" ["abcdefghi"] == true >> parse "abcdefghi" ["abcde"] == false |
You're already familiar with to,thru, end and to end: >> parse "abcdefghi" ["a" to "i"] == false >> parse "abcdefghi" ["a" thru "i"] == true >> parse "abcdefghi" ["abcde" to end] == true | |
Perhaps the second thing to realise is a rule can be split into "sub-rules': >> parse "abcdefghi" ["abcde" "fghi"] == true | |
Each "subrule" can have some Rebol code executed if it is "triggerred": >> parse "abcdefghi" ["abcde" (print "abcde found") "fghi"(print "fghi found")] abcde found fghi found == true | |
>> parse "abcdefghi" ["abcde" (print "abcde found") "xyz"(print "xyz found")] abcde found == false | |
(What Gregg referred to was a much more sophisticated way of getting the parse to show you what happened). | |
Sub-rules can be optional by using the | (or) and enclosing the options in a block: >> parse "abcdefghi" ["abcde" (print "abcde found") ["fghi" (print "fghi found") | "xyz"(print "xyz found")]] abcde found fghi found == true | |
Sorry about the formatting, It's one of the big problems with AltME under Mac OS X. | |
Skip tells parse to move to the next item: >> parse "abcdefghi" ["abcdefgh" skip] == true ;; because the skip took us to the end | |
We can specify that a sub-rule should be repeated: >> parse "abcdefghi" ["abcde" 4 skip] == true | |
A better example of repetition: >> parse "aaa" [4 "a"] == false | |
Some and Any are forms of repetition, this shows the difference: >> parse "aaa1000" [some "a" to end] == true >> parse "aaa1000" [any "a" to end] == true >> parse "bbb1000" [any "a" to end] == true >> parse "bbb1000" [some "a" to end] == false | |
I apologise if you are already happy with these basic concepts, in which case I hope you don't mind the refresher. | |
sqlab 23-Jun-2009 [3072x3] | Maybe these are some variations of what you are looking for parse/all "fd doixx s x x x oie x } " [some [copy d "x" (print d) | skip]] parse/all "fd doixx s x x x oie x } " [some [copy d 1 2 "x" (print d) | skip]] parse/all "fd doixx s x x x oie x } " [some [copy d 2 "x" (print d) | skip]] parse/all "fd doixx s x x x oie x } " [some [copy d "xx" (print d) | skip]] parse/all "fd doixx s x x x oie x } " [some [[copy d "x" copy e "x" (print [e d]) ] | skip]] parse/all "fd doixx s x x x oie x } " [some [ (g: copy "" ) 2 [copy d "x" (append g d) ] (print g ) | skip]] |
or you are looking for the pairs parse/all "fd doixx s x x x oie x } " [ some [ [ (g: copy "" ) 2 [ copy d "x" (append g d ) any notx | skip ] (if not empty? g [print g]) ] ] ] | |
I forgot notx notx: complement charset "x" parse/all "fd doixx s x x x oie x } " [ some [ (g: copy "" ) 2 [ copy d "x" (append g d ) any notx | skip ] (if not empty? g [print g]) ] ] | |
mhinson 23-Jun-2009 [3075x2] | Thanks PeterWood. I like to think I am ok with the most basic concepts, so now I am trying to learn things that will help me some my real life probelms in a better way. I use parse pretty much every day & always have a rebol console up on my work PC, but ANY SOME & OPT & | I do not understand in context. I understand them in abstract terms, but not how to apply them in conjuction with [] . I do understand your examples of some & any (these examples are usefull to me). skipping an un-known number of chars to get to the next match is the bit I find hard to understand how to construct, paticularly if it needs to be done in the context of a previous match. |
sqlab, I dont know about this syntax at all. I dont think I understand what is happening here. copy to "x" & copy thru "x" I understand, but copy "x" I didn't expect to see. | |
BrianH 23-Jun-2009 [3077] | In the parens you use the COPY function, not the PARSE copy operation. Is that what you meant? |
mhinson 23-Jun-2009 [3078x3] | The compliment syntax & the to 1 3 digit where digit is a charset seems to be "unreliable" as far as I can understand. |
this is what I dont expect. parse/all "fd doixx s x x x oie x } " [some [copy d "x" (print d) | skip]] | |
I dont think I have ever seen the PARSE copy operation documented. I will have a hunt for it. | |
Maxim 23-Jun-2009 [3081] | have you ever read the parse documentation in the old RT publisehd rebol 2.3 pdf ? its a good reference... there are only minor changes from that version up to the latest... I don't think any of the examples would fail in the current parse. |
mhinson 23-Jun-2009 [3082] | chpter 15 or the Rebol Core Manual http://www.rebol.com/docs/core23/rebolcore-15.html may have a use of this syntax in a complicated example, but no description of what is happening exactly. |
Maxim 23-Jun-2009 [3083] | yep, that's the online version of it. |
BrianH 23-Jun-2009 [3084] | OK, here's what happens: The next recognized pattern is COPY/part'ed and assigned to the variable. If the length of the matched pattern is 0, #[none] is assigned to the variable. |
mhinson 23-Jun-2009 [3085x2] | Yes, I have read it a lot, but it seems more of a reference for people who already know, rather then an explanation of Parse operations. |
Thanks BrianH, I was sort of guessing it must be like a variation of copy thru "x" that does not skip like thru... I think I get that now. Thanks. | |
BrianH 23-Jun-2009 [3087x2] | Note that the assignement to the variable happens *after* the pattern is recognized, so any code inside the pattern that references the value of the variable will get the old value. Like this: >> x: "old" == "old" >> parse "new" [copy x ["new" (print x)] (print x)] old new == true |
The same goes for the set operation of block parsing. | |
mhinson 23-Jun-2009 [3089] | That is pretty important! I had not realised that before & this copuld account for some of the unpredictable behaviour I get.. I thought the patern was complete at your first print statement. These [] have lots of subtle influence. |
BrianH 23-Jun-2009 [3090] | [ and ] are a grouping construct. |
mhinson 23-Jun-2009 [3091] | This is my nemisis. I can't understand how this prints XXXX then XX , not XX three times. It seems to have a will of its own. parse/all { X X XX X X} [some[[copy x "X" (prin x) [copy y "X" (print y) | skip] | skip]]] I have been stuck on this (in various forms) for over a week now |
BrianH 23-Jun-2009 [3092] | Well first of all, you have an extra [ ] in there, just after the some. |
mhinson 23-Jun-2009 [3093x2] | My thinking is that I expect the inner copy to be executed after the first "X" is found, then come back out of the inner bit when the next "X" is found. |
oops.. my bad with the extra [ ] I keep trying all sorts & that got left behind. | |
BrianH 23-Jun-2009 [3095x2] | parse/all { X X XX X X} [some [copy x "X" (prin x) [copy y "X" (print y) | skip] | skip]] Character at a time: - the outer skip - copy x "X" (prin x) - the inner skip - copy x "X" (prin x) - the inner skip - the outer skip - copy x "X" (prin x) - copy y "X" (print y) - the outer skip - copy x "X" (prin x) - the inner skip - copy x "X" (prin x) - the outer skip Try this: >> parse/all { X X XX X X} [some [copy x "X" (prin x) [copy y "X" (print y) | skip (prin "i")] | skip (prin "o")]] oXiXioXX oXiXo== true |
Now that last outer skip seems to me that it should be an inner skip, but I am clearly wrong :( | |
mhinson 23-Jun-2009 [3097] | Ah. that is a good trick to print i & o with the skips, this will help a lot, thanks. Isee from your analysis that my error is to expect the inner skip to skip back to the beginning of that loop... not sure why I expected that, but it is clearly wrong. I dont know if there is a way to make the inner loop behave like that, at an earlier point I did hve OPT in front of it... I will be able to make progress with my experiments now armed with the new trick you have taught me, but for now I have to go & get some sleep I am afraid. Thanks again. |
BrianH 23-Jun-2009 [3098x2] | >> parse/all { X X XX X X} [(prin 'a) some [(prin 'b) "X" (prin 'c) [(prin 'd) "X" (print 'e) | (prin 'f) skip (prin 'g)] (prin 'h) | (prin 'i) skip (prin 'j)] (prin 'k)] abijbcdfghbcdfghbijbcde hbijbcdfghbcdfijbik== true |
Now the fij is a bug in parse - it should be fgh. | |
sqlab 24-Jun-2009 [3100x2] | Excuse, if I did confuse you with my examples- I just tried to show you that you can get loops with an definite loop counter in parse. |
regarding parse/all "fd doixx s x x x oie x } " [some [copy d "x" (print d) | skip]] what did you expect? If you know what you are looking for you can extend it to parse/all "fd doixx s x x x oie x } " [some [copy d ["x" | "y" | "z" ] (print d) | skip]] and you will get your searched values. But maybe I just don't understand the problem. | |
mhinson 24-Jun-2009 [3102x4] | Thanks Brian, I am finaly getting it I think. the prin 'a etc is better than debugging techniquies I have tried because it is small and dosen't add too much to the complexity, I can see I could reduce this method further with something like a: does [prin 'a] |
Thanks sqlab, no need to excuse yourself please, your examples are great & I learnt a new use for COPY in PARSE. This has made your examples clear to me now, so thanks for spending your time helping me. The problem I have set myself is purely to understand parse more clearly so I have enough know-how to write any scripts I need without spending all day doing it. That is why I start off anking one question, then jump to another question if I don't fully understand the help I get. I have used parse a fair bit all ready, but limited myself to very simple concepts. see http://www.rebol.org/script-information.r?script-name=cisco-extract.r and marvel that it even works ;-) Thanks. | |
I have been reminded that |skip is a word | skip is OR skip. it is so easy to miss the space between | & skip | |
Right, I would say that the following snippit is the most educational thing I have done with PARSE. It shows me a lot of things about what is happening & validates the construction and use of charsets & whatever the 'address block is called. Thanks everyone for your help. digit: charset [#"0" - #"9"] address: [1 3 digit "." 1 3 digit "." 1 3 digit "." 1 3 digit] a: does [prin 'a] b: does [prin 'b] c: does [prin 'c] d: does [prin 'd] e: does [prin 'e] f: does [prin 'f] parse/all {1 23 4.5.6.12 222.1.1.1 7 8} [some[ (a) copy x address (prin x) some[ (b) copy y address break | skip (c)] (print y) | skip (d) ]] adadadadada4.5.6.12bcb222.1.1.1 | |
Graham 24-Jun-2009 [3106x2] | why not use block parsing? |
parse [ 1 23 4.5.6.12 222.1.1.1 7 8 ] [ integer! integer! tuple! tuple! integer! integer! ] | |
BrianH 24-Jun-2009 [3108] | Because he's parsing Cisco config files. |
older newer | first last |