解释自定义语言

时间:2011-01-07 15:19:26

标签: c# antlr interpreter dsl

我需要开发一个应用程序,它将读取和理解文本文件,在其中我将找到描述操作列表的自定义语言(即烹饪配方)。此语言尚未定义,但可能采用以下形式之一:

  • C ++代码

(此代码是随机生成的,仅用于示例目的):

begin
repeat(10)
{
    bar(toto, 10, 1999, xxx);
}
result = foo(xxxx, 10);
if(foo == ok)
{
    ...
}
else
{
    ...
}
end
  • XML代码

(此代码是随机生成的,仅用于示例目的):

<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>

无论选择哪种语言,都必须处理简单的条件,循环。

我从未做过这样的事情,但初看起来,我认为将这些操作描述为XML将更简单但功能更少。

在浏览StackOverFlow之后,我发现了一个名为“ANTLR”的工具的聊天......我开始阅读“The Definitive ANTLR Reference”,但由于我从未做过那种东西,我发现很难知道它是不是真的是我需要的那种工具......

换句话说,我需要读取文本文件,正确解释它并在我的C#代码中执行操作。这些操作将通过以下简单条件进行交互:

  • 如果operation1失败,我会执行operation2 else operation3。
  • 重复操作4次。

最好的语言是什么来描述那些文本文件(XML,我自己的)?这些发展过程中的关键点是什么?

我希望我很清楚:)

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

4 个答案:

答案 0 :(得分:3)

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

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

LUA

Python

答案 1 :(得分:2)

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

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

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

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

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

答案 2 :(得分:1)

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

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

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

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

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

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

答案 3 :(得分:1)

最佳预制答案:S-expressions

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

S表达式确实比XML更简洁,甚至可能是C.同时,它们特定于将操作应用于数据的任务。他们不承认含糊不清。解析器是simple and easy to find example code for

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