Added open bracket support. Also added a new example.
This commit is contained in:
parent
db025f648b
commit
272ab5d741
@ -15,7 +15,7 @@ public class StandardBrInterpreter : BrInterpreterBase
|
|||||||
|
|
||||||
protected int dataPointer;
|
protected int dataPointer;
|
||||||
protected Stack<long> stack;
|
protected Stack<long> stack;
|
||||||
protected Stack<(int, int)> debugStack;
|
protected Stack<(int, int)> debugOpeningStack;
|
||||||
|
|
||||||
private int lineNumber;
|
private int lineNumber;
|
||||||
private int charNumber;
|
private int charNumber;
|
||||||
@ -28,7 +28,7 @@ public class StandardBrInterpreter : BrInterpreterBase
|
|||||||
tape = new short[TapeLength];
|
tape = new short[TapeLength];
|
||||||
dataPointer = 0;
|
dataPointer = 0;
|
||||||
stack = [];
|
stack = [];
|
||||||
debugStack = [];
|
debugOpeningStack = [];
|
||||||
|
|
||||||
lineNumber = 1;
|
lineNumber = 1;
|
||||||
charNumber = 0;
|
charNumber = 0;
|
||||||
@ -39,8 +39,8 @@ public class StandardBrInterpreter : BrInterpreterBase
|
|||||||
awakeTop = Console.CursorTop;
|
awakeTop = Console.CursorTop;
|
||||||
if (Context.stepFlag)
|
if (Context.stepFlag)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 12; i++) Console.WriteLine();
|
for (int i = 0; i < 10; i++) Console.WriteLine();
|
||||||
awakeTop = Console.CursorTop - 12;
|
awakeTop = Console.CursorTop - 10;
|
||||||
}
|
}
|
||||||
reader = new(FilePath, FileMode.Open);
|
reader = new(FilePath, FileMode.Open);
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ public class StandardBrInterpreter : BrInterpreterBase
|
|||||||
dataPointer++;
|
dataPointer++;
|
||||||
if (dataPointer >= TapeLength)
|
if (dataPointer >= TapeLength)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"warn: data pointer has overflowed! (length {TapeLength})");
|
Console.WriteLine($"warn L{lineNumber} C{charNumber}: data pointer has overflowed! (length {TapeLength})");
|
||||||
dataPointer = 0;
|
dataPointer = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -72,7 +72,7 @@ public class StandardBrInterpreter : BrInterpreterBase
|
|||||||
dataPointer--;
|
dataPointer--;
|
||||||
if (dataPointer < 0)
|
if (dataPointer < 0)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"warn: data pointer has underflowed! (length {TapeLength})");
|
Console.WriteLine($"warn L{lineNumber} C{charNumber}: data pointer has underflowed! (length {TapeLength})");
|
||||||
dataPointer = TapeLength - 1;
|
dataPointer = TapeLength - 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -97,18 +97,32 @@ public class StandardBrInterpreter : BrInterpreterBase
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case IntentionKind.BeginGroup:
|
case IntentionKind.BeginGroup:
|
||||||
if (reader is null) Console.WriteLine("error: file hasn't been opened yet! how did this happen?");
|
if (reader is null) Console.WriteLine($"error L{lineNumber} C{charNumber}: file hasn't been opened yet! how did this happen?");
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
stack.Push(reader.Position);
|
stack.Push(reader.Position);
|
||||||
debugStack.Push((lineNumber, charNumber));
|
debugOpeningStack.Push((lineNumber, charNumber));
|
||||||
|
if (tape[dataPointer] == 0)
|
||||||
|
{
|
||||||
|
// Look for closing brace.
|
||||||
|
IntentionKind newIntent;
|
||||||
|
while ((newIntent = StepProgram()) != IntentionKind.EndOfFile)
|
||||||
|
{
|
||||||
|
if (newIntent == IntentionKind.EndGroup) break; // Found closing bracket.
|
||||||
|
}
|
||||||
|
if (newIntent == IntentionKind.EndOfFile)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"error L{lineNumber} C{charNumber}: no closing bracket to match opening bracket.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IntentionKind.EndGroup:
|
case IntentionKind.EndGroup:
|
||||||
if (stack.Count == 0)
|
if (stack.Count == 0)
|
||||||
{
|
{
|
||||||
Console.WriteLine("error: no opening bracket to match closing bracket.");
|
Console.WriteLine($"error L{lineNumber} C{charNumber}: no opening bracket to match closing bracket.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,22 +130,22 @@ public class StandardBrInterpreter : BrInterpreterBase
|
|||||||
{
|
{
|
||||||
// Exit loop.
|
// Exit loop.
|
||||||
stack.Pop();
|
stack.Pop();
|
||||||
debugStack.Pop();
|
debugOpeningStack.Pop();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Restart.
|
// Restart.
|
||||||
if (reader is null) Console.WriteLine("error: file hasn't been opened yet! how did this happen?");
|
if (reader is null) Console.WriteLine($"error L{lineNumber} C{charNumber}: file hasn't been opened yet! how did this happen?");
|
||||||
else reader.Seek(stack.Peek(), SeekOrigin.Begin);
|
else reader.Seek(stack.Peek(), SeekOrigin.Begin);
|
||||||
|
|
||||||
(int newL, int newC) = debugStack.Peek();
|
(int newL, int newC) = debugOpeningStack.Peek();
|
||||||
lineNumber = newL;
|
lineNumber = newL;
|
||||||
charNumber = newC;
|
charNumber = newC;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Console.WriteLine("warn: unknown intent! how did this happen?");
|
Console.WriteLine($"warn L{lineNumber} C{charNumber}: unknown intent! how did this happen?");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -246,10 +260,12 @@ public class StandardBrInterpreter : BrInterpreterBase
|
|||||||
IntentionKind.DecrementValue => $"Decrease value at position {dataPointer} ({tape[dataPointer]} -> {tape[dataPointer] - 1})",
|
IntentionKind.DecrementValue => $"Decrease value at position {dataPointer} ({tape[dataPointer]} -> {tape[dataPointer] - 1})",
|
||||||
IntentionKind.OutputValue => $"Print out current value as character (value {tape[dataPointer]})",
|
IntentionKind.OutputValue => $"Print out current value as character (value {tape[dataPointer]})",
|
||||||
IntentionKind.InputValue => $"Input next character input into position {dataPointer}",
|
IntentionKind.InputValue => $"Input next character input into position {dataPointer}",
|
||||||
IntentionKind.BeginGroup => "Beginning a loop",
|
IntentionKind.BeginGroup => tape[dataPointer] == 0
|
||||||
|
? "Skipping loop. Moving execution forward to closing bracket."
|
||||||
|
: "Beginning a loop",
|
||||||
IntentionKind.EndGroup => tape[dataPointer] == 0
|
IntentionKind.EndGroup => tape[dataPointer] == 0
|
||||||
? $"Breaking out of group"
|
? $"Breaking out of a loop"
|
||||||
: $"Moving execution back to L{debugStack.Peek().Item1} C{debugStack.Peek().Item2} until value at position {dataPointer} is zero (currently {tape[dataPointer]})",
|
: $"Moving execution back to L{debugOpeningStack.Peek().Item1} C{debugOpeningStack.Peek().Item2} until value at position {dataPointer} is zero (currently {tape[dataPointer]})",
|
||||||
_ => "?? unknown intent ??"
|
_ => "?? unknown intent ??"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
10
Examples/equals.br
Normal file
10
Examples/equals.br
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
++++++++++++++++++++++++++++++++
|
||||||
|
>,<.+++++++++++++++++++++++++++++..-----------------------------.
|
||||||
|
>>,<<.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++++++++.-----------------------------------------------------------------------------------.
|
||||||
|
|
||||||
|
>>[-<->]<
|
||||||
|
|
||||||
|
>+<
|
||||||
|
[<++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-----.+++++++++++.+++++++.--------------.>>-]
|
||||||
|
>
|
||||||
|
[<<++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.--.+++.----------------.>>-]
|
||||||
@ -1 +1 @@
|
|||||||
+[>+<[>+<-]>]
|
>+[>+<[>+<-]>]
|
||||||
Loading…
x
Reference in New Issue
Block a user