新闻详情

新闻详情

首页 / 资讯中心 / 详情

AScript扩展多种脚本语言

发布时间:2026/9/22 22:00:15来源:尧图网络
AScript扩展多种脚本语言
、自定义语法AScript底层解析脚本生成token流语法解析器对token流进行处理就会调用ITokenHandler处理器该接口定义如下1 public interface ITokenHandler 2 { 3 /// summary 4 /// token处理 5 /// /summary 6 /// param nameanalyzer语法分析器/param 7 /// param namee当前token、语法树及上下文信息/param 8 void Build(DefaultSyntaxAnalyzer analyzer, TokenAnalyzingArgs e); 9 }DefaultSyntaxAnalyzer参数为语法分析器可以调用其中的BuildOneStatement或者BuildMultiStatement方法来读取一条或多条语句。自定义语法就是对当前token以及前后语句进行处理将结果添加到语法树来实现期望的逻辑功能。示例定义sql条件语句的and语法1 /// summary 2 /// ![CDATA[age20 and age50]] 3 /// /summary 4 public class AndTokenHandler : ITokenHandler 5 { 6 public static readonly AndTokenHandler Instance new AndTokenHandler(); 7 8 public void Build(DefaultSyntaxAnalyzer analyzer, TokenAnalyzingArgs e) 9 { 10 e.IsHandled true; 11 if (!e.Ignore) 12 { 13 var op new OperatorNode(and, DefaultSyntaxAnalyzer.OperatorPriorities[], 2); 14 e.TreeBuilder.AddOperator(e.BuildContext, e.ScriptContext, e.Options, e.Control, op); 15 } 16 } 17 }sql中的and语法等效于C#中的操作符所以优先级取操作符的优先级同时sql语言环境中需要注册and函数 AddFunc(and, AndAlsoOperator.Instance);二、定义语言AScript中提供了ScriptLang类来扩展语言该类包含类型、变量、函数、语法解析ITokenHandler管理。多语言势必会带来语法兼容问题比如sql条件中的号是相等的意思等效于C#中的跟C#中的赋值符号有冲突可设置属性Compatiblefalse表示不兼容默认语言在脚本或ScriptContext上下文中需要指定语言才能执行。示例定义Sql语言这里只实现一个简单的条件判断功能1 public class SqlLang : ScriptLang 2 { 3 public static readonly SqlLang Instance new SqlLang(); 4 5 public SqlLang() 6 { 7 this.Compatible false; 8 9 AddFunc(., DotOperator.Instance); 10 AddFunc(!, BoolNotOperator.Instance); 11 AddFunc(, LessThanOperator.Instance); 12 AddFunc(, GreaterThanOperator.Instance); 13 AddFunc(, EqualOperator.Instance); 14 AddFunc(, GreaterThanOrEqualOperator.Instance); 15 AddFunc(, LessThanOrEqualOperator.Instance); 16 AddFunc(!, NotEqualOperator.Instance); 17 AddFunc(and, AndAlsoOperator.Instance); 18 AddFunc(or, OrElseOperator.Instance); 19 20 AddTokenHandler(and, AndTokenHandler.Instance); 21 AddTokenHandler(AND, AndTokenHandler.Instance); 22 AddTokenHandler(or, OrTokenHandler.Instance); 23 AddTokenHandler(OR, OrTokenHandler.Instance); 24 AddTokenHandler(, EqualTokenHandler.Instance); 25 AddTokenHandler(like, LikeTokenHandler.Instance); 26 AddTokenHandler(LIKE, LikeTokenHandler.Instance); 27 } 28 }由于AScript是区分大小写的注册token时大小写都注册一下便于sql语句中支持大小写语法示例中的or、like等语法代码不一一列出了感兴趣的同学可以到开源项目的单元测试中查看后续可能会开发一个比较完备的sql语言脚本。注册SqlLang Script.Langs[sql] SqlLang.Instance;三、执行指定语言脚本如果不指定语言则使用默认且兼容的语言来执行脚本。1、ScriptContext中设置Langs属性来指定脚本语言1 string s p.Name like to% or p.Age20 and p.Age50; 2 var script new Script(); 3 script.Context.Langs new[] { sql }; 4 var matchFunc script.CompilePerson, bool(s, p); 5 var list new ListPerson 6 { 7 new Person(jim, 18), 8 new Person(tony, 60), 9 new Person(tom, 19), 10 new Person(san, 25), 11 new Person(lin, 70) 12 }; 13 var matchedList list.Where(matchFunc).ToList(); 14 Assert.AreEqual(3, matchedList.Count); 15 Assert.AreEqual(tony, matchedList[0].Name); 16 Assert.AreEqual(tom, matchedList[1].Name); 17 Assert.AreEqual(san, matchedList[2].Name);2、脚本中通过#lang语法嵌入其他语言指定多个语言使用逗号,分隔如 #lang 中文,CSharp1 string s 2 bool isMatch(Person p) { 3 #lang sql 4 p.Age20 and p.Age50 or p.Name like to% or p.Namepen; 5 #end 6 } 7 var matchedList new ListPerson(); 8 foreach(var item in list) { 9 if (isMatch(item)) matchedList.Add(item); 10 } 11 matchedList; 12 ; 13 var list new ListPerson 14 { 15 new Person(jim, 18), 16 new Person(tony, 60), 17 new Person(tom, 19), 18 new Person(san, 25) 19 }; 20 var script new Script(); 21 script.Context.AddTypePerson(); 22 script.Context.SetVar(list, list); 23 var matchedList script.EvalListPerson(s); 24 Assert.AreEqual(3, matchedList.Count); 25 Assert.AreEqual(tony, matchedList[0].Name); 26 Assert.AreEqual(tom, matchedList[1].Name); 27 Assert.AreEqual(san, matchedList[2].Name);四、结语AScript 的多语言扩展能力在同一脚本中嵌入不同脚本语言让开发者和用户可以使用最合适的语言进行脚本配置
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

3步搞定女裤尺码表性能优化,拒绝Stacktrace报错 2026/9/23 0:44:41

3步搞定女裤尺码表性能优化,拒绝Stacktrace报错

3步搞定女裤尺码表性能优化,拒绝Stacktrace报错 报错堆栈满屏红字,StackTrace 看得人头晕?别慌。 做电商后台或数据中台,处理【女裤尺码表】这类高频查询时,性能优化 才是救命稻草。…

阅读更多 →
新手避坑:变异毒株在国内首次传播数据实战 2026/9/23 0:44:34

新手避坑:变异毒株在国内首次传播数据实战

新手避坑:变异毒株在国内首次传播数据实战 刚学完Python语法,面对“变异毒株在国内首次传播”这类热点数据,是不是脑子一片空白?很多人卡在这里: 学会语法却不知怎么搭项目 。别慌,今天这篇就是给咱们 新手避坑…

阅读更多 →
lolbp速查手册:面试原理答不上来?5分钟吃透核心源码 2026/9/23 0:44:28

lolbp速查手册:面试原理答不上来?5分钟吃透核心源码

lolbp速查手册:面试原理答不上来?5分钟吃透核心源码 面试被问原理答不上来,这大概是每个开发者最头疼的时刻。手里拿着 lolbp 的速查手册,背了一堆 API,但面试官一问底层逻辑,脑子瞬间空白。别慌,今天这篇不整虚的,直接带你把…

阅读更多 →
英语课本听力加载慢?这份性能优化速查手册帮你提速 2026/9/23 0:44:22

英语课本听力加载慢?这份性能优化速查手册帮你提速

英语课本听力加载慢?这份性能优化速查手册帮你提速 学会语法却不知怎么搭项目,这是很多开发者卡在“英语课本听力”资源开发上的死胡同。你背熟了 HTTP 协议,读懂了 WebSocket…

阅读更多 →
5950报错刷屏?实战项目里这3个坑救了我 2026/9/23 0:44:22

5950报错刷屏?实战项目里这3个坑救了我

5950报错刷屏?实战项目里这3个坑救了我 看着满屏红色的 StackTrace,你是不是头大如斗?尤其是那种 5950 相关的错误代码,或者类似编号的异常抛出,往往意味着你的数据在关键节点断掉了。我在几个大型实战项目里,被这类问题折磨过不…

阅读更多 →
面试卡壳?3行代码带你吃透比特球源码解析 2026/9/23 0:44:22

面试卡壳?3行代码带你吃透比特球源码解析

面试卡壳?3行代码带你吃透比特球源码解析 面试时被问“这个库底层怎么实现的”,你支支吾吾答不上来,心里是不是直打鼓?别慌,今天咱们不背八股文,直接上 源码解析 ,把【比特球】这块硬骨头啃下来。…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