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

相关推荐
Maiko Star10 小时前
Function Calling:让大模型拥有“动手能力”
function·springai
软泡芙11 小时前
【C# 】各种等待大全:从入门到精通
开发语言·c#·log4j
小邓的技术笔记11 小时前
.NET 10 使用 Microsoft.AspNetCore.OpenApi 实现 API 版本管理
.net
夏霞12 小时前
IIS 应用程序池 3 种标识:ApplicationPoolIdentity / LocalSystem / LocalService 权限区别(超清晰)
c#·.net
SteveDraw12 小时前
常见的设计模式及工业场景下应用(更新中)
设计模式·c#·编码规范·gof23
weixin_5206498721 小时前
WinForm数据展示组件ListView
c#
程序设计实验室1 天前
Spark.NET:一个试图把 Django / Rails 式开发体验带回 .NET 世界的全栈 Web 框架。
c#
byoass1 天前
智巢AI知识库深度解析:企业文档管理从大海捞针到精准狙击的进化之路
开发语言·网络·人工智能·安全·c#·云计算
回忆2012初秋1 天前
Quartz.NET 全面解析与实战指南
.net
njsgcs1 天前
solidworks自动标注折弯4 无向图 c#
开发语言·c#·solidworks