diff options
| -rw-r--r-- | compiler/elymasAsm.ey | 67 | ||||
| -rw-r--r-- | compiler/elymasAsmLib.ey | 488 | ||||
| -rw-r--r-- | compiler/elymasGlobal.ey | 56 | ||||
| l--------- | examples/working-compiler/bor.test | 1 | ||||
| l--------- | examples/working-compiler/elymas.ey | 1 | ||||
| l--------- | examples/working-compiler/elymasAsm.ey | 1 | ||||
| l--------- | examples/working-compiler/elymasAsmLib.ey | 1 | ||||
| l--------- | examples/working-compiler/elymasGlobal.ey | 1 | ||||
| l--------- | examples/working-compiler/exec.test | 1 | ||||
| l--------- | examples/working-compiler/int.test | 1 | ||||
| l--------- | examples/working-compiler/len.test | 1 | ||||
| l--------- | examples/working-compiler/loop.test | 1 | ||||
| l--------- | examples/working-compiler/scoping.test | 1 | ||||
| l--------- | examples/working-compiler/stackops.test | 1 | ||||
| l--------- | examples/working-compiler/standard.ey | 1 | ||||
| l--------- | examples/working-compiler/string.test | 1 | ||||
| -rw-r--r-- | examples/working/len.ey | 2 | ||||
| -rw-r--r-- | examples/working/scoping.ey | 1 |
18 files changed, 412 insertions, 215 deletions
diff --git a/compiler/elymasAsm.ey b/compiler/elymasAsm.ey index f3a655e..e44eb85 100644 --- a/compiler/elymasAsm.ey +++ b/compiler/elymasAsm.ey @@ -96,8 +96,8 @@ } /sib deff { _ 0 ge assert 8 { _ 256 mod -01 256 div } rep -- } /imm64 deff - { _ 0 ge assert 4 { _ 256 mod -01 256 div } rep -- } /imm32 deff - { _ 0 ge assert 2 { _ 256 mod -01 256 div } rep -- } /imm16 deff + { _ 0 lt { 4294967296 add } rep 4294967295 band 4 { _ 256 mod -01 256 div } rep -- } /imm32 deff + { _ 0 lt { 65536 add } rep 65535 band 2 { _ 256 mod -01 256 div } rep -- } /imm16 deff { _ 0 lt { 256 add } rep 255 band } /imm8 deff # label handling @@ -118,6 +118,26 @@ [ -011 len dearray %00 } /labelRel8 deff + { ==l + ] _ len ==offset + labelHoles [ { + labels l . offset 2 add sub + _ 32768 lt assert + _ 32768 neg ge assert + imm16 offset [ 0 1 ] add 2 dearray -204314 =[] =[] } ] cat =labelHoles + [ -011 len dearray %00 %00 + } /labelRel16 deff + + { ==l + ] _ len ==offset + labelHoles [ { + labels l . offset 4 add sub + _ 2147483648 lt assert + _ 2147483648 neg ge assert + imm32 offset [ 0 1 2 3 ] add 4 dearray -408518628738 =[] =[] =[] =[] } ] cat =labelHoles + [ -011 len dearray %00 %00 %00 %00 + } /labelRel32 deff + { ==opcodes labelHoles { opcodes -01 * } each @@ -144,7 +164,7 @@ _ 128 lt assert } name "Lbl8" cat > -- 2 |deff rep - }' /defJmp deff + }' /defJmpRel8 deff # instructions { ==reg ==mem @@ -216,6 +236,11 @@ src dst modrm11 } /andqRegReg deff + { ==lbl + %E8 + lbl labelRel32 + } /callLbl32 deff + { ==reg reg bit64assert @@ -364,18 +389,22 @@ /zero reg modrm11 } /incqReg deff - %E2 /loop defJmp + %E2 /loop defJmpRel8 - %EB /jmp defJmp + %EB /jmp defJmpRel8 + { ==lbl + %E9 + lbl labelRel32 + } /jmpLbl32 deff - %72 /jb defJmp - %76 /jbe defJmp - %74 /je defJmp - %7E /jle defJmp - %73 /jnb defJmp - %75 /jne defJmp - %75 /jnz defJmp - %74 /jz defJmp + %72 /jb defJmpRel8 + %76 /jbe defJmpRel8 + %74 /je defJmpRel8 + %7E /jle defJmpRel8 + %73 /jnb defJmpRel8 + %75 /jne defJmpRel8 + %75 /jnz defJmpRel8 + %74 /jz defJmpRel8 { ==reg ==mem ==disp reg bit64assert @@ -442,6 +471,18 @@ i imm32 } /movlImmMem deff + { ==mem ==disp ==i + mem bit64assert + disp 128 lt assert + i 65536 65536 mul lt assert + + mem regno %07 gt { 0 /none /none mem rex } rep + %C7 + /zero mem modrm01 + disp imm8 + i imm32 + } /movlImmMemDisp8 deff + { ==reg ==mem reg bit32assert mem bit64assert diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey index f823c45..ff0d34b 100644 --- a/compiler/elymasAsmLib.ey +++ b/compiler/elymasAsmLib.ey @@ -38,6 +38,21 @@ [ %00 %00 %00 %00 %00 %00 %00 %00 ] ==currentQuoted > { defv }' allocateOffsetStruct + { _ =*array len _ 4 div ==largeMoves + 4 mod ==smallMoves + 0 ==i + largeMoves { + i _ 4 add =i + _ [ 3 2 1 0 ] add array { -01 256 mul add } fold -01 /rdi :movlImmMemDisp8 + } rep + i /rdi :addqImm8Reg + smallMoves { + i _ 1 add =i + array /rdi :movbImmMem + /rdi :incqReg + } rep + } /loadToRdi deff + # internal functions, ABI follows SysV standards # compare two strings @@ -269,6 +284,31 @@ ] /internalAllocateArray defv > { defv }' allocateOffsetStruct + # FIXME: open a new function scope + [ + 8 /r15 :subqImm8Reg + /r15 :popqMem + 8 /r15 :subqImm8Reg + currentScope /rbx :movqImmReg + /rbx /rsi :movqMemReg + /rsi /r15 :movqRegMem + ] _ /unscopingFunctionHeader defv [ + 8 /rdi :movqImmReg + internalAllocateScope /rax :movqImmReg + /rax :callqReg + /rax /rbx :movqRegMem + ] cat /scopingFunctionHeader defv + + [ + /r15 /rcx :movqMemReg + currentScope /rax :movqImmReg + /rcx /rax :movqRegMem + 8 /r15 :addqImm8Reg + /r15 :pushqMem + 8 /r15 :addqImm8Reg + :retn + ] /functionFooter defv + # elymas functions, stack based ABI 1 ==ARRAYMARKER @@ -458,15 +498,18 @@ /rdx :popqReg + # save current scope + currentScope /rax :movqImmReg + /rax /rsi :movqMemReg + 8 /r15 :subqImm8Reg + /rsi /r15 :movqRegMem + # enter scope 8 /rdx /rcx :movqMemDisp8Reg /rcx /rcx :testqRegReg - /scoped :jnzLbl8 - currentScope /rax :movqImmReg - /rax /rcx :movqMemReg - @scoped - 8 /r15 :subqImm8Reg - /rcx /r15 :movqRegMem + /unscoped :jzLbl8 + /rcx /rax :movqRegMem + @unscoped # handle typed function 16 /rdx /rcx :movqMemDisp8Reg @@ -545,9 +588,195 @@ 8 /r15 :addqImm8Reg :retn ] :labelResolve /ey] defv + + # length of array or string + # 0 -> array / string + # 0 <- number of elements / characters + [ + 8 /r15 :subqImm8Reg + /r15 :popqMem + + /rax :popqReg + 7 /rax /cl :movbMemDisp8Reg + %F0 /cl :andbImmReg + %10 /cl :cmpbImmReg + /stringLen :jeLbl8 + %70 /cl :cmpbImmReg + /arrayLen :jeLbl8 + + # TODO "neither string nor array in len" + :ud2 + + @arrayLen + /rax /rcx :movqMemReg + 8 /rcx :shlqImm8Reg # clear type bits + 11 /rcx :shrqImm8Reg # divide by 8 + /rcx :decqReg # substract header size + /done :jmpLbl8 + + @stringLen + 16 /rax /rcx :movqMemDisp8Reg + + @done + /rcx :pushqReg + + /r15 :pushqMem + 8 /r15 :addqImm8Reg + :retn + ] :labelResolve /eylen defv > _ ==globalFunctions { defv }' allocateOffsetStruct < + < + # resolve identifier according to current scope and quote mode and act accordingly + # 0 -> identifier to resolve + [ + 8 /r15 :subqImm8Reg + /r15 :popqMem + + /selfBegin :callLbl32 + ] _ len ==internalExecuteHeaderLen [ -011 len dearray + @selfBegin + /rax :popqReg + internalExecuteHeaderLen /rax :subqImm8Reg + 8 /r15 :subqImm8Reg + /rax /r15 :movqRegMem # store entry into this function + + 8 /r15 :subqImm8Reg + /r15 :popqMem # store identifier + + # scope resolution + currentScope /rdi :movqImmReg + /rdi /rdi :movqMemReg + /r15 /rsi :movqMemReg + internalResolve /rax :movqImmReg + /rax :callqReg + + /rax /rax :testqRegReg + /unresolved :jzLbl8 + /rax :pushqReg + + 0 /rdx :cmpqImm8Reg + /inactive :jzLbl8 + 1 /rdx :cmpqImm8Reg + /active :jzLbl8 + 2 /rdx :cmpqImm8Reg + /quoteActive :jzLbl8 + + # TODO: "invalid activation mode" + :ud2 + + @unresolved + currentQuoted /rax :movqImmReg + /rax /rax :movqMemReg + /rax /rax :testqRegReg + /constructQuotedResolve :jnzLbl8 + + # TODO: "unresolved name while unquoted" + :ud2 + + @quoteActive + |ey* /rax :movqImmReg + /rax :callqReg + /done :jmpLbl8 + + @active + currentQuoted /rax :movqImmReg + /rax /rax :movqMemReg + /rax /rax :testqRegReg + /activeQuoted :jnzLbl8 + |ey* /rax :movqImmReg + /rax :callqReg + /done :jmpLbl8 + + @activeQuoted + # FIXME: actually, this should re-resolve as if unresolved + /done :jmpLbl8 + + @inactive + currentQuoted /rax :movqImmReg + /rax /rax :movqMemReg + /rax /rax :testqRegReg + /constructQuotedResolve :jnzLbl8 + + @done + 16 /r15 :addqImm8Reg + /r15 :pushqMem + 8 /r15 :addqImm8Reg + :retn + + @constructQuotedResolve + # construct non-capturing function which + :quoteEncodingBuffer /rdi :movqImmReg + unscopingFunctionHeader loadToRdi + + # 1. pushes identifier + [ /rax :movqImmOOBReg ] _ len 2 eq assert + 2 dearray 256 mul add + /rdi :movwImmMem + /r15 /rsi :movqMemReg + /rsi 2 /rdi :movqRegMemDisp8 + 10 /rdi :addqImm8Reg + + [ + /rax :pushqReg + + # 2. resets to non-quoted mode + 8 /r15 :subqImm8Reg + currentQuoted /rax :movqImmReg + /rax /rcx :movqMemReg + /rcx /r15 :movqRegMem + /rcx /rcx :xorqRegReg + /rcx /rax :movqRegMem + # 3. resolves identifier action + /rax :movqImmOOBReg + ] loadToRdi + 8 /r15 /rax :movqMemDisp8Reg + /rax /rdi :movqRegMem + 8 /rdi :addqImm8Reg + [ + /rax :callqReg + # 4. restores quote mode + /r15 /rcx :movqMemReg + currentQuoted /rax :movqImmReg + /rcx /rax :movqRegMem + 8 /r15 :addqImm8Reg + ] functionFooter cat loadToRdi + + :quoteEncodingBuffer /rax :movqImmReg + /rax /rdi :subqRegReg + /rdi :pushqReg # store opcode byte count + + /rdi :decqReg + 3 /rdi :shrqImm8Reg + /rdi :incqReg + 3 /rdi :shlqImm8Reg + internalAllocateCode /rax :movqImmReg + /rax :callqReg + + # rax == code block on heap + + # copy opcodes + :quoteEncodingBuffer /rsi :movqImmReg + 8 /rax /rdi :leaqMemDisp8Reg + /rcx :popqReg + :reprcx :movsb + + # create function object + /rax /rdi :movqRegReg + /rsi /rsi :xorqRegReg + /rdx /rdx :xorqRegReg + internalAllocateFunction /rax :movqImmReg + /rax :callqReg + + # rax == function object on heap + /rax :pushqReg + /done :jmpLbl32 + ] :labelResolve + > -- /internalExecuteIdentifier defv + > { defv }' allocateOffsetStruct + + < # drop top stack element [ /rax :popqReg @@ -722,164 +951,128 @@ :retn ] /ey{ defv - < - # FIXME: open a new function scope - [ - 8 /r15 :subqImm8Reg - /r15 :popqMem - 8 /r15 :subqImm8Reg - currentScope /rax :movqImmReg - /rax /rax :movqMemReg - /rax /r15 :movqRegMem - ] /functionHeader defv - - [ - /r15 /rcx :movqMemReg - currentScope /rax :movqImmReg - /rcx /rax :movqRegMem - 8 /r15 :addqImm8Reg - /r15 :pushqMem - 8 /r15 :addqImm8Reg - :retn - ] /functionFooter defv - - { _ =*array len _ 4 div ==largeMoves - 4 mod ==smallMoves - 0 ==i - largeMoves { - i _ 4 add =i - [ 3 2 1 0 ] add array { -01 256 mul add } fold /rdi :movlImmMem - 4 /rdi :addqImm8Reg - } rep - smallMoves { - i _ 1 add =i - array /rdi :movbImmMem - /rdi :incqReg - } rep - } /loadToRdi deff - - # quote construction, create function from begin marker onwards - [ - 8 /r15 :subqImm8Reg - /r15 :popqMem - - currentQuoted /rcx :movqImmReg - /rcx :decqMem - - QUOTEMARKER /rcx :movqImmReg - /rcx :pushqReg - /rsp /rdx :movqRegReg - @backwardsSearch - 8 /rdx :addqImm8Reg - /rdx /rcx :cmpqMemReg - /backwardsSearch :jneLbl8 - - /rdx :pushqReg # store address of begin marker - - :quoteEncodingBuffer /rdi :movqImmReg + # quote construction, create function from begin marker onwards + [ + 8 /r15 :subqImm8Reg + /r15 :popqMem - functionHeader loadToRdi + currentQuoted /rcx :movqImmReg + /rcx :decqMem - @search - 8 /rdx :subqImm8Reg - /rdx /rcx :cmpqMemReg - /markerFound :jeLbl8 + QUOTEMARKER /rcx :movqImmReg + /rcx :pushqReg + /rsp /rdx :movqRegReg + @backwardsSearch + 8 /rdx :addqImm8Reg + /rdx /rcx :cmpqMemReg + /backwardsSearch :jneLbl8 - /rdx /rsi :movqMemReg - 7 /rsi /al :movbMemDisp8Reg - %F0 /al :andbImmReg - /immediateFound :jzLbl8 - %50 /al :cmpbImmReg - /functionFound :jzLbl8 - %70 /al :cmpbImmReg - /arrayFound :jzLbl8 - - # TODO: "invalid object during quote construction" - :ud2 + /rdx :pushqReg # store address of begin marker - @immediateFound - [ /rax :movqImmOOBReg ] _ len 2 eq assert - 2 dearray 256 mul add - /rdi :movwImmMem - /rsi 2 /rdi :movqRegMemDisp8 - [ /rax :pushqReg ] _ len 1 eq assert - 1 dearray - 10 /rdi :movbImmMemDisp8 - 11 /rdi :addqImm8Reg - /search :jmpLbl8 + :quoteEncodingBuffer /rdi :movqImmReg + scopingFunctionHeader loadToRdi - @functionFound - [ /rax :movqImmOOBReg ] _ len 2 eq assert - 2 dearray 256 mul add - /rdi :movwImmMem - /rsi 2 /rdi :movqRegMemDisp8 - [ /rax :pushqReg ] _ len 1 eq assert - 1 dearray - 10 /rdi :movbImmMemDisp8 - 11 /rdi :addqImm8Reg - [ - |ey* /rax :movqImmReg - /rax :callqReg - ] loadToRdi - /search :jmpLbl8 + @search + 8 /rdx :subqImm8Reg + /rdx /rcx :cmpqMemReg + /markerFound :jeLbl8 + + /rdx /rsi :movqMemReg + 7 /rsi /al :movbMemDisp8Reg + %F0 /al :andbImmReg + /immediateFound :jzLbl8 + %10 /al :cmpbImmReg + /immediateFound :jzLbl8 + %50 /al :cmpbImmReg + /functionFound :jzLbl8 + %70 /al :cmpbImmReg + /arrayFound :jzLbl8 + + # TODO: "invalid object during quote construction" + :ud2 + + @immediateFound + [ /rax :movqImmOOBReg ] _ len 2 eq assert + 2 dearray 256 mul add + /rdi :movwImmMem + /rsi 2 /rdi :movqRegMemDisp8 + [ /rax :pushqReg ] _ len 1 eq assert + 1 dearray + 10 /rdi :movbImmMemDisp8 + 11 /rdi :addqImm8Reg + /search :jmpLbl8 + + @functionFound + [ /rax :movqImmOOBReg ] _ len 2 eq assert + 2 dearray 256 mul add + /rdi :movwImmMem + /rsi 2 /rdi :movqRegMemDisp8 + [ /rax :pushqReg ] _ len 1 eq assert + 1 dearray + 10 /rdi :movbImmMemDisp8 + 11 /rdi :addqImm8Reg + [ + |ey* /rax :movqImmReg + /rax :callqReg + ] loadToRdi + /search :jmpLbl8 - @arrayFound - # FIXME allow macros to put byte arrays into quoted contexts and thereby generate assembly - :ud2 - /search :jmpLbl8 + @arrayFound + # FIXME allow macros to put byte arrays into quoted contexts and thereby generate assembly + :ud2 + /search :jmpLbl8 - @markerFound + @markerFound - functionFooter loadToRdi + functionFooter loadToRdi - :quoteEncodingBuffer /rax :movqImmReg - /rax /rdi :subqRegReg - /rdi :pushqReg # store opcode byte count + :quoteEncodingBuffer /rax :movqImmReg + /rax /rdi :subqRegReg + /rdi :pushqReg # store opcode byte count - /rdi :decqReg - 3 /rdi :shrqImm8Reg - /rdi :incqReg - 3 /rdi :shlqImm8Reg - internalAllocateCode /rax :movqImmReg - /rax :callqReg + /rdi :decqReg + 3 /rdi :shrqImm8Reg + /rdi :incqReg + 3 /rdi :shlqImm8Reg + internalAllocateCode /rax :movqImmReg + /rax :callqReg - # rax == code block on heap + # rax == code block on heap - # copy opcodes - :quoteEncodingBuffer /rsi :movqImmReg - 8 /rax /rdi :leaqMemDisp8Reg - /rcx :popqReg - :reprcx :movsb + # copy opcodes + :quoteEncodingBuffer /rsi :movqImmReg + 8 /rax /rdi :leaqMemDisp8Reg + /rcx :popqReg + :reprcx :movsb - # create function object - /rax /rdi :movqRegReg - currentScope /rax :movqImmReg - /rax /rsi :movqMemReg - /rdx /rdx :xorqRegReg - internalAllocateFunction /rax :movqImmReg - /rax :callqReg + currentQuoted /rcx :movqImmReg + /rcx /rcx :movqMemReg + /rcx /rcx :testqRegReg + /quoted :jnzLbl8 - # rax == function object on heap + # create function object + /rax /rdi :movqRegReg + currentScope /rax :movqImmReg + /rax /rsi :movqMemReg + /rdx /rdx :xorqRegReg + internalAllocateFunction /rax :movqImmReg + /rax :callqReg - # store function instead of begin marker - /rdx :popqReg - /rax /rdx :movqRegMem - /rdx /rsp :movqRegReg # and drop quoted stuff from stack + # rax == function object on heap - currentQuoted /rcx :movqImmReg - /rcx /rcx :movqMemReg - /rcx /rcx :testqRegReg - /unquoted :jzLbl8 + # store function instead of begin marker + /rdx :popqReg + /rax /rdx :movqRegMem + /rdx /rsp :movqRegReg # and drop quoted stuff from stack - :ud2 - # FIXME: quote once more + /r15 :pushqMem + 8 /r15 :addqImm8Reg + :retn - @unquoted - /r15 :pushqMem - 8 /r15 :addqImm8Reg - :retn - ] :labelResolve - > -- /ey} defv + @quoted + # FIXME: quote once more + :ud2 + ] :labelResolve /ey} defv > _ ==globalMacros { defv }' allocateOffsetStruct { strToUTF8Bytes _ =*v len _ ==exactLength @@ -931,8 +1124,7 @@ { ==name # create function name | 8 sub /rdi :movqImmReg - currentScope /rsi :movqImmReg - /rsi /rsi :movqMemReg + /rsi /rsi :xorqRegReg # library functions don't have a captured scope # TODO: put a type here where applicable /rdx /rdx :xorqRegReg diff --git a/compiler/elymasGlobal.ey b/compiler/elymasGlobal.ey index 64f943a..3a42376 100644 --- a/compiler/elymasGlobal.ey +++ b/compiler/elymasGlobal.ey @@ -40,61 +40,9 @@ { .value ::constStringCode [ - # scope resolution - ::currentScope /rdi :movqImmReg - /rdi /rdi :movqMemReg - /rsi :popqReg - ::internalResolve /rax :movqImmReg + ::internalExecuteIdentifier /rax :movqImmReg /rax :callqReg - - /rax /rax :testqRegReg - /unresolved :jzLbl8 - /rax :pushqReg - - 0 /rdx :cmpqImm8Reg - /inactive :jzLbl8 - 1 /rdx :cmpqImm8Reg - /active :jzLbl8 - 2 /rdx :cmpqImm8Reg - /quoteActive :jzLbl8 - :ud2 - - @unresolved - :ud2 - - @quoteActive - ::ey* /rax :movqImmReg - /rax :callqReg - /done :jmpLbl8 - - @active - ::currentQuoted /rax :movqImmReg - /rax /rax :movqMemReg - /rax /rax :testqRegReg - /activeQuoted :jnzLbl8 - ::ey* /rax :movqImmReg - /rax :callqReg - /done :jmpLbl8 - - @activeQuoted - # FIXME: actually, this should re-resolve as if unresolved - /done :jmpLbl8 - - @inactive - ::currentQuoted /rax :movqImmReg - /rax /rax :movqMemReg - /rax /rax :testqRegReg - /inactiveQuoted :jnzLbl8 - /done :jmpLbl8 - - @inactiveQuoted - :ud2 - -# ::ey* /rax :movqImmReg -# /rax :callqReg - - @done - ] :labelResolve cat :execute + ] cat :execute } /TOKID > -- 3 |defv rep diff --git a/examples/working-compiler/bor.test b/examples/working-compiler/bor.test new file mode 120000 index 0000000..cf9e7c1 --- /dev/null +++ b/examples/working-compiler/bor.test @@ -0,0 +1 @@ +../working/bor.ey
\ No newline at end of file diff --git a/examples/working-compiler/elymas.ey b/examples/working-compiler/elymas.ey new file mode 120000 index 0000000..b512696 --- /dev/null +++ b/examples/working-compiler/elymas.ey @@ -0,0 +1 @@ +../../compiler/elymas.ey
\ No newline at end of file diff --git a/examples/working-compiler/elymasAsm.ey b/examples/working-compiler/elymasAsm.ey new file mode 120000 index 0000000..7974413 --- /dev/null +++ b/examples/working-compiler/elymasAsm.ey @@ -0,0 +1 @@ +../../compiler/elymasAsm.ey
\ No newline at end of file diff --git a/examples/working-compiler/elymasAsmLib.ey b/examples/working-compiler/elymasAsmLib.ey new file mode 120000 index 0000000..592d6e8 --- /dev/null +++ b/examples/working-compiler/elymasAsmLib.ey @@ -0,0 +1 @@ +../../compiler/elymasAsmLib.ey
\ No newline at end of file diff --git a/examples/working-compiler/elymasGlobal.ey b/examples/working-compiler/elymasGlobal.ey new file mode 120000 index 0000000..5aa3f7b --- /dev/null +++ b/examples/working-compiler/elymasGlobal.ey @@ -0,0 +1 @@ +../../compiler/elymasGlobal.ey
\ No newline at end of file diff --git a/examples/working-compiler/exec.test b/examples/working-compiler/exec.test new file mode 120000 index 0000000..c4a9b19 --- /dev/null +++ b/examples/working-compiler/exec.test @@ -0,0 +1 @@ +../working/exec.ey
\ No newline at end of file diff --git a/examples/working-compiler/int.test b/examples/working-compiler/int.test new file mode 120000 index 0000000..8df4a31 --- /dev/null +++ b/examples/working-compiler/int.test @@ -0,0 +1 @@ +../working/int.ey
\ No newline at end of file diff --git a/examples/working-compiler/len.test b/examples/working-compiler/len.test new file mode 120000 index 0000000..8dde47d --- /dev/null +++ b/examples/working-compiler/len.test @@ -0,0 +1 @@ +../working/len.ey
\ No newline at end of file diff --git a/examples/working-compiler/loop.test b/examples/working-compiler/loop.test new file mode 120000 index 0000000..7839f4f --- /dev/null +++ b/examples/working-compiler/loop.test @@ -0,0 +1 @@ +../working/loop.ey
\ No newline at end of file diff --git a/examples/working-compiler/scoping.test b/examples/working-compiler/scoping.test new file mode 120000 index 0000000..7d79243 --- /dev/null +++ b/examples/working-compiler/scoping.test @@ -0,0 +1 @@ +../working/scoping.ey
\ No newline at end of file diff --git a/examples/working-compiler/stackops.test b/examples/working-compiler/stackops.test new file mode 120000 index 0000000..1b1f227 --- /dev/null +++ b/examples/working-compiler/stackops.test @@ -0,0 +1 @@ +../working/stackops.ey
\ No newline at end of file diff --git a/examples/working-compiler/standard.ey b/examples/working-compiler/standard.ey new file mode 120000 index 0000000..e7b7e7b --- /dev/null +++ b/examples/working-compiler/standard.ey @@ -0,0 +1 @@ +../../compiler/standard.ey
\ No newline at end of file diff --git a/examples/working-compiler/string.test b/examples/working-compiler/string.test new file mode 120000 index 0000000..bf7bb28 --- /dev/null +++ b/examples/working-compiler/string.test @@ -0,0 +1 @@ +../working/string.ey
\ No newline at end of file diff --git a/examples/working/len.ey b/examples/working/len.ey new file mode 100644 index 0000000..616ab8f --- /dev/null +++ b/examples/working/len.ey @@ -0,0 +1,2 @@ +"abcdef" len dump +[ 1 2 3 4 ] len dump diff --git a/examples/working/scoping.ey b/examples/working/scoping.ey new file mode 100644 index 0000000..102f824 --- /dev/null +++ b/examples/working/scoping.ey @@ -0,0 +1 @@ +42 { /i defv i } * dump |
