Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解释自定义语言_C#_Antlr_Interpreter_Dsl - Fatal编程技术网

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,我自己的)最好的语言是什么?这些发展的重点是什么

我希望我说得很清楚:)


非常感谢您的帮助和建议

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>