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

World: r3wp

[Parse] Discussion of PARSE dialect

Brock
27-Jun-2007
[1976]
the | none handles situations where the rule doesn't apply, so almost 
everything will return true
btiffin
27-Jun-2007
[1977]
Brock;  Without it it'll endless loop no?
Steeve
27-Jun-2007
[1978x2]
no
just never use an ''opt" rule in a some or any block
Brock
27-Jun-2007
[1980]
will it just be instances of A B & C?
Steeve
27-Jun-2007
[1981x6]
one instance of each in any order (but just one instance)
the awaiting result is 
a: b: c: false

parse "CAB" [some ["A" (a: true) | "B" (b: true) | "C" (c: true)]] 
if all [a b c ] [print "ok"]
*expecting result
except that this code is wrong for series with repeting characters 
like "AABCC"
(should increment a b and c instead using boolean)
anyway , that's not the point , i know how to do that, but i just 
 think it's ugly
btiffin
27-Jun-2007
[1987x2]
parse "ABC" [3 [1 "A" | 1 "B" | 1 "C"]]  ?
nevermind...  :)  AAA returns true
Steeve
27-Jun-2007
[1989x2]
yep
i really think it's not feasible without using counters
Brock
27-Jun-2007
[1991x3]
I think I have it
define a rule;
rule: [1 ["A" | "B" | "C"]]
then parse
parse "cAB" [[rule] [rule] [rule]]
the one indicates that there must be an occurence of one of the three 
characters... supplying the rule then requires three characters to 
be entered.
... but it allows multiple characters... damn
Steeve
27-Jun-2007
[1994]
and it works too with the serie "AAA"
Brock
27-Jun-2007
[1995]
which is bad
Steeve
27-Jun-2007
[1996]
yrp
btiffin
27-Jun-2007
[1997]
parse can change the string as it goes right?  What if you tried 
marking them off with X's as you found them?
Brock
27-Jun-2007
[1998]
I was thinking the same thing, removing each character from a block 
as each rule is processed.
Steeve
27-Jun-2007
[1999]
yeah it's possible but it's like hanging counters, you need to have 
some code to check the result and allowing the parser to continue 
further
Brock
27-Jun-2007
[2000]
so your ideal solution would not use anyting other than parse?
Steeve
27-Jun-2007
[2001x2]
yeah i would use a clean dialect , cause i have many many rules of 
this type
moreover , i just  don't want parse simple series like "ABC"
Brock
27-Jun-2007
[2003x2]
what about a 'unique function or something that tests the string 
for unique characters?
... then parse
Steeve
27-Jun-2007
[2005]
as i said , it was just an example , in fact in my case: "A" "B" 
and "C" are complex subrules, so unique don't apply
Brock
27-Jun-2007
[2006]
I think you've lost me.  So when you say sub-rules, you are really 
saying sub 'parse' rules for your dialect?
Steeve
27-Jun-2007
[2007]
yep
Brock
27-Jun-2007
[2008x2]
Will there be more than three rules possible?  You indicate "A" "B" 
and  "C", but could another instance of this also have a fourth character?
each being unique sub-rules
Steeve
27-Jun-2007
[2010x2]
yep, it's not limited
but when i say complex sub-rules , i mean that i have not to check 
single character only, but complex sentences
Brock
27-Jun-2007
[2012]
so the parse string would be better indicated something like "A B 
C" where each of those characters could be a sentence?
Steeve
27-Jun-2007
[2013]
yep
Brock
27-Jun-2007
[2014]
so this is close, with the exception that it does not allow for easy 
testing of unique terms being passed?
r1: "Sent frag 1"
r2: "Sent frag 2"
r3: "Sent frag 3"
r4: "Sent frag 4"

rule: [1 [r1 | r2 | r4 | r3]]


parse "Sent frag 1 sent frag 3 sent frag 4 sent frag 2" [[rule] [rule] 
[rule] [rule]]
Steeve
27-Jun-2007
[2015]
wrong, same problem ever, if it's the same sentence many time
Brock
27-Jun-2007
[2016]
yes, that's what I stated above, if it wouldn't allow for the same 
value to be passed twice, this would work.
Steeve
27-Jun-2007
[2017]
yep
Brock
27-Jun-2007
[2018x4]
I guess I don't understand why a unique function wouldn't work as 
a test prior to parsing.
;very basic example - 
unique: func [str][
	compare-set: "ABC"

 either "" = difference str compare-set [return true][return false]
]

;;;; and yes, that is very ugly
replace;   either "" =
with:   either empty?
... and of course 'unique shouldn't be used as a name due to Rebol 
already having a unique function.
Steeve
27-Jun-2007
[2022x2]
unique works for the rules which use simple constants, but i said 
it, i use more complex rules
parse data [all [rule1 | rule2 | rule3 | rule4]] 

all rules must apply 1 time and 1 time only  in any order, don't 
focus on what is inside rules (it contains sub-rules which contains 
sub-rules).
btiffin
27-Jun-2007
[2024]
Ok, this is convulted and probably wrong


rule: [copy res subrule (remove/part find subrule compse [| (res)] 
2)]
subrule: ["filler" | "a" | "b" | "c"]
parse "fillerabc" [4 [rule] end]


Remove the alternatives from the rule as you find them...the filler 
is to allow | "a" to be found.
Steeve
27-Jun-2007
[2025]
argh, this is uggly :-)
not better than my current solution using counters