我需要开发一个应用程序,它将读取和理解文本文件,在其中我将找到描述操作列表的自定义语言(即烹饪配方)。此语言尚未定义,但可能采用以下形式之一:
(此代码是随机生成的,仅用于示例目的):
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>
无论选择哪种语言,都必须处理简单的条件,循环。
我从未做过这样的事情,但初看起来,我认为将这些操作描述为XML将更简单但功能更少。
在浏览StackOverFlow之后,我发现了一个名为“ANTLR”的工具的聊天......我开始阅读“The Definitive ANTLR Reference”,但由于我从未做过那种东西,我发现很难知道它是不是真的是我需要的那种工具......
换句话说,我需要读取文本文件,正确解释它并在我的C#代码中执行操作。这些操作将通过以下简单条件进行交互:
最好的语言是什么来描述那些文本文件(XML,我自己的)?这些发展过程中的关键点是什么?
我希望我很清楚:)
非常感谢您的帮助和建议!
答案 0 :(得分:3)
答案 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类。
您基本上需要处理两个文件:
加载并解释运算符,然后递归地将它们应用到代码文件中。
答案 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。