That's good.  If anybody can see a problem with adding an opcode 7, titled 'backtrack', which goes back to the previous character without outputting anything, please speak up.

To match (;: y), your state machine needs to treat LF as a special character that ends a comment, does not end a quoted string, and cannot be inflected.  When not in a quoted string it becomes a word by itself.

Henry Rich

On 11/7/2020 1:53 PM, Raul Miller wrote:
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,



--
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

Reply via email to