Tag: dsl

C#中自己的DSL代码解析器

我正在寻找像C#代码一样的flex / bison之类的东西。 我希望能够提供一些语言描述符,并且应该生成解析器。

解释自定义语言

我需要开发一个应用程序,它将读取和理解文本文件,在其中我将找到描述操作列表的自定义语言(即烹饪配方)。 此语言尚未定义,但可能采用以下forms之一: 像代码一样的C ++ (此代码是随机生成的,仅用于示例目的): begin repeat(10) { bar(toto, 10, 1999, xxx); } result = foo(xxxx, 10); if(foo == ok) { … } else { … } end XML代码 (此代码是随机生成的,仅用于示例目的): … … 无论选择哪种语言,都必须处理简单的条件,循环。 我从来没有做过这样的事情,但初看起来,我认为将这些操作描述为XML将更简单但function更少。 在浏览StackOverFlow之后,我发现了一个名为“ANTLR”的工具的聊天…我开始阅读“The Definitive ANTLR Reference”,但由于我从未做过那种东西,我发现很难知道它是不是真的那种我需要的工具…… 换句话说,我需要读取文本文件,正确解释它并在我的C#代码中执行操作。 这些操作将通过以下简单条件进行交互: 如果operation1失败,我执行operation2 else operation3。 重复操作4次10次。 什么是最好的语言来描述那些文本文件(XML,我自己的)? 这些发展过程中的关键点是什么? 我希望我很清楚:) 非常感谢您的帮助和建议!

使用IronPython简化为C#应用程序编写的DSL

感谢前一个问题的建议,我正忙着尝试使用IronPython,IronRuby和Boo为我的C#应用​​程序创建一个DSL。 第一步是IronPython,因为用户和知识库较大。 如果我能在这里找到合适的东西,我可以停下来。 这是我的问题: 我希望我的IronPython脚本可以访问名为Lib的类中的函数。 现在我可以将程序集添加到IronPython运行时并通过执行我创建的作用域中的语句来导入该类: // load ‘ScriptLib’ assembly Assembly libraryAssembly = Assembly.LoadFile(libraryPath); _runtime.LoadAssembly(libraryAssembly); // import ‘Lib’ class from ‘ScriptLib’ ScriptSource imports = _engine.CreateScriptSourceFromString(“from ScriptLib import Lib”, SourceCodeKind.Statements); imports.Execute(_scope); // run .py script: ScriptSource script = _engine.CreateScriptSourceFromFile(scriptPath); script.Execute(_scope); 如果我想运行Lib :: PrintHello,这只是一个hello world style语句,我的Python脚本包含: Lib.PrintHello() 或(如果它不是静态的): library = new Lib() library.PrintHello() 如何更改我的环境,以便我可以在Python脚本中获得如下的基本语句: PrintHello TurnOnPower VerifyFrequency […]

DSLs /流畅接口的重点是什么?

我最近正在观看关于如何创建流畅的DSL的网络直播,我不得不承认,我不明白为什么会使用这种方法(至少对于给定的例子)。 网络广播提供了一个图像大小调整类,它允许您指定输入图像,resize并使用以下语法将其保存到输出文件(使用C#): Sizer sizer = new Sizer(); sizer.FromImage(inputImage) .ToLocation(outputImage) .ReduceByPercent(50) .OutputImageFormat(ImageFormat.Jpeg) .Save(); 我不明白这是如何比采用一些参数的“传统”方法更好: sizer.ResizeImage(inputImage, outputImage, 0.5, ImageFormat.Jpeg); 从可用性的角度来看,这似乎更容易使用,因为它清楚地告诉您该方法期望作为输入。 相比之下,使用流畅的界面,没有什么可以阻止您省略/忘记参数/方法调用,例如: sizer.ToLocation(outputImage).Save(); 关于我的问题: 1 –是否有某种方法可以提高流畅界面的可用性(即告诉用户他应该做什么)? 2 –这种流畅的界面方法只是C#中现有的命名方法参数的替代吗? 命名参数会使流畅的接口过时,例如类似Objective-C提供的东西: sizer.Resize(from:input, to:output, resizeBy:0.5, ..) 3 –流畅的界面是否过度使用仅仅是因为它们目前很受欢迎? 4 –或者它只是一个被选为网络广播的坏榜样? 在这种情况下,请告诉我这种方法的优点是什么,使用它的意义何在。 顺便说一句:我知道jquery,看看它有多容易,所以我不是在寻找关于那个或其他现有例子的评论。 我正在寻找一些(一般)注释来帮助我理解(例如)何时实现流畅的接口(而不是经典的类库),以及实现它时需要注意的事项。

用C#写我的第一个DSL,然后挂上func &Action

我正在努力编写我的第一个DSL用于工作中的简单工具。 我正在使用构建器模式来设置复杂的父对象,但我遇到了砖墙,用于构建父对象的子集合。 这是一个示例: 使用: var myMorningCoffee = Coffee.Make.WithCream().WithOuncesToServe(16); 关闭的样本(我认为这就是他们所谓的): var myMorningCoffee = Coffee.Make.WithCream().PourIn( x => { x.ShotOfExpresso.AtTemperature(100); x.ShotOfExpresso.AtTemperature(100).OfPremiumType(); } ).WithOuncesToServe(16); 示例类(没有子PourIn()方法,因为这是我想要弄清楚的。) public class Coffee { private bool _cream; public Coffee Make { get new Coffee(); } public Coffee WithCream() { _cream = true; return this; } public Coffee WithOuncesToServe(int ounces) { _ounces = ounces; return […]