[Jprogramming] unmatched parenthesis
Raul Miller
rauldmiller at gmail.com
Tue Dec 27 09:15:32 UTC 2016
I do not know what values were returned for the "failed" cases, and I
should have that if I'm going to debug your c#. (Since I don't have c#
installed on this machine.)
That said, the return 0; in scriptclose belongs there: If there's any
characters on a line other a line other than whitespace or ) then the
line is not a scriptclose line.
Try putting that back and seeing if that fixes things for you?
Thanks,
--
Raul
On Tue, Dec 27, 2016 at 4:01 AM, bill lam <bbill.lam at gmail.com> wrote:
> My c# transliteration from your c code. Not sure if I had done
> it correctly.
>
> the return 0 inside scriptclose seemed shouldn't be there.
> I tested it works with some success and some failures
> aa) failed
> aa)) ok
> aa()) ok
>
> single ")" (non-scriptclose) doesn't work
>
> aa( failed
> aa(( failed
> aa((( failed
> aa(() failed
> aa((() failed
> aa((()) ok
>
> it seems "(" requires at least 2 ")" to work.
>
> Handling of contexts for inside string and after NB. seems
> working correctly.
>
> c#:
> int scriptclose(string line, int len)
> {
> int rparen= 0;
> for (int j= 0; j<len; j++) {
> char c= line[j];
> if (' '==c) continue;
> if ('\t'==c) continue;
> if (')'==c) {
> if (0!=rparen++) return 0;
> }
> // return 0;
> }
> return 1;
> }
>
> int firstunmatched(string line, int len)
> {
> if (0==len || 0!=scriptclose(line, len)) return len;
> int depth= 0;
> int nb= 0;
> int unquoted= 1;
> int uncommented= 1;
> int r= len; /* first unmatched ) */
> int l= len; /* first unmatched ( */
> int[] d=new int[len];
> for (int j= 0; j<len; j++) {
> char c= line[j];
> if ('\''==c) unquoted= (0==unquoted)?1:0;
> if (unquoted!=0 && uncommented!=0) {
> if ('('==c) depth++; /* find paren depth */
> else if (')'==c) depth--;
> if (-1==depth && r==len) r=j; /* find first unmatched ) */
> if (0==nb && 'N'==c) nb=1; /* find comment start */
> else if (1==nb && 'B'==c) nb=2;
> else if (2==nb && '.'==c) uncommented= 0;
> else nb= 0;
> }
> d[j]= depth;
> }
> if (0 < d[len-1]) {
> int prev= 0;
> for (int j= 0; j<r; j++) {
> if (0 ==prev && 1==d[j]) {
> l= j;
> }
> prev= d[j];
> }
> return l;
> }
> return r;
> }
>
>
> Вт, 27 дек 2016, Raul Miller написал(а):
>> Ok, here's a translation to C. Some variable names changed. Lightly tested:
>>
>> int scriptclose(char *line, unsigned int len) {
>> int rparen= 0;
>> for (unsigned int j= 0; j<len; j++) {
>> char c= line[j];
>> if (' '==c) continue;
>> if ('\t'==c) continue;
>> if (')'==c) {
>> if (rparen++) return 0;
>> }
>> return 0;
>> }
>> return 1;
>> }
>>
>> int firstunmatched(char *line, unsigned int len) {
>> if (0==len || scriptclose(line, len)) return len;
>> int depth= 0;
>> int nb= 0;
>> int unquoted= 1;
>> int uncommented= 1;
>> int r= len; /* first unmatched ) */
>> int l= len; /* first unmatched ( */
>> int d[len];
>> for (unsigned int j= 0; j<len; j++) {
>> char c= line[j];
>> if ('\''==c) unquoted=!unquoted;
>> if (unquoted && uncommented) {
>> if ('('==c) depth++; /* find paren depth */
>> else if (')'==c) depth--;
>> if (-1==depth && r==len) r=j; /* find first unmatched ) */
>> if (0==nb && 'N'==c) nb=1; /* find comment start */
>> else if (1==nb && 'B'==c) nb=2;
>> else if (2==nb && '.'==c) uncommented= 0;
>> else nb= 0;
>> }
>> d[j]= depth;
>> }
>> if (0 < d[len-1]) {
>> int prev= 0;
>> for (unsigned int j= 0; j<r; j++) {
>> if (0 ==prev && 1==d[j]) {
>> l= j;
>> }
>> prev= d[j];
>> }
>> return l;
>> }
>> return r;
>> }
>>
>> Results should match that of:
>>
>> firstunmatched=:3 :0
>> if. ')' -:&(-.&' ') y do. #y return. end.
>> q=. unquoted=. -.~:/\y=''''
>> c=. uncommented=. -. +./\ q * 'NB.' E. y
>> n=. parendepth=. +/\q*c*-/'()'=/y
>> if. 0 < {: n do.
>> (n i. _1) <. 1 i:~0 1 E. 0,n
>> else.
>> n i. _1
>> end.
>> )
>>
>> I hope this helps,
>>
>> --
>> Raul
>>
>> On Mon, Dec 26, 2016 at 11:18 PM, bill lam <bbill.lam at gmail.com> wrote:
>> > The firstunmatched verb needs to run only on visible
>> > portion of text and I think it should be fast enough, but
>> > it requires some effort to translate the scan operator to
>> > its equivalent in c or c#.
>> >
>> > --
>> > regards,
>> > ====================================================
>> > GPG key 1024D/4434BAB3 2008-08-24
>> > gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3
>> > gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3
>> > ----------------------------------------------------------------------
>> > For information about J forums see http://www.jsoftware.com/forums.htm
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
>
> --
> regards,
> ====================================================
> GPG key 1024D/4434BAB3 2008-08-24
> gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3
> gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
More information about the Programming
mailing list