Skip to content

Commit

Permalink
Fix floats not parsing in function calls
Browse files Browse the repository at this point in the history
Make the expression tokenizer favor literals before looking for
operators.
  • Loading branch information
exodrifter committed Jan 13, 2018
1 parent bdea505 commit c7fa3d1
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 36 deletions.
38 changes: 33 additions & 5 deletions Editor/Tests/Language/ParserTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -467,11 +467,10 @@ public void TokenizeExpression()
Assert.AreEqual("3", tokens[2].Text);

tokens = parser.TokenizeExpression(new Reader("+4 * +3"));
Assert.AreEqual(4, tokens.Count);
Assert.AreEqual("+", tokens[0].Text);
Assert.AreEqual("4", tokens[1].Text);
Assert.AreEqual("*", tokens[2].Text);
Assert.AreEqual("+3", tokens[3].Text);
Assert.AreEqual(3, tokens.Count);
Assert.AreEqual("+4", tokens[0].Text);
Assert.AreEqual("*", tokens[1].Text);
Assert.AreEqual("+3", tokens[2].Text);

tokens = parser.TokenizeExpression(new Reader("!foo"));
Assert.AreEqual(2, tokens.Count);
Expand Down Expand Up @@ -652,6 +651,35 @@ public void CompileExpressionExtra()
(exp as OpExpression).Right);
}

/// <summary>
/// Check if expression compilation with floats works.
/// </summary>
[Test]
public void CompileExpressionFloat()
{
var parser = new Parser();

var exp = parser.CompileExpression("foo(.6)");
Assert.IsAssignableFrom<FunctionExpression>(exp);
Assert.AreEqual("foo", (exp as FunctionExpression).Name);

var @params = (exp as FunctionExpression).Params;
Assert.AreEqual(1, @params.Count);
Assert.IsAssignableFrom<LiteralExpression>(@params[0]);
Assert.IsTrue((@params[0] as LiteralExpression).Value.IsFloat());
Assert.AreEqual(0.6f, (@params[0] as LiteralExpression).Value.AsFloat());

exp = parser.CompileExpression("foo(.06)");
Assert.IsAssignableFrom<FunctionExpression>(exp);
Assert.AreEqual("foo", (exp as FunctionExpression).Name);

@params = (exp as FunctionExpression).Params;
Assert.AreEqual(1, @params.Count);
Assert.IsAssignableFrom<LiteralExpression>(@params[0]);
Assert.IsTrue((@params[0] as LiteralExpression).Value.IsFloat());
Assert.AreEqual(0.06f, (@params[0] as LiteralExpression).Value.AsFloat());
}

#endregion
}
}
Expand Down
4 changes: 4 additions & 0 deletions Expressions/FunctionExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ public class FunctionExpression : Expression
public string Name { get { return name; } }
private readonly string name;

/// <summary>
/// The list of parameters to call the function with.
/// </summary>
public List<Expression> Params { get { return @params; } }
private readonly List<Expression> @params;

public FunctionExpression(string name)
Expand Down
62 changes: 31 additions & 31 deletions Language/Parser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -881,37 +881,6 @@ public List<Token> TokenizeExpression(Reader reader)
continue;
}

// Check for operators
string potentialOp = "";
if (addOp)
{
foreach (var op in ops.Keys)
{
if (temp.HasMatch(op))
{
// Get the longest operator
if (potentialOp.Length < op.Length)
{
potentialOp = op;
}
}
}
}
if (!string.IsNullOrEmpty(potentialOp))
{
tokens.Add(new Token(temp, potentialOp.Length));
temp.Read(potentialOp.Length);

addOp = false;
addElement = true;
success = true;
}

if (success)
{
continue;
}

// Check for expression elements
if (addElement)
{
Expand Down Expand Up @@ -968,6 +937,37 @@ public List<Token> TokenizeExpression(Reader reader)
}
}

if (success)
{
continue;
}

// Check for operators
string potentialOp = "";
if (addOp)
{
foreach (var op in ops.Keys)
{
if (temp.HasMatch(op))
{
// Get the longest operator
if (potentialOp.Length < op.Length)
{
potentialOp = op;
}
}
}
}
if (!string.IsNullOrEmpty(potentialOp))
{
tokens.Add(new Token(temp, potentialOp.Length));
temp.Read(potentialOp.Length);

addOp = false;
addElement = true;
success = true;
}

// Stop if the expression has ended
if (!success)
{
Expand Down

0 comments on commit c7fa3d1

Please sign in to comment.