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)'
⍝