新闻详情

新闻详情

首页 / 资讯中心 / 详情

AScript扩展多种脚本语言

发布时间:2026/9/27 22:46:16来源:尧图网络
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

相关资讯

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

较早相关资讯

最新相关资讯

House of Orange 2026/9/27 22:46:14

House of Orange

“House of Orange” 是在 CTF(网络安全夺旗赛)和真实漏洞利用中非常经典且高级的一种堆溢出利用技术。它的名字来源于 2016 年 HITCON CTF 比赛中的一道同名题目。为什么会有 House of Orange?(它的核心亮点)在常规的…

阅读更多 →
内存马从入门到精通:不落地一个文件,黑客照样“常驻“服务器 2026/9/27 22:46:13

内存马从入门到精通:不落地一个文件,黑客照样“常驻“服务器

传统Webshell是一句话木马文件——但杀软会查文件、扫描会看目录。 高手换玩法了:不写文件,直接"住进"内存——重启前不消失,查文件查不到。 这就是内存马:红队近年的"王牌技法",护网防守方的&quo…

阅读更多 →
蜜罐技术从入门到精通:给黑客挖个“坑“,让他踩进来 2026/9/27 22:46:13

蜜罐技术从入门到精通:给黑客挖个“坑“,让他踩进来

与其被动挨打,不如主动设局:摆一个"假服务器"当诱饵,黑客一碰,警报就响。 这就是蜜罐(Honeypot):安全领域的"钓鱼执法",防守方的"情报员"。 它是企业…

阅读更多 →
Claude-Code 安装指引:Node、Git 与 PowerShell 环境配置全流程 2026/9/27 22:46:07

Claude-Code 安装指引:Node、Git 与 PowerShell 环境配置全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
论文里的上下标和数学斜体,怎么批量校正才不漏? 2026/9/27 22:46:07

论文里的上下标和数学斜体,怎么批量校正才不漏?

投稿前的版式收尾中,变量斜体与单位上下标属于高频返工点。麻烦的往往不是"改不会",而是"改不齐"——同一份稿子里,有的 r 排成正体,有的排成斜体;有的 m 用了上标,有的直接敲成 m3。批…

阅读更多 →
House of Lore 2026/9/27 22:46:07

House of Lore

House of Lore 是计算机安全领域(特别是 CTF 比赛的 Pwn 方向)中一个非常经典的“堆漏洞利用”技巧。它的名字来源于黑客杂志《Phrack》上的一篇文章,听起来很魔幻,但它的本质就是一个“排队骗局”。把计算机内存想象成一家“储物…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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