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

World: r3wp

[Parse] Discussion of PARSE dialect

Ladislav
27-Apr-2011
[5640x3]
to/thru do not match subrules

 - yes, that is a correct observation, although unrelated to the subject 
 of the discussion, and, actually, just a detail of the implementation, 
 that can easily change at any time, especially taking into account 
 the user preferences
Although, TO/THRU actually match subrules, when I think about it, 
just a limited set of them.
In string parsing, we can use either character subrules, or string 
subrules, in block parsing we can use value subrules, datatype subrules, 
and some other special subrules
Maxim
27-Apr-2011
[5643x4]
it really just does a find (even the docs use the term scan).  the 
actual things we can to/thru are exactly the same as what can be 
used in find.
the only little shortcut, is that it can be used to search multiple 
things at once.
but its flawed, you know how.
so its not as usefull as it could be .
Geomol
27-Apr-2011
[5647x2]
Wow! And I thought, I knew about parse. :-)

A)

As I understand it, matching a rule like [end] is valid and parse 
will return true, if you're at the end, and in this special case, 
the curser isn't advanced further (becuase it's the end). And I understand 
the rule [thru end] as trying to advance the curser past the end, 
which isn't possible, so it fails.

B)

If the rule [end] advance the curser past the end, and this is valid, 
so parse returns true, then the rule [thru end] also should return 
true. But but but this can't be the case, as then this would not 
return true:
parse [a] [word!]

which it does. The reason, it shouldn't return true, is because we're 
at the end, not past the end. Unless both being at the end and past 
the end should return true.


I guess, it's a matter of implementation (as this isn't well documented 
afaik). I prefer the A) situation, as the B) situation is more confusing. 
Don't you agree?
Think of the end of a series as an internal marker, which the user 
shouldn't see as an element in the series, if you ask me.
Ladislav
27-Apr-2011
[5649]
You are missing the point, why don't you read the THRU documentation 
instead of speculations?
Geomol
27-Apr-2011
[5650]
Ok, I will. I did long time ago, but maybe it changed, or I missed 
something the first time, or I forgot, how it works!? :-)
Ladislav
27-Apr-2011
[5651]
See the above reference to the doc article
Geomol
27-Apr-2011
[5652x3]
Oh, I got my understanding from http://www.rebol.com/docs/core23/rebolcore-15.html#section-4
The little example there is a good way to understand it:

page: read http://www.rebol.com/
parse page [thru <title> copy text to </title>]
print text
REBOL Technologies


I was thinking R2, maybe you guys talked about R3 only? Has this 
changed?
I think, the docs match pretty well.
thru	advance input thru a value or datatype


You're right, taking this strictly, we should be able to advance 
thru the end. But this doesn't make much sense, so my guess is, most 
people wouldn't take this strictly, when talking the end of a series.
The end specifies that nothing follows in the input stream. The entire 
input has been parsed.


I read it, as there isn't anymore to parse. So is it possible to 
parse past the end? I would say no.
Ladislav
27-Apr-2011
[5655x2]
This is just a speculative interpretation of a text of one example. 
See the documentation.
http://www.rebol.com/r3/docs/concepts/parsing-summary.html
Geomol
27-Apr-2011
[5657]
Keywords that accept a repeat count are:
...
end


So the advancing must stop somehow, as we can parse end multiple 
times.

>> parse [a b c] [to end]      
== true
>> parse [a b c] [to end 5 end]
== true


Anyway, this may be a pointless discussion, if the language isn't 
clearly defined in such detail.
Ladislav
27-Apr-2011
[5658x8]
Why don't you read the documentation?
It is explained in there, and it is the *only* place where it is 
explained in general, not just using one example.
The fact is, that when a rule matches, the cursor may (optionally) 
advance, but it does not need to.
In case the cursor advances, the head of the rule match is distinct 
from the tail of the rule match. As opposed to that, when the cursor 
does not advance, the head of the match is identical with the tail 
of the match.
Which is the case of e.g. the above NONE rule.
But, many rules can have this property, even in R2
And, surely, one of the rules having this property is the END rule.
So, while the TO rule advances to the head of the subrule match, 
the THRU rule advances to the tail of the subrule match, which happen 
to be identical in case the subrule match does not advance the cursor.
Geomol
27-Apr-2011
[5666]
Argh, I was confused by sentences like
Where do you think the cursor is after matching the [end] rule?
:-)
Old def. of thru: advance input thru a value or datatype

