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

相关推荐
我是唐青枫3 小时前
C#.NET gRPC 深入解析:Proto 定义、流式调用与服务间通信取舍
开发语言·c#·.net
unicrom_深圳市由你创科技4 小时前
做虚拟示波器这种实时波形显示的上位机,用什么语言?
c++·python·c#
昵称暂无15 小时前
.NET 高级开发 | i18n 原理、实现一个 i18n 框架
javascript·c#·.net
疯狂成瘾者5 小时前
Chroma向量数据库
开发语言·数据库·c#
我是唐青枫5 小时前
C#.NET Monitor 与 Mutex 深入解析:进程内同步、跨进程互斥与使用边界
开发语言·c#·.net
ou.cs5 小时前
c# 信号量和锁的区别
开发语言·c#
yugi9878386 小时前
C# 串口下载烧写BIN文件工具
开发语言·c#
李树健1237 小时前
.NET 高级开发 | .NET 中的序列化和反序列化
.net
"菠萝"7 小时前
C#知识学习-021(文字关键字)
开发语言·学习·c#