Environment:
- GNU APL 1.2 or latest checkout from SVN, built from source
- OS X Mavericks, MacBookPro 8 GB RAM, More than 10 GB free disk space

Workspace,
- Manually edited and tested on Dyalog APL,
- Exported as UTF8 text
- Text sucessfully copied and pasted in clear Dyalog APL workspace, functions tested 'PARSE S3' provides expected result.
- Same text successfully copied and pasted in GNU APL, workspace saved

Problem:
Goal: Load Workspace in GNU APL, use and extend the functions
Fact: Loading is successful
Fact: After loading, PARSE '(A+B)' displays expected result
Symptom: After loading input of APL characters is broken, iota is echoed as \U+00C3
Symptom: 'PARSE S3' crashes GNU APL

Attachment:
- APL source as text (with and without line numbers)
- Workspace XML

Jean-Pierre de SOZA






<?xml version='1.0' encoding='UTF-8' standalone='yes'?>

<!DOCTYPE Workspace
[
    <!ELEMENT Workspace (Value*,Ravel*,SymbolTable,Symbol*,StateIndicator)>
    <!ATTLIST Workspace  wsid     CDATA #REQUIRED>
    <!ATTLIST Workspace  year     CDATA #REQUIRED>
    <!ATTLIST Workspace  month    CDATA #REQUIRED>
    <!ATTLIST Workspace  day      CDATA #REQUIRED>
    <!ATTLIST Workspace  hour     CDATA #REQUIRED>
    <!ATTLIST Workspace  minute   CDATA #REQUIRED>
    <!ATTLIST Workspace  second   CDATA #REQUIRED>
    <!ATTLIST Workspace  timezone CDATA #REQUIRED>

        <!ELEMENT Value (#PCDATA)>
        <!ATTLIST Value flg    CDATA #REQUIRED>
        <!ATTLIST Value vid    CDATA #REQUIRED>
        <!ATTLIST Value parent CDATA #IMPLIED>
        <!ATTLIST Value rk     CDATA #REQUIRED>
        <!ATTLIST Value sh-0   CDATA #IMPLIED>
        <!ATTLIST Value sh-1   CDATA #IMPLIED>
        <!ATTLIST Value sh-2   CDATA #IMPLIED>
        <!ATTLIST Value sh-3   CDATA #IMPLIED>
        <!ATTLIST Value sh-4   CDATA #IMPLIED>
        <!ATTLIST Value sh-5   CDATA #IMPLIED>
        <!ATTLIST Value sh-6   CDATA #IMPLIED>
        <!ATTLIST Value sh-7   CDATA #IMPLIED>

        <!ELEMENT Ravel (#PCDATA)>
        <!ATTLIST Ravel vid    CDATA #REQUIRED>
        <!ATTLIST Ravel cells  CDATA #REQUIRED>

        <!ELEMENT SymbolTable (Symbol*)>
        <!ATTLIST SymbolTable size CDATA #REQUIRED>

            <!ELEMENT Symbol (unused-name|Variable|Function|Label|Shared-Variable)*>
            <!ATTLIST Symbol name       CDATA #REQUIRED>
            <!ATTLIST Symbol stack-size CDATA #REQUIRED>

                <!ELEMENT unused-name EMPTY>

                <!ELEMENT Variable (#PCDATA)>
                <!ATTLIST Variable vid CDATA #REQUIRED>

                <!ELEMENT Function (UCS)>

                <!ELEMENT Label (#PCDATA)>
                <!ATTLIST Label value CDATA #REQUIRED>

                <!ELEMENT Shared-Variable (#PCDATA)>
                <!ATTLIST Shared-Variable key CDATA #REQUIRED>

        <!ELEMENT UCS (#PCDATA)>
        <!ATTLIST UCS uni CDATA #REQUIRED>

        <!ELEMENT StateIndicator (SI-entry*)>
        <!ATTLIST StateIndicator levels CDATA #REQUIRED>

            <!ELEMENT SI-entry ((Execute|Statements|UserFunction),Parser+)>
            <!ATTLIST SI-entry level     CDATA #REQUIRED>
            <!ATTLIST SI-entry pc        CDATA #REQUIRED>
            <!ATTLIST SI-entry line      CDATA #REQUIRED>
            <!ATTLIST SI-entry vid_arg_A CDATA #IMPLIED>
            <!ATTLIST SI-entry Id_arg_F  CDATA #IMPLIED>
            <!ATTLIST SI-entry vid_arg_B CDATA #IMPLIED>

                <!ELEMENT Statements (UCS)>

                <!ELEMENT Execute (UCS)>

                <!ELEMENT UserFunction (#PCDATA)>
                <!ATTLIST UserFunction ufun-name    CDATA #REQUIRED>
                <!ATTLIST UserFunction symbol-level CDATA #REQUIRED>

                <!ELEMENT Parser (Token*)>
                <!ATTLIST Parser assign-pending CDATA #REQUIRED>
                <!ATTLIST Parser lookahead-high CDATA #REQUIRED>
                    <!ELEMENT Token (#PCDATA)>
                    <!ATTLIST Token pc           CDATA #REQUIRED>
                    <!ATTLIST Token tag          CDATA #REQUIRED>
                    <!ATTLIST Token char         CDATA #IMPLIED>
                    <!ATTLIST Token int          CDATA #IMPLIED>
                    <!ATTLIST Token float        CDATA #IMPLIED>
                    <!ATTLIST Token real         CDATA #IMPLIED>
                    <!ATTLIST Token imag         CDATA #IMPLIED>
                    <!ATTLIST Token sym          CDATA #IMPLIED>
                    <!ATTLIST Token line         CDATA #IMPLIED>
                    <!ATTLIST Token vid          CDATA #IMPLIED>
                    <!ATTLIST Token index        CDATA #IMPLIED>
                    <!ATTLIST Token fun-id       CDATA #IMPLIED>
                    <!ATTLIST Token ufun-name    CDATA #IMPLIED>
                    <!ATTLIST Token symbol-level CDATA #IMPLIED>
                    <!ATTLIST Token comment  CDATA #IMPLIED>

]>


    <!-- hour/minute/second is )SAVE time in UTC (aka. GMT).
         timezone is offset to UTC in seconds.
         local time is UTC + offset -->
<Workspace wsid="bug-gnu-apl" year="2014" month="2" day="2"
           hour="11" minute="44" second="49" timezone="3600">

  <Value flg="400" vid="0" parent="-1" rk="1" sh-0="26"/>
  <Value flg="400" vid="1" parent="-1" rk="0"/>
  <Value flg="400" vid="2" parent="-1" rk="0"/>
  <Value flg="400" vid="3" parent="-1" rk="0"/>
  <Value flg="400" vid="4" parent="-1" rk="0"/>
  <Value flg="400" vid="5" parent="-1" rk="0"/>
  <Value flg="400" vid="6" parent="-1" rk="0"/>
  <Value flg="400" vid="7" parent="-1" rk="0"/>
  <Value flg="400" vid="8" parent="-1" rk="0"/>
  <Value flg="400" vid="9" parent="-1" rk="0"/>
  <Value flg="400" vid="10" parent="-1" rk="1" sh-0="2"/>
  <Value flg="400" vid="11" parent="-1" rk="0"/>
  <Value flg="400" vid="12" parent="-1" rk="1" sh-0="2"/>
  <Value flg="400" vid="13" parent="-1" rk="1" sh-0="2"/>
  <Value flg="400" vid="14" parent="-1" rk="0"/>
  <Value flg="400" vid="15" parent="-1" rk="1" sh-0="2"/>
  <Value flg="400" vid="16" parent="-1" rk="0"/>
  <Value flg="400" vid="17" parent="-1" rk="0"/>
  <Value flg="400" vid="18" parent="-1" rk="1" sh-0="28"/>
  <Value flg="400" vid="19" parent="-1" rk="0"/>
  <Value flg="400" vid="20" parent="-1" rk="0"/>
  <Value flg="400" vid="21" parent="-1" rk="0"/>
  <Value flg="400" vid="22" parent="-1" rk="0"/>
  <Value flg="400" vid="23" parent="-1" rk="0"/>
  <Value flg="400" vid="24" parent="-1" rk="0"/>
  <Value flg="400" vid="25" parent="-1" rk="0"/>
  <Value flg="400" vid="26" parent="-1" rk="0"/>
  <Value flg="400" vid="27" parent="-1" rk="0"/>
  <Value flg="400" vid="28" parent="-1" rk="0"/>
  <Value flg="400" vid="29" parent="-1" rk="0"/>
  <Value flg="400" vid="30" parent="-1" rk="0"/>
  <Value flg="400" vid="31" parent="-1" rk="1" sh-0="1"/>
  <Value flg="400" vid="32" parent="-1" rk="0"/>
  <Value flg="400" vid="33" parent="-1" rk="1" sh-0="1"/>
  <Value flg="400" vid="34" parent="-1" rk="1" sh-0="0"/>
  <Value flg="400" vid="35" parent="-1" rk="0"/>
  <Value flg="400" vid="36" parent="-1" rk="0"/>
  <Value flg="400" vid="37" parent="-1" rk="1" sh-0="6"/>
  <Value flg="400" vid="38" parent="-1" rk="0"/>
  <Value flg="400" vid="39" parent="-1" rk="0"/>
  <Value flg="400" vid="40" parent="-1" rk="0"/>
  <Value flg="400" vid="41" parent="-1" rk="0"/>
  <Value flg="400" vid="42" parent="-1" rk="1" sh-0="3"/>
  <Value flg="400" vid="43" parent="-1" rk="0"/>
  <Value flg="400" vid="44" parent="-1" rk="0"/>
  <Value flg="400" vid="45" parent="-1" rk="0"/>
  <Value flg="400" vid="46" parent="-1" rk="1" sh-0="256"/>
  <Value flg="400" vid="47" parent="-1" rk="1" sh-0="4"/>
  <Value flg="400" vid="48" parent="-1" rk="1" sh-0="21"/>
  <Ravel vid="0" cells="²(A+D)-(¹F7²A)+((B+G)¹D7²D)¹F7²G+1¹25CB²G"/>
  <Ravel vid="1" cells="² "/>
  <Ravel vid="2" cells="² "/>
  <Ravel vid="3" cells="² "/>
  <Ravel vid="4" cells="² "/>
  <Ravel vid="5" cells="³0"/>
  <Ravel vid="6" cells="³-1"/>
  <Ravel vid="7" cells="³1"/>
  <Ravel vid="8" cells="³1"/>
  <Ravel vid="9" cells="³0"/>
  <Ravel vid="10" cells="³0³1"/>
  <Ravel vid="11" cells="³1"/>
  <Ravel vid="12" cells="³0³1"/>
  <Ravel vid="13" cells="³1³1"/>
  <Ravel vid="14" cells="³-2"/>
  <Ravel vid="15" cells="³1³1"/>
  <Ravel vid="16" cells="³-2"/>
  <Ravel vid="17" cells="³-1"/>
  <Ravel vid="18" cells="¹2190²+-¹D7¹F7¹3C¹2264²=¹2265²>¹2260¹2228¹2227²?¹220A
    ¹2374²~¹2191¹2193¹2373¹25CB²*¹235F¹2308¹230A¹22A5¹22A4²|"/>
  <Ravel vid="19" cells="²)"/>
  <Ravel vid="20" cells="³-1"/>
  <Ravel vid="21" cells="³0"/>
  <Ravel vid="22" cells="²("/>
  <Ravel vid="23" cells="³1"/>
  <Ravel vid="24" cells="³0"/>
  <Ravel vid="25" cells="³1"/>
  <Ravel vid="26" cells="³0"/>
  <Ravel vid="27" cells="³1"/>
  <Ravel vid="28" cells="³0"/>
  <Ravel vid="29" cells="³80"/>
  <Ravel vid="30" cells="³0"/>
  <Ravel vid="31" cells="² "/>
  <Ravel vid="32" cells="³10"/>
  <Ravel vid="33" cells="²C"/>
  <Ravel vid="34" cells="² "/>
  <Ravel vid="35" cells="³0"/>
  <Ravel vid="36" cells="³1"/>
  <Ravel vid="37" cells="².,¹22C6²0_¹AF"/>
  <Ravel vid="38" cells="⁴1e-13"/>
  <Ravel vid="39" cells="³0"/>
  <Ravel vid="40" cells="³1"/>
  <Ravel vid="41" cells="³0"/>
  <Ravel vid="42" cells="¹8¹D¹A
    "/>
  <Ravel vid="43" cells="³0"/>
  <Ravel vid="44" cells="³0"/>
  <Ravel vid="45" cells="³0"/>
  <Ravel vid="46" cells="¹0¹1¹2¹3¹4¹5¹6¹7¹8¹9¹A
    ¹B¹C¹D¹E¹F¹10¹11¹12¹13¹14¹15¹16¹17¹18¹19¹1A¹1B¹1C¹1D¹1E¹1F² !¹22²#$%¹26²'⁰
    ²()*+,-./0123456789:;¹3C²=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkl⁰
    ²mnopqrstuvwxyz{|}~¹7F¹A5¹20AC¹21C4¹2227¹223C¹226C¹22C6¹22F8¹2338¹233A
    ¹233C¹233E¹2341¹A1¹2344¹2345¹2395¹235E¹2339¹2346¹2364¹2347¹2348¹234A¹22A4
    ¹3BB¹234D¹234F¹A3¹22A5¹2376¹2336¹2350¹2351¹3C7¹2354¹2356¹2357¹2358¹235A
    ¹235B¹2308¹235C¹2362¹222A¹2368¹2355¹234E¹236C¹236A¹2223¹2502¹2524¹235F
    ¹2206¹2207¹2192¹2563¹2551¹2557¹255D¹2190¹230A¹2510¹2514¹2534¹252C¹251C
    ¹2500¹253C¹2191¹2193¹2554¹255A¹2569¹2566¹2560¹2550¹256C¹2261¹2378¹2377
    ¹2235¹2337¹2342¹233B¹22A2¹22A3¹25CA¹2518¹250C¹2588¹2584¹258C¹2590¹2580
    ¹237A¹2379¹2282¹2283¹235D¹2372¹2374¹2371¹233D¹2296¹25CB¹2228¹2373¹2349
    ¹2208¹2229¹233F¹2340¹2265¹2264¹2260¹D7¹F7¹2359¹2218¹2375¹236B¹234B¹2352¹AF
    ¹A8¹A0"/>
  <Ravel vid="47" cells="³-1³0³0³0"/>
  <Ravel vid="48" cells="²SystemVariable.cc:719"/>
  <SymbolTable size="14">
    <Symbol name="A" stack-size="1">
      <unused-name/>
    </Symbol>

    <Symbol name="B" stack-size="1">
      <unused-name/>
    </Symbol>

    <Symbol name="C" stack-size="1">
      <Function>
        <UCS uni="²Z¹2190²C E¹A
          ¹235D² Central operator¹A
          ²Z¹2190²E[CENTRALFN E]¹A
          "/>
      </Function>
    </Symbol>

    <Symbol name="CENTRALFN" stack-size="1">
      <Function>
        <UCS uni="²Z¹2190²CENTRALFN E¹A
          ¹235D² Index of operator of lexical level 0¹A
          ²Z¹2190²((FUNCTIONS E)¹2227²0=DEPTH E)¹2373²1¹A
          "/>
      </Function>
    </Symbol>

    <Symbol name="DEPTH" stack-size="1">
      <Function>
        <UCS uni="²Z¹2190²DEPTH E¹A
          ¹235D² Lexical level of expression¹A
          ²Z¹2190²+\(E='(')-0,¹AF²1¹2193²E=')'¹A
          "/>
      </Function>
    </Symbol>

    <Symbol name="E" stack-size="1">
      <unused-name/>
    </Symbol>

    <Symbol name="FUNCTIONS" stack-size="1">
      <Function>
        <UCS uni="²Z¹2190²FUNCTIONS E¹A
          ¹235D² Mask of operators in expression¹A
          ²Z¹2190²E¹220A²'¹2190²+-¹D7¹F7¹3C¹2264²=¹2265²>¹2260¹2228¹2227²?⁰
          ¹220A¹2374²~¹2191¹2193¹2373¹25CB²*¹235F¹2308¹230A¹22A5¹22A4²|'¹A
          "/>
      </Function>
    </Symbol>

    <Symbol name="L" stack-size="1">
      <Function>
        <UCS uni="²Z¹2190²L E¹A
          ¹235D² Left operand, taken up to central op¹A
          ²Z¹2190²(¹AF²1+CENTRALFN E)¹2191²E¹A
          "/>
      </Function>
    </Symbol>

    <Symbol name="ON" stack-size="1">
      <Function>
        <UCS uni="²Z¹2190²A ON B¹A
          ¹235D² Utility function stacking 2 strings¹A
          ²A¹2190²(¹AF²2¹2191²1 1,¹2374²A)¹2374²A¹A
          ²B¹2190²(¹AF²2¹2191²1 1,¹2374²B)¹2374²B¹A
          ²Z¹2190²(((¹2374²A)¹2308²0 1¹D7¹2374²B)¹2191²A),[1]((¹2374²B)¹2308²0⁰
          ² 1¹D7¹2374²A)¹2191²B¹A
          "/>
      </Function>
    </Symbol>

    <Symbol name="PARSE" stack-size="1">
      <Function>
        <UCS uni="²Z¹2190²PARSE E¹A
          ¹235D² Expression represented as a fallen tree¹A
          ¹235D² Right expression on top of central operator on top of left o⁰
          ²perator¹A
          ¹2192²0¹D7¹2373¹2227²/~FUNCTIONS Z¹2190²STRIP E¹A
          ²Z¹2190²(' ',' ',PARSE R Z)ON(C Z)ON' ',' ',PARSE L Z¹A
          "/>
      </Function>
    </Symbol>

    <Symbol name="R" stack-size="1">
      <Function>
        <UCS uni="²Z¹2190²R E¹A
          ¹235D² Right operand by dropping beginning up to and including cent⁰
          ²ral operator¹A
          ²Z¹2190²(CENTRALFN E)¹2193²E¹A
          "/>
      </Function>
    </Symbol>

    <Symbol name="S3" stack-size="1">
      <Variable vid="0"/>
    </Symbol>

    <Symbol name="STRIP" stack-size="1">
      <Function>
        <UCS uni="²Z¹2190²STRIP E¹A
          ¹235D² Remove wrapping parentheses¹A
          ¹2192²0¹D7¹2373²1¹2260¹230A²/DEPTH Z¹2190²E¹A
          ²Z¹2190²STRIP 1¹2193¹AF²1¹2193²E¹A
          "/>
      </Function>
    </Symbol>

    <Symbol name="Z" stack-size="1">
      <unused-name/>
    </Symbol>

  </SymbolTable>

  <Symbol name="⎕AI" stack-size="1">
    <Variable vid="47"/>
  </Symbol>

  <Symbol name="⎕ARG" stack-size="1">
    <unused-name/>
  </Symbol>

  <Symbol name="⎕AV" stack-size="1">
    <Variable vid="46"/>
  </Symbol>

  <Symbol name="⎕EM" stack-size="1">
    <unused-name/>
  </Symbol>

  <Symbol name="⎕ET" stack-size="1">
    <unused-name/>
  </Symbol>

  <Symbol name="⎕LC" stack-size="1">
    <Variable vid="45"/>
  </Symbol>

  <Symbol name="⎕PT" stack-size="1">
    <Variable vid="44"/>
  </Symbol>

  <Symbol name="⎕SVE" stack-size="1">
    <Variable vid="43"/>
  </Symbol>

  <Symbol name="⎕TC" stack-size="1">
    <Variable vid="42"/>
  </Symbol>

  <Symbol name="⎕TS" stack-size="1">
    <Variable vid="41"/>
  </Symbol>

  <Symbol name="⎕UL" stack-size="1">
    <Variable vid="40"/>
  </Symbol>

  <Symbol name="⎕WA" stack-size="1">
    <Variable vid="39"/>
  </Symbol>

  <Symbol name="⎕CT" stack-size="1">
    <Variable vid="38"/>
  </Symbol>

  <Symbol name="⎕FC" stack-size="1">
    <Variable vid="37"/>
  </Symbol>

  <Symbol name="⎕IO" stack-size="1">
    <Variable vid="36"/>
  </Symbol>

  <Symbol name="⎕L" stack-size="1">
    <Variable vid="35"/>
  </Symbol>

  <Symbol name="⎕LX" stack-size="1">
    <Variable vid="34"/>
  </Symbol>

  <Symbol name="⎕NLT" stack-size="1">
    <Variable vid="33"/>
  </Symbol>

  <Symbol name="⎕PP" stack-size="1">
    <Variable vid="32"/>
  </Symbol>

  <Symbol name="⎕PR" stack-size="1">
    <Variable vid="31"/>
  </Symbol>

  <Symbol name="⎕PS" stack-size="1">
    <Variable vid="30"/>
  </Symbol>

  <Symbol name="⎕PW" stack-size="1">
    <Variable vid="29"/>
  </Symbol>

  <Symbol name="⎕R" stack-size="1">
    <Variable vid="28"/>
  </Symbol>

  <Symbol name="⎕RL" stack-size="1">
    <Variable vid="27"/>
  </Symbol>

  <Symbol name="⎕SYL" stack-size="1">
    <Variable vid="26"/>
  </Symbol>

  <Symbol name="⎕TZ" stack-size="1">
    <Variable vid="25"/>
  </Symbol>

  <Symbol name="⍺" stack-size="1">
    <unused-name/>
  </Symbol>

  <Symbol name="⍶" stack-size="1">
    <unused-name/>
  </Symbol>

  <Symbol name="χ" stack-size="1">
    <unused-name/>
  </Symbol>

  <Symbol name="λ" stack-size="1">
    <unused-name/>
  </Symbol>

  <Symbol name="⍵" stack-size="1">
    <unused-name/>
  </Symbol>

  <Symbol name="⍹" stack-size="1">
    <unused-name/>
  </Symbol>

  <StateIndicator levels="0">
  </StateIndicator>

</Workspace>

⍝
⍝ Iverson's examples from 'APL IN EXPOSITION'
⍝
[0]∇ Z←C E
[1] Z←E[CENTRALFN E]
[2]∇
⍝
[0]∇ Z←CENTRALFN E
[1] Z←((FUNCTIONS E)∧0=DEPTH E)⍳1
[2]∇
⍝
[0]∇ Z←DEPTH E
[1] Z←+\(E='(')-0,¯1↓E=')'
[2]∇
⍝
[0]∇ Z←FUNCTIONS E
[1] Z←E∊'←+-×÷<≤=≥>≠∨∧?∊⍴~↑↓⍳○*⍟⌈⌊⊥⊤|'
⍝
[0]∇ Z←L E
[1] Z←(¯1+CENTRALFN E)↑E
[2]∇
⍝
[0]∇ Z←A ON B
[1] A←(¯2↑1 1,⍴A)⍴A
[2] B←(¯2↑1 1,⍴B)⍴B
[3] Z←(((⍴A)⌈0 1×⍴B)↑A),[1]((⍴B)⌈0 1×⍴A)↑B
[4]∇
⍝
[0]∇ Z←STRIP E
[1] →0×⍳1≠⌊/DEPTH Z←E
[2] Z←STRIP 1↓¯1↓E
[3]∇
⍝
[0]∇ Z←PARSE E
[1] →0×⍳∧/~FUNCTIONS Z←STRIP E
[2] Z←(' ',' ',PARSE R Z)ON(C Z)ON' ',' ',PARSE L Z
[3] ∇
⍝
[0] Z←R E
[1] Z←(CENTRALFN E)↓E
[2]∇
 
⍝ Exemple of an expression
S3←'(A+D)-(÷A)+((B+G)×D)÷G+1○G' 
⍝
⍝ Iverson's examples from 'APL IN EXPOSITION'
⍝
∇ Z←C E
⍝ Central operator
Z←E[CENTRALFN E]
∇
⍝
∇ Z←CENTRALFN E
⍝ Index of operator of lexical level 0
Z←((FUNCTIONS E)∧0=DEPTH E)⍳1
∇
⍝
∇ Z←DEPTH E
⍝ Lexical level of expression
Z←+\(E='(')-0,¯1↓E=')'
∇
⍝
∇ Z←FUNCTIONS E
⍝ Mask of operators in expression
Z←E∊'←+-×÷<≤=≥>≠∨∧?∊⍴~↑↓⍳○*⍟⌈⌊⊥⊤|'
∇
⍝
∇ Z←L E
⍝ Left operand, taken up to central op
Z←(¯1+CENTRALFN E)↑E
∇
⍝
∇ Z←A ON B
⍝ Utility function stacking 2 strings
A←(¯2↑1 1,⍴A)⍴A
B←(¯2↑1 1,⍴B)⍴B
Z←(((⍴A)⌈0 1×⍴B)↑A),[1]((⍴B)⌈0 1×⍴A)↑B
∇
⍝
∇ Z←STRIP E
⍝ Remove wrapping parentheses
→0×⍳1≠⌊/DEPTH Z←E
Z←STRIP 1↓¯1↓E
∇
⍝
∇ Z←PARSE E
⍝ Expression represented as a fallen tree
⍝ Right expression on top of central operator on top of left operator
→0×⍳∧/~FUNCTIONS Z←STRIP E
Z←(' ',' ',PARSE R Z)ON(C Z)ON' ',' ',PARSE L Z
∇
⍝
∇ Z←R E
⍝ Right operand by dropping beginning up to and including central operator
Z←(CENTRALFN E)↓E
∇
⍝ Example of a parsing
S3←'(A+D)-(÷A)+((B+G)×D)÷G+1○G'
⍝
PARSE '(A+B)'
⍝


Reply via email to