diff --git a/.gitignore b/.gitignore
index d1a7ea7..584fcf8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -364,3 +364,4 @@ FodyWeavers.xsd
# Assignment 1 instructions
assignment_instructions.txt
+159.341_Assignment_1.zip
diff --git a/Assignment 1/Program.cs b/Assignment 1/Program.cs
index 2eaddc6..d4177eb 100644
--- a/Assignment 1/Program.cs
+++ b/Assignment 1/Program.cs
@@ -180,7 +180,7 @@ namespace Assignment_1
result = Exit(source, initSourceLength, dynamicInput);
break;
case Statements.append:
- result = AppendSet(source);
+ result = AppendSet(source, dynamicInput);
break;
case Statements.list:
long pos = FindNextWord(source, out string nextWord);
@@ -195,19 +195,19 @@ namespace Assignment_1
}
break;
case Statements.print:
- result = Print(source, 0);
+ result = Print(source, dynamicInput, 0);
break;
case Statements.printlength:
- result = Print(source, 1);
+ result = Print(source, dynamicInput, 1);
break;
case Statements.printwords:
- result = Print(source, 2);
+ result = Print(source, dynamicInput, 2);
break;
case Statements.printwordcount:
- result = Print(source, 3);
+ result = Print(source, dynamicInput, 3);
break;
case Statements.set:
- result = AppendSet(source, false);
+ result = AppendSet(source, dynamicInput, false);
break;
case Statements.reverse:
result = Reverse(source);
@@ -321,9 +321,9 @@ namespace Assignment_1
///
/// Checks if the next expression meets the requirements of being a value
///
- private string ValidateValue(Stream source)
+ private string ValidateValue(Stream source, bool dynamicInput)
{
- long valuePos = FindExpression(source, out string value);
+ long valuePos = FindExpression(source, dynamicInput, out string value);
if (valuePos < 0)
{
throw new ParserException("Could not evaluate expression", 0, source.Position);
@@ -339,10 +339,10 @@ namespace Assignment_1
/// Handles the 'append x y [ + z];' case
/// And the 'set x y [ + z];' case
///
- Action AppendSet(Stream source, bool appendMode = true)
+ Action AppendSet(Stream source, bool dynamicInput, bool appendMode = true)
{
string key = ValidateKey(source, appendMode);
- string value = ValidateValue(source);
+ string value = ValidateValue(source, dynamicInput);
if (appendMode)
{
return () => Symbols[key] = new Tuple(Symbols[key].Item1 + value, Symbols[key].Item2);
@@ -446,10 +446,10 @@ namespace Assignment_1
/// 2: print the word count
/// 3: print the words in the value
///
- Action Print(Stream source, int mode = 0)
+ Action Print(Stream source,bool dynamicInput, int mode = 0)
{
StringBuilder outputString = new StringBuilder();
- string expression = ValidateValue(source);
+ string expression = ValidateValue(source, dynamicInput);
if (mode == 0)
{
outputString.Append(expression + Environment.NewLine);
@@ -516,7 +516,7 @@ namespace Assignment_1
///
/// Parses & evaluates the expression from the stream, moving the stream to the end of the last value
///
- long FindExpression(Stream s, out string expression)
+ long FindExpression(Stream s, bool dynamicInput, out string expression)
{
string result = "";
bool IsAppendSet = true;
@@ -529,7 +529,7 @@ namespace Assignment_1
}
else
{
- long val = FindValue(s, out string value);
+ long val = FindValue(s, dynamicInput, out string value);
if (val == -1)
{
Console.WriteLine("Could not parse value");
@@ -569,14 +569,28 @@ namespace Assignment_1
///
/// Finds the next value expression in the stream
///
- long FindValue(Stream s, out string returnedValue)
+ long FindValue(Stream s, bool dynamicInput, out string returnedValue)
{
SkipWhitespace(s);
char result = PeekChar(s);
if (result == '\"')
{
// The first char is a ", i.e. the start of a literal - search as if it were a literal.
- return FindLiteral(s, out returnedValue);
+ // If the literal reaches the end of the string & the last char is not ", then we are
+ // expecting more - insert a new line into the stream
+ long literalPos = FindLiteral(s, out returnedValue);
+ if (dynamicInput)
+ {
+ long orig = s.Position;
+ s.Position = literalPos - 1;
+ if (literalPos == s.Length && ReadChar(s) != '"')
+ {
+ s.WriteByte((byte)'\n');
+ literalPos++;
+ }
+ s.Position = orig;
+ }
+ return literalPos;
}
else
{