AScript如何实现中文脚本引擎

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

相关推荐
hez20102 天前
在 .NET 上构建超大托管数组
c#·.net·.net core·gc·clr
雨落倾城夏未凉8 天前
第四章c#方法-参数数组和可选参数(16)
后端·c#
唐青枫9 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net
唐青枫10 天前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
Caco_D10 天前
一行代码抓遍全网 20 个热榜!Aneiang.Pa 4.0 发布 — 极简 .NET 爬虫库
爬虫·.net
咕白m62510 天前
.NET 环境下 Word 超链接批量提取方案
c#·.net
用户917215619021110 天前
C# 通信协议增量解析:用状态机处理半包和粘包
c#
小码编匠11 天前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net