
实现ITokenHandler接口来自定义语法解析1 public class 如果语法处理器 : ITokenHandler 2 { 3 private static readonly HashSetstring _StatementEndTokens new HashSetstring { 则, 否则 }; 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 AddTypeint(整型); 8 AddTypestring(文本); 9 10 AddTokenHandler(如果, new 如果语法处理器()); 11 AddTokenHandler(返回, AScript.TokenHandlers.ReturnTokenHandler.Instance); 12 } 13 }3、注册中文语言1 Script.Langs[中文] 中文语言.实例;4、中文脚本示例1 string s 2 整型 n10; 3 文本 s; 4 如果 n5 则 { 5 s小于5; 6 } 否则 如果 n20 则 { 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));中文脚本引擎为用户提供了自然语言的操作体验特别适合领域专用语言、业务规则引擎等场景。感兴趣的同学赶紧在项目中