Skip to content

Commit

Permalink
Fixes #59 elif and else compilation errors
Browse files Browse the repository at this point in the history
  • Loading branch information
exodrifter committed Jan 24, 2018
1 parent 445a11e commit 5330e42
Show file tree
Hide file tree
Showing 2 changed files with 129 additions and 39 deletions.
69 changes: 69 additions & 0 deletions Editor/Tests/Language/CompilerTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,75 @@ public void CompileStatement()
Assert.IsAssignableFrom<MultiplyExpression>(
(nodes[0] as Statement).expression);
}

/// <summary>
/// Checks if 'if', 'elif', and 'else' statements compile.
/// <summary>
[Test]
public void CompileControlFlow()
{
var nodes = Compiler.Compile(@"
if foo:
pause
elif bar:
pause
else:
pause
");
Assert.AreEqual(1, nodes.Count);
Assert.IsAssignableFrom<Condition>(nodes[0]);

nodes = Compiler.Compile(@"
if foo:
pause
else:
pause
");
Assert.AreEqual(1, nodes.Count);
Assert.IsAssignableFrom<Condition>(nodes[0]);

nodes = Compiler.Compile(@"
if foo:
pause
else:
pause
");
Assert.AreEqual(1, nodes.Count);
Assert.IsAssignableFrom<Condition>(nodes[0]);

nodes = Compiler.Compile(@"
if foo:
pause
elif bar:
pause
else:
pause
");
Assert.AreEqual(1, nodes.Count);
Assert.IsAssignableFrom<Condition>(nodes[0]);

nodes = Compiler.Compile(@"
if foo:
pause
elif bar:
pause
# comment
elif car:
pause
# comment
else:
pause
");
Assert.AreEqual(1, nodes.Count);
Assert.IsAssignableFrom<Condition>(nodes[0]);
}
}
}

Expand Down
99 changes: 60 additions & 39 deletions Language/Parser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,28 @@ private Reader GetTempOnNextLine(Reader reader)
return temp;
}

private Reader GetTempOnNextNonEmptyLine(Reader reader)
{
var temp = GetTempOnNextLine(reader);
while (!temp.EOF)
{
// Check if the line is not blank
try
{
GetTempOnNextLine(temp);
}
catch (UnusedException)
{
return temp;
}

// Keep reading
temp.NextLine();
}

return temp;
}

#endregion

#region Compile Commands
Expand Down Expand Up @@ -326,32 +348,30 @@ private Condition CompileIf(Reader reader, int depth)
reader.Expect(':');
var children = CompileChildren(reader, depth);

var temp = GetTempOnNextLine(reader);
var temp = GetTempOnNextNonEmptyLine(reader);
var nextDepth = temp.Skip();

if (depth == nextDepth && temp.HasMatch("elif"))
{
if (temp.HasMatch("elif"))
{
temp.Read("elif".Length);
temp.Skip();
temp.Read("elif".Length);
temp.Skip();

// Catch up reader
reader.Read(temp.Index - reader.Index);
// Catch up reader
reader.Read(temp.Index - reader.Index);

var elif = CompileElif(reader, depth);
return new Condition(new If(exp, children, elif));
}
else if (temp.HasMatch("else"))
{
temp.Read("else".Length);
temp.Skip();
var elif = CompileElif(reader, depth);
return new Condition(new If(exp, children, elif));
}
else if (depth == nextDepth && temp.HasMatch("else"))
{
temp.Read("else".Length);
temp.Skip();

// Catch up reader
reader.Read(temp.Index - reader.Index);
// Catch up reader
reader.Read(temp.Index - reader.Index);

var @else = CompileElse(reader, depth);
return new Condition(new If(exp, children, @else));
}
var @else = CompileElse(reader, depth);
return new Condition(new If(exp, children, @else));
}

return new Condition(new If(exp, children));
Expand All @@ -364,39 +384,39 @@ private Elif CompileElif(Reader reader, int depth)
reader.Expect(':');
var children = CompileChildren(reader, depth);

var temp = GetTempOnNextLine(reader);
var temp = GetTempOnNextNonEmptyLine(reader);
var nextDepth = temp.Skip();

if (depth == nextDepth && temp.HasMatch("elif"))
{
if (temp.HasMatch("elif"))
{
temp.Read("elif".Length);
temp.Skip();
temp.Read("elif".Length);
temp.Skip();

// Catch up reader
reader.Read(temp.Index - reader.Index);
// Catch up reader
reader.Read(temp.Index - reader.Index);

var elif = CompileElif(reader, depth);
return new Elif(exp, children, elif);
}
else if (temp.HasMatch("else"))
{
temp.Read("else".Length);
temp.Skip();
var elif = CompileElif(reader, depth);
return new Elif(exp, children, elif);
}
else if (depth == nextDepth && temp.HasMatch("else"))
{
temp.Read("else".Length);
temp.Skip();

// Catch up reader
reader.Read(temp.Index - reader.Index);
// Catch up reader
reader.Read(temp.Index - reader.Index);

var @else = CompileElse(reader, depth);
return new Elif(exp, children, @else);
}
var @else = CompileElse(reader, depth);
return new Elif(exp, children, @else);
}

return new Elif(exp, children);
}

private Else CompileElse(Reader reader, int depth)
{
reader.Skip();
reader.Expect(':');
var children = CompileChildren(reader, depth);
return new Else(children);
}
Expand Down Expand Up @@ -911,7 +931,8 @@ public List<Token> TokenizeExpression(Reader reader)
bool isKeyword = false;
foreach (var keyword in new List<string>() {
"add", "call", "choice", "choose", "clear", "jump",
"label", "pause", "return", "say"})
"label", "pause", "return", "say", "if", "elif",
"else" })
{
if (temp.HasMatch(keyword))
{
Expand Down

0 comments on commit 5330e42

Please sign in to comment.