解释自定义语言

我需要开发一个应用程序,它将读取和理解文本文件,在其中我将找到描述操作列表的自定义语言(即烹饪配方)。 此语言尚未定义,但可能采用以下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,我自己的)? 这些发展过程中的关键点是什么?

我希望我很清楚:)

非常感谢您的帮助和建议!

XML非常适合以冗长的方式存储关系数据。 但是,我认为这是编写程序等逻辑的可怕候选者。

您是否考虑过使用现有的语法/脚本语言,而不是编写自己的语言/脚本语言? 例如:

LUA

python

在我的一个项目中,我实际上是从类似XML的语言开始的,因为我已经有了一个XML解析器,并将XML结构解析为内存中的表达式树以进行解释/运行。

这很好地解决了传递解决文本文件的标记化/解析问题的问题,而是专注于你的“语言”和你语言中的操作逻辑。 低端是写文本文件有点奇怪而且非常罗嗦。 对于程序员使用C / C ++语法来说,它也非常不自然。

最终,您可以使用完整的扫描程序和词法分析器轻松替换XML,以便将更加“自然的C ++”文本格式解析到表达式树中。

至于编写扫描仪和词法分析器,我发现使用简单的逻辑流程/循环为扫描程序和lexer的递归正确解析器手动编写这些更容易。

也就是说,ANTLR非常适合您为您的语言编写规则并为您生成扫描仪和词法分析器。 这允许更加动态的语言,可以轻松更改,而无需在添加新内容时再次重构所有内容。 因此,可能值得研究一下,因为如果你手写自己的东西,它会在重写时节省你很多时间。

我建议用F#编写应用程序。 它有许多用于解析字符串和xmls的有用function,如模式匹配和活动模式。

为了解析类似C的代码,我建议使用F#(只用F#做一个解释器,就像魅力一样)

对于解析XML,我建议使用C#/ F#+ XmlDocument类。

你基本上需要处理两个文件:

  • 操作员字典
  • YourLanguage中的代码文件

加载并解释运算符,然后递归地将它们应用于代码文件。

最好的预制答案: S表达式

C和XML是很好的第一步。 它们有一些相反的缺点。 类C语法不会添加大量额外的字符,但由于模糊性,令牌的种类以及可能还有一些我无法想到的问题,它很难解析。 XML相对容易解析,并且有大量的示例代码,但它还包含大量额外的文本。 它还可能为您提供太多选项来支持语言function – 例如,重复循环属性,元素或文本的次数?

S表达式确实比XML更简洁,甚至可能是C.同时,它们特定于将操作应用于数据的任务。 他们不承认含糊不清。 解析器很简单,很容易找到示例代码 。

这可能会使您在开始实验之前不必学习太多理论。 我将强调MerickOWA的观点,即ANTLR和其他解析器生成器可能比你现在想要的战斗更大。 有关此类工具的完整通用性何时可以提供帮助的一些背景信息,请参阅有关programmers.stackexchange的此讨论 。