Skip to content

Commit c862a1a

Browse files
committed
Add evaluator page with new value input component
1 parent 981c719 commit c862a1a

File tree

2 files changed

+89
-0
lines changed

2 files changed

+89
-0
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
@foreach (var item in Ast.Variables)
2+
{
3+
<span>@item</span>
4+
<input size="3" @bind="inputs[item]" />
5+
}
6+
7+
<button @onclick="OnButtonClicked">Evaluate</button>
8+
9+
10+
@code {
11+
[Parameter]
12+
public Ast Ast { get; set; }
13+
14+
[Parameter]
15+
public EventCallback<Dictionary<string, string?>> EvaluateClicked { get; set; }
16+
17+
private Dictionary<string, string?> inputs = new();
18+
19+
private Task OnButtonClicked()
20+
{
21+
return EvaluateClicked.InvokeAsync(inputs);
22+
}
23+
24+
protected override void OnParametersSet()
25+
{
26+
base.OnParametersSet();
27+
28+
foreach (var item in Ast.Variables)
29+
{
30+
if (!inputs.ContainsKey(item)) inputs.Add(item, null);
31+
}
32+
}
33+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
@page "/evaluator"
2+
@using BooleanExpressionParser.Web.Client.Components
3+
4+
<PageTitle>Expression Evaluator</PageTitle>
5+
6+
<h1>Expression Evaluator</h1>
7+
<p>Produces the output of an expression for given values.</p>
8+
9+
<ExpressionInput ButtonLabel="Load" ButtonClicked="ParseExpression" ExpressionChanged="ExpressionChanged" />
10+
11+
@if (expressionParsed)
12+
{
13+
<ValueInput Ast="ast" EvaluateClicked="Evaluate"/>
14+
}
15+
16+
@if (result is not null)
17+
{
18+
<h2>@result</h2>
19+
}
20+
21+
@code {
22+
private bool expressionParsed = false;
23+
private Ast? ast;
24+
private bool? result;
25+
26+
private void ExpressionChanged(string _)
27+
{
28+
expressionParsed = false;
29+
result = null;
30+
}
31+
32+
private void ParseExpression(string? expression)
33+
{
34+
if (string.IsNullOrWhiteSpace(expression)) return;
35+
var wrapper = new ExpressionWrapper(expression);
36+
37+
var tokeniser = new Tokeniser(wrapper.Expression);
38+
var infixTokens = tokeniser.Tokenise();
39+
40+
var parser = new Parser();
41+
var postfixTokens = parser.InfixToPostfix(infixTokens);
42+
43+
ast = parser.GrowAst(postfixTokens, wrapper.VariableOrder);
44+
45+
expressionParsed = true;
46+
}
47+
48+
private void Evaluate(Dictionary<string, string?> inputs)
49+
{
50+
// Parse inputs
51+
var values = inputs.Select(x => new { Key = x.Key, Value = x.Value == "1" }).ToDictionary(pair => pair.Key, pair => pair.Value);
52+
53+
result = ast.Root.Evaluate(values);
54+
}
55+
}
56+

0 commit comments

Comments
 (0)