AScript如何实现中文脚本引擎
2026/6/23 10:23:41 网站建设 项目流程

实现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));

中文脚本引擎为用户提供了自然语言的操作体验,特别适合领域专用语言、业务规则引擎等场景。感兴趣的同学赶紧在项目中

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询