61 lines
2.3 KiB
Text
61 lines
2.3 KiB
Text
$ include "seed7_05.s7i";
|
|
|
|
const proc: snusp (in string: sourceCode, in integer: memSize, inout file: input, inout file: output) is func
|
|
local
|
|
var array string: instructions is 0 times "";
|
|
var array char: memory is 0 times ' ';
|
|
var integer: dataPointer is 1;
|
|
var integer: instrPtrRow is 0;
|
|
var integer: instrPtrColumn is 0;
|
|
var integer: rowDir is 0;
|
|
var integer: columnDir is 1;
|
|
var integer: helpDir is 0;
|
|
var integer: row is 0;
|
|
begin
|
|
instructions := split(sourceCode, "\n");
|
|
memory := memSize times '\0;';
|
|
|
|
for key row range instructions do
|
|
if pos(instructions[row], '$') <> 0 then
|
|
instrPtrRow := row;
|
|
instrPtrColumn := pos(instructions[row], '$');
|
|
end if;
|
|
end for;
|
|
|
|
while instrPtrRow >= 1 and instrPtrRow <= length(instructions) and
|
|
instrPtrColumn >= 1 and instrPtrColumn <= length(instructions[instrPtrRow]) do
|
|
case instructions[instrPtrRow][instrPtrColumn] of
|
|
when {'>'}: incr(dataPointer);
|
|
when {'<'}: decr(dataPointer);
|
|
when {'+'}: incr(memory[dataPointer]);
|
|
when {'-'}: decr(memory[dataPointer]);
|
|
when {'.'}: write(output, memory[dataPointer]);
|
|
when {','}: memory[dataPointer] := getc(input);
|
|
when {'/'}: helpDir := rowDir;
|
|
rowDir := -columnDir;
|
|
columnDir := -helpDir;
|
|
when {'\\'}: helpDir := rowDir;
|
|
rowDir := columnDir;
|
|
columnDir := helpDir;
|
|
when {'!'}: instrPtrRow +:= rowDir;
|
|
instrPtrColumn +:= columnDir;
|
|
when {'?'}: if memory[dataPointer] = '\0;' then
|
|
instrPtrRow +:= rowDir;
|
|
instrPtrColumn +:= columnDir;
|
|
end if;
|
|
end case;
|
|
instrPtrRow +:= rowDir;
|
|
instrPtrColumn +:= columnDir;
|
|
end while;
|
|
end func;
|
|
|
|
# SNUSP implementation of Hello World.
|
|
const string: helloWorld is "/++++!/===========?\\>++.>+.+++++++..+++\\\n\
|
|
\\\+++\\ | /+>+++++++>/ /++++++++++<<.++>./\n\
|
|
\$+++/ | \\+++++++++>\\ \\+++++.>.+++.-----\\\n\
|
|
\ \\==-<<<<+>+++/ /=.>.+>.--------.-/";
|
|
|
|
const proc: main is func
|
|
begin
|
|
snusp(helloWorld, 5, IN, OUT);
|
|
end func;
|