New def. of thru: scan forward in input for matching rules, advance 
input to tail of the match


Then it can be argued, the tail of end (of a series) is still the 
end. Or it can be argued, that thru always advance some way further 
(as in all cases except at end). I understand, why [thru end] not 
failing is confusing.

(And stop saying, I should read the doc. I have read it ... in full 
this time.) ;-)
Ladislav
27-Apr-2011
[5667x2]
it can be argued, that thru always advance some way further

 - actually it cannot be argued, taking into account, that it has 
 been documented
I was confused by sentences like
Where do you think the cursor is after matching the [end] rule?


Interesting, so, you do not know where the cursor is after matching 
the [end] rule? Otherwise, such a question cannot confuse anybody 
knowing where the cursor is.
Geomol
27-Apr-2011
[5669]
That I don't agree with. I don't see, it say anywhere in the doc, 
that thru does not advance the input.
Ladislav
27-Apr-2011
[5670x2]
That is not what I said
I said, that, in general, PARSE may, or may not advance the input 
after successfully matching a rule. Which is true.
Geomol
27-Apr-2011
[5672x3]
Interesting, so, you do not know where the cursor is after matching 
the [end] rule?

I assume, I know it, when it comes to parse in R2. I'm not sure with 
R3, as I don't have much experience with that.
Yes, true about parse may or may not.
I'm quite impressed (or surprised at least), how much parse has grown 
from R2 to R3. I haven't studied it close, but what's your opinion? 
Is all those rules necessary. I feel, it might be too complex to 
use?
Ladislav
27-Apr-2011
[5675x4]
And, I guess, that the "past" word does not express as clearly what 
Carl had in mind, and that he wanted to explain the general case, 
explaining all possible outcomes of subrule matching.
(in one sentence)
...how PARSE has grown from R2 to R3

 - actually, not at all. That is only a superficial difference. As 
 can be seen in the


http://en.wikibooks.org/wiki/REBOL_Programming/Language_Features/Parse/Parse_expressions


article, (especially it is obvious when the "Idioms" section is examined), 
all the constructs from R3 are possible in R2 as well.
See also

http://www.rebol.org/view-script.r?script=parseen.r
Geomol
27-Apr-2011
[5679]
Oh, ok.
Ladislav
27-Apr-2011
[5680x3]
The "Idioms" section actually suggests, that even some R2 constructs 
are "superfluous" in the sense, that they can be derived from more 
elementary constructs like sequence and choice.
For example,

    a: [opt b]

is actually the same as

    a: [b |]
etc.
Geomol
27-Apr-2011
[5683]
Interesting. Could it be an idea to 'create' a minimum parse? Maybe 
just the specification.
Ladislav
27-Apr-2011
[5684]
You should examine the "Idioms" section to get the idea.
Geomol
27-Apr-2011
[5685x3]
I will.
Has anyone made PARSE as a function? It should be possible, right?
Found a trick to parse integers in blocks. Let's say, I want to parse 
this block: [year 2011]

The rule can't be ['year 2011], because 2011 in this case is a counter 
for number of next element (none here). So normally, I would do something 
like ['year set y integer! ( ... )] and checking the y variable and 
create a fail rule, in case it's not 2011. But this is the trick:

>> parse [year 2011] ['year 1 1 2011]
== true


Two numbers mean repeat the next pattern a number of times, and in 
this case, the pattern can be an integer itself.
onetom
27-Apr-2011
[5688]
:) nice
Gregg
27-Apr-2011
[5689]
I wouldn't call it a trick John, just a non-obvious syntax. I haven't 
used it much, but I wrote a func a long time ago when I needed it 
for something.

literalize-int-rules: func [template /local mark] [
; Turn a single integer value into a quantity-of-one integer
; rule for parse (e.g. 1 becomes 1 1 1, 4 becomes 1 1 4).
	rule: [
		any [
			into rule
			| mark: integer! (insert mark [1 1]) 2 skip 
			| skip
		]
	]
	parse template rule
	template
]