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

World: r3wp

[Parse] Discussion of PARSE dialect

BrianH
30-Sep-2009
[4140]
remove copy
Maxim
30-Sep-2009
[4141]
yep... I read it just after posting  :-)
Steeve
30-Sep-2009
[4142]
Brian, you said: 

STAY is of use when combined with CHANGE or INSERT, when you want 
the parse position to be set to the position before the insert not 
after, and when the modification is optional, or otherwise doesn't 
need to be specially checked.

you mean something like:

parse [...][ STAY rule remove something]

but it's the same thing that:
parse [...] [remove something]

i don't see your point, give an example please.
BrianH
30-Sep-2009
[4143x2]
PARSE bugs, particularly new ones, are all urgent priority. This 
is what we're working on now.
REMOVE doesn't advance, so STAY isn't needed. That's why I didn't 
mention REMOVE.
Maxim
30-Sep-2009
[4145]
steeve, remove is the odd case cause it returns the original position 
anyways, insert moves cursor past insert
BrianH
30-Sep-2009
[4146]
CHANGE or INSERT, or rules containing productions.
Maxim
30-Sep-2009
[4147]
I would stay A LOT with remark  , stay  its just a shorthand for 
  

 pos: [rule] :pos 

 but its handy  :-)
BrianH
30-Sep-2009
[4148]
No, that's AND. STAY is pos: opt [rule] :pos
Steeve
30-Sep-2009
[4149x2]
Brian, try it with INSERT if you want, it's the same useless thing.

>> parse a: "123" [STAY "456" insert "0"] a
== "0123"

Exactly the same thing that:

>> parse a: "123" [insert "0"] a
== "0123"
STAY has no use
BrianH
30-Sep-2009
[4151]
You are still putting the matching rule as the stay argument, not 
the modifying rule.
Steeve
30-Sep-2009
[4152x3]
hmmm....
i give it a try
oh I see...

>> parse "123" [insert "0" ??]
end!: "123"
== false

>> parse "123" [stay insert "0" ??]
end!: "0123"
== false
BrianH
30-Sep-2009
[4155]
Right now, since we don't have CHANGE, the opt aspect of STAY doesn't 
matter with INSERT. To have use you have to use it with rulees with 
productions in them.
Steeve
30-Sep-2009
[4156]
i see a little better now
BrianH
30-Sep-2009
[4157x2]
STAY is equivalent to OPT AND or AND OPT.
Just like AND is the (much less annoying) equivalent of NOT NOT, 
in theory.
Steeve
30-Sep-2009
[4159]
Brian, i posted the bug, you can rewrite it now :-)
BrianH
30-Sep-2009
[4160x2]
Cool, thanks :)
Done.
Ladislav
30-Sep-2009
[4162]
the

    a: [stay b]

rule can be rewritten as

    a: [b fail |]

generally, I am of the opinion, that it is superfluous
Maxim
30-Sep-2009
[4163]
many of the parse rules are shorthands for already doable things 
(except 'NOT and to/thru multi)
Ladislav
30-Sep-2009
[4164]
moreover, the AND rule is usually what is desired, not the STAY rule, 
which is just a bug. I do not know any really meaningful use case 
for STAY; the above INSERT surely isn't one
Maxim
30-Sep-2009
[4165]
remark could be rewriten using stay, and it would be much simpler 
to build/read.
BrianH
30-Sep-2009
[4166]
That's why I put STAY so low on the priority list. Maxim, you are 
still confusing STAY and AND.
Maxim
30-Sep-2009
[4167]
nope.
Ladislav
30-Sep-2009
[4168]
you do not know shorthand for NOT? It may be as follows:

    a: [not b]

is equivalent to

  a: [b then fail | none]
Maxim
30-Sep-2009
[4169x4]
nope remark does what I call persistent parsing.  it only moves ahead, 
once all INNER rules have recursively flushed themselves out.
with inner parsing rules modifying the input and potentially triggering 
new parse matches.
cause inner rules generate parse-able content, which was not part 
of the original input.
true functional unfolding  :-)
Ladislav
30-Sep-2009
[4173x2]
the Rebol programming wikibook contains a bunch of such idioms
and THRU multi is even simpler:

    a: [thru b]

is equivalent to

    a: [b | skip a]
Maxim
30-Sep-2009
[4175x2]
yep... all hard to understand and code in real life.  which is why 
I say that the new keywords, just make it easier to parse stuff. 
 They aren't hacks or tricks anymore, they are supported directly 
by the parse dialect.


its like the stack handling... its just going to be MUCH simpler 
so use push, than tinker with your own stack.
or rather 'USE ... sorry.
BrianH
30-Sep-2009
[4177]
I'm not saying STAY isn't useful, just that it is lower priority 
than AND because it's use is more limited.
Maxim
30-Sep-2009
[4178]
you see the thru multi you show... is excessively hard to "see", 
even I look at it and have to wrap my brain against it, and its really 
not "obvious"
BrianH
30-Sep-2009
[4179]
I like having STAY though, since I am one of the advanced parse users 
that would find use for it, like Maxim and Carl :)
Steeve
30-Sep-2009
[4180x2]
we will see...
A
Ladislav
30-Sep-2009
[4182]
as shown above, it is superfluous; the a: [b fail |] rule is exactly 
as simple as a: [stay b]
BrianH
30-Sep-2009
[4183]
All of the new additions are superfluous, Ladislav. They were added 
to make our lives easier, not to enable stuff we couldn't do before.
Maxim
30-Sep-2009
[4184x2]
I'm  looking at this.....    a: [b fail |]  and its totally obscure 
... I don't see it at all, I can study and eventually "understand" 
it, but within a 1000 line parse rule... <eek>. 

the way I see STAY is: [pos: b :pos]
(speaking as a general user... not myself specifically)
BrianH
30-Sep-2009
[4186]
Sorry, that's still AND. STAY is [pos: opt b :pos].
Ladislav
30-Sep-2009
[4187]
well, I do not think, that e.g. NOT is superfluous, since it substantially 
simplifies the expression. This is not true for STAY.
BrianH
30-Sep-2009
[4188]
The fact is that all of these were added to make our lives easier. 
Now I don't think STAY is worth the effort to implement it, but given 
that Carl *already has* implemented it, it it worth removing? This 
is regardless of the merits of AND, which are unquestioned.
Steeve
30-Sep-2009
[4189]
NOT is very important, especially because charset can't be complemented 
in R3 (Actually they can, but it's a monstrous thing to add all the 
possible chars in a bitset, just to skip someones)