World: r3wp
[Parse] Discussion of PARSE dialect
older newer | first last |
Steeve 29-Sep-2009 [4083x3] | it seems |
parse is in mode parse/all by default now, but we can remove the option, a bug ? | |
*we can't | |
BrianH 29-Sep-2009 [4086x2] | /all still affects simple parse (splitting instead of rules). |
With the PARSE changes, this puts us within the range of a parsing model with a reasonably solid theoretical foundation and a lot of experience with parser generators. We could compile PARSE rules into equivalent incremental rules. | |
Steeve 29-Sep-2009 [4088x2] | yep we could start by building a compiler of rules into incremental ones (with rebol i mean) |
i made some tests in the past | |
Steeve 30-Sep-2009 [4090x2] | About STAY, i don't see the interest to continue even if the following rule is not matched . Can someone give an use case ? because when i do this: >> parse [1] [stay skip ?? to end] to: [1] == true or >> parse [ ] [stay skip ?? to end] to: [ ] == true it's like doing: >> parse [ ...] [?? to end] STAY have no purpose to my mind... |
It's just a little annoying, see: >> parse a: "12" [remove copy val skip] print [a val] ==2 none So, the [remove] treats well the [skip], but discard the content of [copy val] Now, see: >> parse a: "12" [remove [copy val skip]] print [a val] == 2 1 The content of [val] is preserved in that case, don't know why here, but not above... | |
Pekr 30-Sep-2009 [4092x2] | I would expect 'val being 1 in both cases ..... |
But maybe reading the "expression" the REBOL way - from left to right, is not correct? | |
Steeve 30-Sep-2009 [4094] | i rather think it's a bug |
Anton 30-Sep-2009 [4095] | Is it that REMOVE takes one argument? |
Pekr 30-Sep-2009 [4096] | Yes, it takes on argument - the rule ... |
Anton 30-Sep-2009 [4097] | (I'm just reading that new blog article about it... Sorry for adding new ignorant question before doing anything to alleviate my ignorance.) |
Pekr 30-Sep-2009 [4098] | sometimes getting reply here on altme is faster than reading corresponding article :-) |
Steeve 30-Sep-2009 [4099] | That's not the problem, SET VAR ot COPY VAR are not rules, they should not be "viewed" by REMOVE |
RobertS 30-Sep-2009 [4100] | I am still guessing at what is intended in R3-a84 but the first looks OK and the second looks like a bug >> parse "abad" [thru "a" stay [to "b"] (print "at b") thru "d"] at b == true >> parse "abad" [stay thru "c" (print "at c") [to "b"] thru "d"] at c == true ; BUT must still be a bug |
Steeve 30-Sep-2009 [4101] | It's not a bug, it's behaving like Carl wanted. The final question is: To do what ? |
Pekr 30-Sep-2009 [4102] | STAY could be a by product by wrongly implemented AND. |
Steeve 30-Sep-2009 [4103] | Yep, a bye bye product |
Pekr 30-Sep-2009 [4104] | express yourself via channels Carl listens to - blog, chat, or even better - CureCode ... :-) |
Steeve 30-Sep-2009 [4105] | I would like to say how the new parse is powerfull and light. For example: I have a block which contains 1, 2, or 3 values I have to insert something between 1 and 2, if there is at least 2 values. and something else between 2 and 3., if there is 3 values. See: parse block [ skip not end insert [ _ ] skip not end insert [ . ] ] Is that not marvelous ? |
Pekr 30-Sep-2009 [4106x2] | this is how it works in A84? |
And we still don't have IF, USE, INTO string! | |
Steeve 30-Sep-2009 [4108] | just think how you would do my example with standard code, it would be more verbose. |
Henrik 30-Sep-2009 [4109] | how does skip not end work? I don't get it. |
Pekr 30-Sep-2009 [4110x3] | skip is skip,no? |
not end means, that the rule is matched as true, if not at end ... | |
it is kind of check | |
Henrik 30-Sep-2009 [4113] | does skip mean, skip 1 element? |
Pekr 30-Sep-2009 [4114x3] | if not at end, insert [.] |
yes, skip is skip 1 by default ... | |
not skip 1, but 1 skip .... | |
Henrik 30-Sep-2009 [4117x2] | ah, forgot that the block is only of max. three values |
BTW, why are we saying END instead of TAIL ? | |
Steeve 30-Sep-2009 [4119] | parse block [ skip ;** skip the first value not end ;** check if the block have a second value (if not, then stop) insert [ _ ] skip ;** insert what is inside [ ] before the second vlue , skip what it has been inserted, and skip one more time to pass the second value. not end ;** check if there is a third value (if not, then stop) insert [ . ] ;** insert [.] before the third value ] |
Henrik 30-Sep-2009 [4120x2] | I think I get it now, thanks. |
I wonder if we can test against a larger parse project now, such as postscript.r? | |
Steeve 30-Sep-2009 [4122] | i widely using it now, i rewrite an assembler/desassembler for Z80 |
BrianH 30-Sep-2009 [4123x2] | STAY is only useful for rules with effect: modifiers, and rules containing productions. Sometimes you need to do stuff where necessary and not care whether they were necessary later. |
We do have IF (renamed CHECK). | |
Steeve 30-Sep-2009 [4125] | It's theorical, i wonder if it's of any real use because we can do what you mean without STAY. |
BrianH 30-Sep-2009 [4126x2] | END is a keyword. This is PARSE, not DO. |
I am of the opinion that STAY is of (very) limited but significant use, but that AND is of critical, everyday use, as much as NOT. | |
Steeve 30-Sep-2009 [4128x3] | i want see the code where you demonstrate that STAY saves something. |
i'm not convinced :-) | |
i agree for AND urgency | |
BrianH 30-Sep-2009 [4131] | 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. |
Maxim 30-Sep-2009 [4132] | I posted on the blog about REMOVE. much prefer matching a rule. |
older newer | first last |