Skip to content

Commit c587fee

Browse files
author
Sébastien Geiser
committed
Add optional var keyword
1 parent 0723c33 commit c587fee

File tree

5 files changed

+48
-11
lines changed

5 files changed

+48
-11
lines changed

CodingSeb.ExpressionEvaluator.Tests/ExpressionEvaluatorScriptEvaluateTests.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,6 +1219,16 @@ public static IEnumerable<TestCaseData> TestCasesForScriptEvaluateTests
12191219

12201220
#endregion
12211221

1222+
#region var keyword
1223+
1224+
yield return new TestCaseData(Resources.Script0060, null, null, null)
1225+
.SetCategory("Script")
1226+
.SetCategory("var keyword")
1227+
.SetCategory("=")
1228+
.Returns("A text for 4 test");
1229+
1230+
#endregion
1231+
12221232
#region More complex script
12231233

12241234
yield return new TestCaseData(Resources.Script0007, null, null, null)

CodingSeb.ExpressionEvaluator.Tests/Resources.Designer.cs

Lines changed: 22 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

CodingSeb.ExpressionEvaluator.Tests/Resources.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,4 +295,7 @@
295295
<data name="Script0059" type="System.Resources.ResXFileRef, System.Windows.Forms">
296296
<value>resources\script0059.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
297297
</data>
298+
<data name="Script0060" type="System.Resources.ResXFileRef, System.Windows.Forms">
299+
<value>resources\script0060.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
300+
</data>
298301
</root>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/* Script0060 */
2+
var x = 4;
3+
var textVar = "A text for {0} test";
4+
5+
return string.Format(textVar, x);

CodingSeb.ExpressionEvaluator/ExpressionEvaluator.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public partial class ExpressionEvaluator
3131
private const string diactitics = "áàâãåǎăāąæéèêëěēĕėęěìíîïīĭįijóôõöōŏőøðœùúûüǔũūŭůűųýþÿŷıćĉċčçďđĝğġģĥħĵķĺļľŀłńņňŋñŕŗřśŝşšţťŧŵźżžÁÀÂÃÅǍĂĀĄÆÉÈÊËĚĒĔĖĘĚÌÍÎÏĪĬĮIJÓÔÕÖŌŎŐØÐŒÙÚÛÜǓŨŪŬŮŰŲÝÞŸŶIĆĈĊČÇĎĐĜĞĠĢĤĦĴĶĹĻĽĿŁŃŅŇŊÑŔŖŘŚŜŞŠŢŤŦŴŹŻŽß";
3232
private const string diactiticsKeywordsRegexPattern = "a-zA-Z_" + diactitics;
3333

34-
private static readonly Regex varOrFunctionRegEx = new Regex($@"^((?<sign>[+-])|(?<prefixOperator>[+][+]|--)|(?<inObject>(?<nullConditional>[?])?\.)?)(?<name>[{ diactiticsKeywordsRegexPattern }](?>[{ diactiticsKeywordsRegexPattern }0-9]*))(?>\s*)((?<assignationOperator>(?<assignmentPrefix>[+\-*/%&|^]|<<|>>)?=(?![=>]))|(?<postfixOperator>([+][+]|--)(?![{ diactiticsKeywordsRegexPattern}0-9]))|((?<isgeneric>[<](?>([{ diactiticsKeywordsRegexPattern }](?>[{ diactiticsKeywordsRegexPattern }0-9]*)|(?>\s+)|[,\.])+|(?<gentag>[<])|(?<-gentag>[>]))*(?(gentag)(?!))[>])?(?<isfunction>[(])?))", RegexOptions.IgnoreCase | RegexOptions.Compiled);
34+
private static readonly Regex varOrFunctionRegEx = new Regex($@"^((?<sign>[+-])|(?<prefixOperator>[+][+]|--)|(?<varKeyword>var\s+)|(?<inObject>(?<nullConditional>[?])?\.)?)(?<name>[{ diactiticsKeywordsRegexPattern }](?>[{ diactiticsKeywordsRegexPattern }0-9]*))(?>\s*)((?<assignationOperator>(?<assignmentPrefix>[+\-*/%&|^]|<<|>>)?=(?![=>]))|(?<postfixOperator>([+][+]|--)(?![{ diactiticsKeywordsRegexPattern}0-9]))|((?<isgeneric>[<](?>([{ diactiticsKeywordsRegexPattern }](?>[{ diactiticsKeywordsRegexPattern }0-9]*)|(?>\s+)|[,\.])+|(?<gentag>[<])|(?<-gentag>[>]))*(?(gentag)(?!))[>])?(?<isfunction>[(])?))", RegexOptions.IgnoreCase | RegexOptions.Compiled);
3535

3636
private const string numberRegexOrigPattern = @"^(?<sign>[+-])?([0-9][0-9_{1}]*[0-9]|\d)(?<hasdecimal>{0}?([0-9][0-9_]*[0-9]|\d)(e[+-]?([0-9][0-9_]*[0-9]|\d))?)?(?<type>ul|[fdulm])?";
3737
private string numberRegexPattern = null;
@@ -1735,10 +1735,17 @@ void Init(object element, List<string> initArgs)
17351735
}
17361736
}
17371737

1738+
17381739
private bool EvaluateVarOrFunc(string expr, string restOfExpression, Stack<object> stack, ref int i)
17391740
{
17401741
Match varFuncMatch = varOrFunctionRegEx.Match(restOfExpression);
17411742

1743+
if (varFuncMatch.Groups["varKeyword"].Success
1744+
&& !varFuncMatch.Groups["assignationOperator"].Success)
1745+
{
1746+
throw new ExpressionEvaluatorSyntaxErrorException("Implicit variables must be initialized");
1747+
}
1748+
17421749
if (varFuncMatch.Success
17431750
&& (!varFuncMatch.Groups["sign"].Success
17441751
|| stack.Count == 0

0 commit comments

Comments
 (0)