cutP 'a(b)' ┌─┬─┬┐ │a│b││ └─┴─┴┘ the even (index 0) boxes are the contents of what is outside the brackets if anything.
there is no requirement that start or end be bracket symbols. ----- Original Message ----- From: Raul Miller <[email protected]> To: Programming forum <[email protected]> Sent: Wednesday, December 7, 2016 4:59 PM Subject: Re: [Jprogramming] parentheses matching I'm not sure that a balanced parsing always has an odd number of boxes. For example, 'a(b)' Or, if we require that the first character always be a '(' then '(b)a' If there's a requirement that the first and last characters always be '(' and ')' then that would give the "balanced parsing always has an odd number of boxes" constraint. Thanks, -- Raul On Wed, Dec 7, 2016 at 3:34 PM, 'Pascal Jasmin' via Programming <[email protected]> wrote: > the requirement is to cut based on outer parentheses level. For inner > parentheses, if you want those also cut, then you would repeat the function > on odd indexes. Yes you got this right > > > "My guess is you are asking for: each time boxing changes between level 0 > and 1 you want a box fret. Box levels beyond 1 are ignored." > > Your solution seems beautiful > > > F=: (]~:0,}:)@:(1<.]) > > with change to depth to make it ambivalent (and so paren characters a > parameter) > > depth =: ([: +/\ =/\@(''''&~:) * 1 _1 0 {~ '()' i. ]) : ([: +/\ > =/\@(''''&~:)@] * 1 _1 0 {~ i.)cutP =: ({:@] ,~ ]) <;._2~ 1 ,~ (] ~: 0 , > }:)@:(1 <. ])@:depth > > cutP '(a(bdc)g)gg(ffff)' > ┌┬───────┬──┬────┬┐ > ││a(bdc)g│gg│ffff││ > └┴───────┴──┴────┴┘ > > '()' cutP 'qq((a(bdc)g)gg(ffff))g' > ┌──┬─────────────────┬─┐ > │qq│(a(bdc)g)gg(ffff)│g│ > └──┴─────────────────┴─┘ > > I agree that you may often/always want to tunnel down into the paren group, > and this is accomplished by repeating the function for odd indexes. > > > Assert =: 1 : '] [ [ 13!:8^:((0 e. ])`(12"_)) u@]' > cutP2 =: 'Paren mismatch' (2 |#) Assert cutP > > one of the neat features of the layout is that a balanced parsing has odd > number of boxes. cutP2 raises an error, though off by 2 errors are not > caught so not completely useful. > > > > invoke =: 4 : 'x `:0 y'"_1 > altM =: ($~ #) invoke ] > > > ]`(cutP each) altM cutP 'qq((a(bdc)g)gg(ffff))g' > > ┌──┬───────────────────┬─┐ > │qq│┌┬───────┬──┬────┬┐│g│ > │ │││a(bdc)g│gg│ffff│││ │ > │ │└┴───────┴──┴────┴┘│ │ > └──┴───────────────────┴─┘ > > which tunnels one level, but I am having difficulty with an elegant solution > to tunnel through all levels. > > > > > ----- Original Message ----- > From: Raul Miller <[email protected]> > To: Programming forum <[email protected]> > Sent: Wednesday, December 7, 2016 1:31 PM > Subject: Re: [Jprogramming] parentheses matching > > I am trying to make sense of your requirements. > > Your final example includes some parenthesis, but not others. It also > includes at the same boxing level content from different parenthesis > depths. How does this make sense? > > My guess is you are asking for: each time boxing changes between level 0 > and 1 you want a box fret. Box levels beyond 1 are ignored. > > With that specification, here's my F: > > F=: (]~:0,}:)@:(1<.]) > > Note, of course, that this definition (and the use of <;._2) assumes that > the first character of the argument to depth is a '('. But I think if you > could change your specification such that it boxes level 1 content deeper > than level 0 content that that would solve this one also. > > Basically, I think you need to start from what your final result looks > like, and J's boxed type requires that everything be in boxes, so you > should probably want a final result that looks like this: > > ('a';(<'bdc');'g');'gg';(<<'ffff') > ┌───────────┬──┬──────┐ > │┌─┬─────┬─┐│gg│┌────┐│ > ││a│┌───┐│g││ ││ffff││ > ││ ││bdc││ ││ │└────┘│ > ││ │└───┘│ ││ │ │ > │└─┴─────┴─┘│ │ │ > └───────────┴──┴──────┘ > > In other words: > > * Boxing level for characters is 1+depth. > > * Box boundaries are increment boundaries. > > * All adjacent content at a given increment level (or higher) gets > contained in one box. > > * All parenthesis get removed. > > Do you agree with this specification? (Why or why not?) > > Thanks, > > -- > Raul > > On Wed, Dec 7, 2016 at 11:56 AM, 'Pascal Jasmin' via Programming < > [email protected]> wrote: > >> There is this useful essay >> >> http://code.jsoftware.com/wiki/Essays/Parentheses_Matching >> >> but consider, >> >> depth =: [: +/\ =/\@(''''&~:) * 1 _1 0 {~ '()' i. ] >> >> depth '(a(bdc)g)gg(ffff)' >> 1 1 2 2 2 2 1 1 0 0 0 1 1 1 1 1 0 >> >> my goal is to box an expression such that at the "top level", at least 3 >> boxes are generated >> >> >> 'outside (' ; 'inside outer ()' ; 'outside ) and outside next top level (' >> >> >> optionally followed by even number of boxes corresponding to last 2 >> conditions. >> >> the most straightforward path I see is to create an argument to <;._2 >> sucht that: >> >> F depth '(a(bdc)g)gg(ffff)' >> 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 >> >> >> and where, >> >> >> 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 ((<;._2) ' ' ,~ ]) '(a(bdc)g)gg(ffff)' >> ┌┬───────┬──┬────┬┐ >> ││a(bdc)g│gg│ffff││ >> └┴───────┴──┴────┴┘ >> >> what is F? >> ---------------------------------------------------------------------- >> For information about J forums see http://www.jsoftware.com/forums.htm > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
