Added open bracket support. Also added a new example.

This commit is contained in:
That_One_Nerd 2024-04-12 10:41:57 -04:00
parent db025f648b
commit 272ab5d741
3 changed files with 43 additions and 17 deletions

View File

@ -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
View File

@ -0,0 +1,10 @@
++++++++++++++++++++++++++++++++
>,<.+++++++++++++++++++++++++++++..-----------------------------.
>>,<<.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++++++++.-----------------------------------------------------------------------------------.
>>[-<->]<
>+<
[<++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-----.+++++++++++.+++++++.--------------.>>-]
>
[<<++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.--.+++.----------------.>>-]

View File

@ -1 +1 @@
+[>+<[>+<-]>] >+[>+<[>+<-]>]