AScript是一个开源的C#动态脚本解析执行库,支持自定义语法解析,基于此,我们来实现一个中文脚本引擎示例。
示例实现一个条件语句:如果 ... 则 ... 否则 ...
1、实现ITokenHandler接口来自定义语法解析
1 public class 如果语法处理器 : ITokenHandler
2 {
3 private static readonly HashSet<string> _StatementEndTokens = new HashSet<string> { "则", "否则" };
4
5 public void Build(DefaultSyntaxAnalyzer analyzer, TokenAnalyzingArgs e)
6 {
7 e.IsHandled = true;
8 e.End = true;
9
10 // 如果前面有语句,则返回
11 if (e.TreeBuilder.Root != null)
12 {
13 e.TokenReader.Push(e.CurrentToken);
14 return;
15 }
16
17 var condition = analyzer.BuildOneStatement(e.BuildContext, e.ScriptContext, e.Options, e.TokenReader, e.Control, e.Ignore, endTokens: _StatementEndTokens);
18 analyzer.ValidateNextToken(e.TokenReader, "则");
19 var createAllOptions = new BuildOptions(e.Options) { CreateFullTreeNode = true };
20 var body = analyzer.BuildOneStatement(e.BuildContext, e.ScriptContext, createAllOptions, e.TokenReader, e.Control, e.Ignore, endTokens: _StatementEndTokens);
21 var node = new IfNode { Condition = condition, Body = body };
22 var nextToken = e.TokenReader.Read();
23 if (nextToken.HasValue && nextToken.Value.Value == ";")
24 {
25 nextToken = e.TokenReader.Read();
26 }
27 if (nextToken.HasValue)
28 {
29 if (nextToken.Value.Value == "否则")
30 {
31 node.Else = analyzer.BuildOneStatement(e.BuildContext, e.ScriptContext, createAllOptions, e.TokenReader, e.Control, e.Ignore);
32 }
33 else
34 {
35 e.TokenReader.Push(nextToken.Value);
36 }
37 }
38 e.TreeBuilder.Add(e.BuildContext, e.ScriptContext, e.Options, e.Control, node);
39 }
40 }
2、继承ScriptLang,定义中文语言环境
1 public class 中文语言 : ScriptLang
2 {
3 public static readonly 中文语言 实例 = new 中文语言();
4
5 public 中文语言()
6 {
7 AddType<int>("整型");
8 AddType<string>("文本");
9
10 AddTokenHandler("如果", new 如果语法处理器());
11 AddTokenHandler("返回", AScript.TokenHandlers.ReturnTokenHandler.Instance);
12 }
13 }
3、注册中文语言
1 Script.Langs["中文"] = 中文语言.实例;
4、中文脚本示例
1 string s = @"
2 整型 n=10;
3 文本 s='';
4 如果 n<5 则 {
5 s='小于5';
6 } 否则 如果 n<20 则 {
7 s='大于等于5且小于20';
8 } 否则 {
9 s='大于等于20';
10 }
11 返回 $'{n},{s}';
12 ";
13 var script = new Script();
14 Assert.AreEqual("10,大于等于5且小于20", script.Eval(s));
中文脚本引擎为用户提供了自然语言的操作体验,特别适合领域专用语言、业务规则引擎等场景。感兴趣的同学赶紧在项目中用起来吧!
AScript开源地址:https://gitee.com/rockey627/AScript