I took the model proposed at
https://code.jsoftware.com/wiki/Vocabulary/semico#Running_the_Machine
and fixed a few problems and added an opcode 7, and built a state
table that satisfies the tests I put it through.

It seems to work:

sq=:4 :0
  'f s m ijrd'=. x,(#x)}.0;0;'';0 _1 0 _1 assert. 2 <: #x
  'i j r d'=. ijrd
  'p pj'=. _1,j
  if. 0 < L. m do.
    n=. (y i.~;m) { (#m),~(#&>m)#i.#m
  elseif. ''-:m do.
    n=. y
  elseif. do.
    n=. (a.i.y){m
  end.
  result=. f {:: (0#a:);'';i.&.>0 2;0;0 3;0 6
  while. i <: #n do.
    if. i = #n do.
      if. d >: 0 do. 'newrow action' =. (<r,c =. d) { s
      elseif. j = _1 do. break.
      elseif. f = 5 do. break.  NB. Don't output final flush
      elseif. do. 'newrow action' =. 0 5
      end.
    else. 'newrow action' =. (<r,c =. i { n) { s
    end.
    assert. newrow < #s
    if. f = 5 do. result =. result , i, j, r, c, newrow, action end.
    select. action
      case. 0 do.
      case. 6 do. break.
      case. 7 do. i=. i-2
      fcase. 2;3;4;5 do. NB. emit
        assert. j >: 0
        if. f ~: 5 do.
          ej=. ((r=p)*action>3) { j,pj
          select. f
            case. 0 do. newdata =. < ej }. i {. y
            case. 1 do. newdata =. ej }. i {. y
            case. 2 do. newdata =. ej , i
            case. 3 do. newdata =. (}:$s) #: r,c
            case. 4 do. newdata =. ej , (i-ej) , (}:$s) #: r,c
            case. do.
              'Invalid output type' 13!:8 (1)
          end.
          if. (action <: 3)+.r~:p do. result =. result , newdata
          else. result =. newdata (<:#result)} result
          end.
        end.
        if. r~:p do. pj=. j end.
        p=. action {_1 _1 _1 _1,r,r
      case. 1 do.
        j =. (action e. 1 2 4) { _1,i
      case. do.
        'Invalid action' 13!:8 (1)
    end. NB. select action
    r =. newrow
    i =. i + 1
  end.
  result
)

mj=: 256$0                     NB. X other
mj=: 1 (9,a.i.' ')}mj          NB. S space and tab
mj=: 2 (,(a.i.'Aa')+/i.26)}mj  NB. A A-Z a-z excluding N B
mj=: 3 (a.i.'N')}mj            NB. N the letter N
mj=: 4 (a.i.'B')}mj            NB. B the letter B
mj=: 5 (a.i.'0123456789_')}mj  NB. 9 digits and _
mj=: 6 (a.i.'.')}mj            NB. . the decimal point
mj=: 7 (a.i.':')}mj            NB. : the colon
mj=: 8 (a.i.'''')}mj           NB. Q quote
mj=: 9 (a.i.'{')}mj            NB. { the left curly brace
mj=:10 (a.i.'}')}mj            NB. } the right curly brace

NB.0   1    2   3     4    5    6    7    8     9     10
sj=: _2]\"1 }.".;._2 (0 : 0)
' X    S    A    N    B    9    .    :    Q     {      } ']0
 1 1  0 0  2 1  3 1  2 1  6 1  1 1  1 1  7 1  10 1  11 1  NB.  0 space
 1 2  0 3  2 2  3 2  2 2  6 2  1 0  1 0  7 2  10 2  11 2  NB.  1 other
 1 2  0 3  2 0  2 0  2 0  2 0  1 0  1 0  7 2  10 2  11 2  NB.  2 alp/num
 1 2  0 3  2 0  2 0  4 0  2 0  1 0  1 0  7 2  10 2  11 2  NB.  3 N
 1 2  0 3  2 0  2 0  2 0  2 0  5 0  1 0  7 2  10 2  11 2  NB.  4 NB
 9 0  9 0  9 0  9 0  9 0  9 0  1 0  1 0  9 0   9 0   9 0  NB.  5 NB.
 1 4  0 5  6 0  6 0  6 0  6 0  6 0  1 0  7 4  10 4  11 4  NB.  6 num
 7 0  7 0  7 0  7 0  7 0  7 0  7 0  7 0  8 0   7 0   7 0  NB.  7 '
 1 2  0 3  2 2  3 2  2 2  6 2  1 2  1 2  7 0  10 2  11 2  NB.  8 ''
 9 0  9 0  9 0  9 0  9 0  9 0  9 0  9 0  9 0   9 0   9 0  NB.  9 comment
 1 2  0 3  2 2  3 2  2 2  6 2  1 0  1 0  7 2  12 0   1 2  NB. 10 {
 1 2  0 3  2 2  3 2  2 2  6 2  1 0  1 0  7 2   1 2  13 0  NB. 11 }
 1 2  0 3  2 2  3 2  2 2  6 2  1 7  1 7  7 2   1 2   1 2  NB. 12 {{
 1 2  0 3  2 2  3 2  2 2  6 2  1 7  1 7  7 2   1 2   1 2  NB. 13 }}
)

   (0;sj;mj) sq '{{+/y}}'
+--+-+-+-+--+
|{{|+|/|y|}}|
+--+-+-+-+--+
   (0;sj;mj) sq '{{+/y}}}'
+--+-+-+-+--+-+
|{{|+|/|y|}}|}|
+--+-+-+-+--+-+
   (0;sj;mj) sq '{{.+/y}}.'
+-+--+-+-+-+-+--+
|{|{.|+|/|y|}|}.|
+-+--+-+-+-+-+--+

Thanks,

-- 
Raul

On Sat, Nov 7, 2020 at 9:58 AM Henry Rich <[email protected]> wrote:
>
> (;: y) is very fast, quite a bit faster than (x ;: y), and the only
> error it recognizes is open quote.  If you just want to avoid that
> error, I recommend
>
>    ;: :: (;:@:(,&''''))
>
> You might want to enlarge that so as to leave some indication that the
> quote was added.
>
>
> Raul, if a new action were added to (x ;: y) to decrement i (that is, if
> an iteration is looking at character 6 the next iteration will look at
> character 5), with no output and no change to j, would that allow you to
> model (;: y)?
>
> Henry Rich
>
>
>
> --
> This email has been checked for viruses by AVG.
> https://www.avg.com
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to