如何将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上下文中需要指定语言才能执行。
