C# 解释自定义语言
我需要开发一个应用程序,将阅读和理解文本文件,在其中我会找到一个自定义语言,描述了一系列的操作(即烹饪食谱)。此语言尚未定义,但可能会采用以下形式之一:C# 解释自定义语言,c#,antlr,interpreter,dsl,C#,Antlr,Interpreter,Dsl,我需要开发一个应用程序,将阅读和理解文本文件,在其中我会找到一个自定义语言,描述了一系列的操作(即烹饪食谱)。此语言尚未定义,但可能会采用以下形式之一: 类似C++的代码 (此代码是随机生成的,仅用于示例目的): XML代码 (此代码是随机生成的,仅用于示例目的): ... ... 无论选择哪种语言,都必须处理简单的条件、循环 我从来没有做过这样的事情,但乍一看,我觉得将这些操作描述成XML会更简单,但功能会更小 在浏览StackOverFlow之后,我在一个名为“ANTLR”的工具
- 类似C++的代码
- XML代码
...
...
无论选择哪种语言,都必须处理简单的条件、循环
我从来没有做过这样的事情,但乍一看,我觉得将这些操作描述成XML会更简单,但功能会更小
在浏览StackOverFlow之后,我在一个名为“ANTLR”的工具上找到了一些聊天记录。。。我开始阅读“权威ANTLR参考”,但由于我从未做过这种事情,我发现很难知道它是否真的是我需要的工具
换句话说,我需要什么来读取文本文件,正确地解释它,并在我的C#代码中执行操作。这些操作将通过以下简单条件相互作用:
- 如果操作1失败,我将执行操作2其他操作3
- 重复该操作4 10次
非常感谢您的帮助和建议 XML非常适合以详细的方式存储关系数据。然而,我认为它是编写逻辑(如程序)的一个糟糕的候选者 您是否考虑过使用可以嵌入的现有语法/脚本语言,而不是自己编写?例如:
我建议用F#编写应用程序。它有许多用于解析字符串和XML的有用特性,如模式匹配和活动模式 对于解析类似C的代码,我建议使用F#(只是用F#做了一个解释器,效果很好) 对于解析XML,我建议使用C#/F#+XmlDocument类 您基本上需要处理两个文件:
- 运算符词典
- 语言中的代码文件
加载并解释运算符,然后将它们递归地应用到代码文件中。在我的一个项目中,我实际上是从一种类似XML的语言开始的,因为我已经有了一个XML解析器,并将XML结构解析到内存中的表达式树中进行解释/运行 这很好地解决了文本文件的标记化/解析问题,并将注意力集中在“语言”和语言中的操作逻辑上。缺点是写文本文件有点奇怪,而且很冗长。对于程序员来说,使用C/C++语法也是非常不自然的 最终,您可以很容易地用一个成熟的扫描器和词法器来替换XML,以便将更“自然的C++文本格式”解析到表达式树中 至于编写scanner&lexer,我发现使用简单的扫描器逻辑流/循环和lexer递归解析器手工编写这些代码更容易 也就是说,ANTLR非常适合让您为自己的语言编写规则,并为您生成扫描仪和词法分析器。这允许使用更具动态性的语言,在添加新内容时无需再次重构所有内容即可轻松更改。因此,学习这一点可能值得一试,因为如果你自己动手写的话,当事情发生变化时,它会为你节省大量重写时间。最好的预设答案: C和XML是很好的第一步。它们有一些相反的缺点。类似C的语法不会添加太多额外的字符,但由于歧义、标记的多样性以及我想不出的更多问题,它将很难解析。XML相对容易解析,有大量的示例代码,但它也会包含大量额外的文本。它还可能为您提供太多的选项,让您选择将语言功能粘贴到何处—例如,重复循环的次数是属性、元素还是文本 S表达式肯定比XML更简洁,甚至可能比C更简洁。同时,它们特定于将操作应用于数据的任务。他们不承认模棱两可。解析器是
这可能会使你在开始实验之前不必学习太多的理论。我将强调MerickOWA的观点,即ANTLR和其他解析器生成器可能是一场比您现在想要打的更大的战斗。有关此类型工具的完整通用性何时会有所帮助的背景信息,请参阅 我不会说XML没有那么强大,只是更冗长。一旦C++语言被解析成表达式树,它就可以很容易地变成XML而不丢失电源。是的,我害怕遇到循环、条件等困难。正如Moo Juice所说,我很难将XML视为描述逻辑的语言。。。我认为它更像是一种描述静态结构的方式。。。我错了吗?很有趣,谢谢。我认为解析类似C的语法会有很多麻烦。我需要使用ANTLR,我没有时间在我正在进行的项目中学习所有这些。S表达式是一个不错的选择,但是要解析的源文本应该是非计算机科学家用户可以编写的。因此,我想我将使用XML和一个小应用程序来帮助用户编写正确的XML。你认为呢?我可以用Python创建DSL吗?最终阅读代码,解释代码并调用C#方法?
begin
repeat(10)
{
bar(toto, 10, 1999, xxx);
}
result = foo(xxxx, 10);
if(foo == ok)
{
...
}
else
{
...
}
end
<recipe>
<action name="foo" argument"bar, toto, xxx" repeat=10/>
<action name="bar" argument"xxxxx;10" condition="foo == ok">
<true>...</true>
<false>...</false>
</action>
</recipe>