如何将AScript扩展支持多种脚本语言?

摘要:AScript是一个开源的C#动态脚本解析执行库,支持扩展多种脚本语言。前一篇文章《AScript如何实现中文脚本引擎》中演示了扩展中文语言示例,本篇将更深入的理解AScript的多语言机制,以及如何在脚本中嵌入多种脚本语言。 一、自定义语
AScript是一个开源的C#动态脚本解析执行库,支持扩展多种脚本语言。前一篇文章《AScript如何实现中文脚本引擎》中演示了扩展中文语言示例,本篇将更深入的理解AScript的多语言机制,以及如何在脚本中嵌入多种脚本语言。 一、自定义语法 AScript底层解析脚本生成token流,语法解析器对token流进行处理,就会调用ITokenHandler处理器,该接口定义如下: 1 public interface ITokenHandler 2 { 3 /// <summary> 4 /// token处理 5 /// </summary> 6 /// <param name="analyzer">语法分析器</param> 7 /// <param name="e">当前token、语法树及上下文信息</param> 8 void Build(DefaultSyntaxAnalyzer analyzer, TokenAnalyzingArgs e); 9 } DefaultSyntaxAnalyzer参数为语法分析器,可以调用其中的BuildOneStatement或者BuildMultiStatement方法来读取一条或多条语句。 自定义语法就是对当前token以及前后语句进行处理,将结果添加到语法树,来实现期望的逻辑功能。 示例:定义sql条件语句的and语法 1 /// <summary> 2 /// <![CDATA[age>20 and age<50]]> 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#中的赋值符号"="有冲突,可设置属性Compatible=false表示不兼容默认语言,在脚本或ScriptContext上下文中需要指定语言才能执行。
阅读全文