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

相关推荐
geovindu6 小时前
CSharp: 万年历
开发语言·后端·c#·.net
离陌在学C#14 小时前
C# 异步编程:从 async/await 到 Task 实战指南
开发语言·数据库·c#
知无不研16 小时前
std::function在使用时遇到的问题
c++·算法·st·function
用户2986985301418 小时前
PDF 转 HTML 全攻略:三种方法轻松搞定网页转换
c#·html·.net
geovindu18 小时前
CSharp: State Pattern
开发语言·后端·c#·.net·状态模式·行为模式
俊昭喜喜里19 小时前
C#中的decimal
开发语言·c#
JustCheng2 天前
Dispacher(1/2)深入解析-详细使用
c#
CoderIsArt2 天前
C#中UI 线程与 Dispatcher
开发语言·ui·c#
呆呆敲代码的小Y3 天前
【游戏开发】Lua 与 C# 交互原理解析
c#·lua·交互·热更新·lua与c#交互·游戏热更新
用户298698530143 天前
PDF 转纯文本(TXT)免费攻略:轻松提取文字内容
人工智能·后端·c#