AScript — это динамический сценарий C# (解析正解影院), поддерживающий режим 解析正视和实方正视2种, статический грамматика。
在解析正解最作, статическое и нестатическое предложение эквивалентны;
В режиме выполнения компиляции статическое предложение будет выполняться во время компиляции, то есть статическое предложение не будет компилироваться, а будет выполняться напрямую, и результаты будут возвращены.
пример
Давайте посмотрим на пример:
1 var s = @" 2 static int n = 10; // 直接执行,不参与编译 3 static x = n * 2; // 直接执行,不参与编译 4 int y = static n * 2; // 编译结果:y = 20 5 /* 6 int m=20; 7 int a = static m * 2; // 报错:variable m is not exists 8 */ 9 int z = n * 2; // 编译结果:z = n * 2 10 x+y+z; 11 "; 12 var script = new Script(); 13 // 编译 14 var func = script.Compile<int>(s); 15 Assert.AreEqual(10, script.Context.EvalVar("n")); 16 Assert.AreEqual(20, script.Context.EvalVar("x")); 17 Assert.IsNull(script.Context.EvalVar("y")); 18 Assert.IsNull(script.Context.EvalVar("z")); 19 // 执行 20 Assert.AreEqual(60, func());
Переменные в статическом предложении должны быть определены в статическом предложении, поскольку переменные n, x определены в статическом предложении, результаты уже рассчитаны до выполнения сценария, результаты компиляции приведенного выше примера таковы:
1 int y = 20; 2 int z = n * 2; 3 x+y+z;
Итак, исходя из характеристик статического синтаксиса, в каких сценариях мы можем его использовать?
Сценарий первый: функция eval
在下载一个文章《之eval投程达解》中介绍过eval投稿设计的设计和设计。
1 int n=10; 2 var s='n+20'; 3 eval(s); // 结果为20
В некоторых случаях результаты вычислений не соответствуют нашим ожидаемым 30, мы используем грамматический синтаксис:
1 int n=10; 2 static var s='n+20'; 3 eval(static s); // 结果为30
Результат ожидается через 30 дней.
Сценарий 2: Компиляция
1 string s = @" 2 static { 3 min+=10; 4 max+=5; 5 } 6 n >= min && n <= max 7 "; 8 var script = new Script(); 9 script.Context.SetVar("min", 20); 10 script.Context.SetVar("max", 50); 11 var func = script.Compile<int, bool>(s, "n"); 12 int total = 0; 13 for (int i = 0; i < 10000; i++) 14 { 15 if (func(i)) total++; 16 } 17 Assert.AreEqual(26, total);
Мы можем использовать характеристики статического синтаксиса, выполнить некоторую логику инициализации в скрипте, например, из базы данных, из базы данных, выполнить некоторую логику инициализации.
реализовать принцип
Наконец, мы посмотрим, как реализуется статическая грамматика?
1 public class StaticTokenHandler : ITokenHandler 2 { 3 public static readonly StaticTokenHandler Instance = new StaticTokenHandler(); 4 5 public void Build(DefaultSyntaxAnalyzer analyzer, TokenAnalyzingArgs e) 6 { 7 e.IsHandled = true; 8 if (e.TreeBuilder.IsFullStatement()) 9 { 10 e.End = true; 11 e.TokenReader.Push(e.CurrentToken); 12 return; 13 } 14 var options = e.Options; 15 // 如果当前为编译模式,则改为使用执行模式 16 if ((options.CompileMode?? ECompileMode.None) == ECompileMode.All) 17 { 18 options = new BuildOptions(e.Options) { CompileMode = ECompileMode.None }; 19 } 20 var node = analyzer.BuildOneStatement2(e.BuildContext, e.ScriptContext, options, e.TokenReader, e.Control, e.Ignore, noblock: true); 21 if (node != null && !e.Ignore) 22 { 23 // 执行并返回结果 24 var v = node.Eval(e.ScriptContext, options, e.Control, out var type); 25 e.TreeBuilder.AddData(e.BuildContext, e.ScriptContext, e.Options, e.Control, PoolManage.CreateObjectNode(v, type)); 26 } 27 } 28 }
Затем зарегистрируйтесь в CSharpLang: addTokenHandler(“статический“СтатикТокенХандлер.Экземпляр); ,几行CODE就电影电影的有意思语系。
说点什么
Также есть синтаксис @lang/@end, который также можно сравнить со значением, в скрипт можно встроить другие языки.
Наконец, AScript — это гибкий, ориентированный на рост скриптовый движок, вы можете использовать его для реализации своих идей. Если у вас есть представление о том, что происходит, не пытайтесь!
Использование AScript: https://gitee.com/rockey627/AScript