C++ UML活动图作为DSL;转换为C++;

C++ UML活动图作为DSL;转换为C++;,c++,uml,code-generation,dsl,C++,Uml,Code Generation,Dsl,我要写一封信。该系统的一个基本部分是一个巨大的决策树,它根据记录的状态和日志文件识别故障的根源,其中一个主要问题是保持该树的可维护性——以程序员易于理解和编辑的格式编写 由于7层嵌套if()s不是我“可维护且易于理解”的想法,因此我想知道如何以一种介于机器友好、用户友好和经济高效之间的良好形式来表示它。显而易见的答案是使用一种特定于领域的语言,它将被编译成C++,其中实际事件相关器将被写入。显而易见的问题是DSL应该是什么样子 我最喜欢的建议是使用UML活动图,并将其编译成C++。该图可能几乎完

我要写一封信。该系统的一个基本部分是一个巨大的决策树,它根据记录的状态和日志文件识别故障的根源,其中一个主要问题是保持该树的可维护性——以程序员易于理解和编辑的格式编写

由于7层嵌套if()s不是我“可维护且易于理解”的想法,因此我想知道如何以一种介于机器友好、用户友好和经济高效之间的良好形式来表示它。显而易见的答案是使用一种特定于领域的语言,它将被编译成C++,其中实际事件相关器将被写入。显而易见的问题是DSL应该是什么样子

我最喜欢的建议是使用UML活动图,并将其编译成C++。该图可能几乎完全由决策组成,决策过程得出的结论仅限于树的叶子上。本质上,图表是我的图形DSL,然后应该编译成C++中的大量的IFE()。虽然我仍然需要手工制作所有条件函数,但至少条件之间的互连应该由系统处理

现在,我应该使用什么工具来创建该图

由于“自己滚”不是我的成本效益理念,考虑到它最终是为一台设备创建一个单一的图表(即使它可能会被永远编辑,因为新的故障模式被发现),我看了一下

其中有很多,包括那些在“生成的语言”中列出了“C++”的,但我知道现实从来没有那么好——我对根据类图预先填充了类定义的一堆头文件不感兴趣。我需要一个包含我的决策树的文件;一组条件语句,其中的条件预先填充了决策函数调用,我将手工编写,结果作为特定的结论函数调用

现在我的问题是,哪些工具可以做到这一点,使用起来不太困难,也不昂贵——首选免费工具,但价格合理的商业工具也可以

或者,如果失败了——哪些可以将该图保存为我可以用自制的“编译器”解析的形式,以及如何创建该编译器

当然,其他建议也是最受欢迎的——也许是一个可以生成此类代码的老式流程图工具?也许一个专用的DSL已经创建了我需要的东西?

< P>可以从行为图中生成C++代码,包括活动图。它有好几个版本;支持行为代码生成的最低版本成本为599美元。以下是用户指南的部分:。除了代码生成之外,EA还提供了可跟踪性和许多其他细节


如果您可以在状态图中实现您的逻辑,那么您可以使用免费的。它生成C++代码。它被设计为使用,但您可以使用QM而不依赖QP。(您也可以使用Enterprise Architect从状态图生成代码。)

此URL声明UML表示为“XMI格式”——一种基于XML的格式 表示UML的标准

如果您使用此标准,您的数据可能与 其他案例工具:

大多数UML工具都提供了将模型序列化为XMI格式的功能。XMI是一个基于XML的行业标准,用于在CASE工具之间交换元数据。因为XMI是基于XML的,所以可以在XSLT样式表的帮助下将其转换为其他格式,如XMLSchema。此类样式表的示例可在中找到

我猜这个XML可以用普通的C++ XML解析器解析,比如


Xerces或(对于Windows)MSXML/XML DOM。

也许我对您的解决方案了解不够,但听起来您似乎试图将决策树直接编码为UML中的树。我想你最好写下一个事件序列。。。每个单独事件的EN->T;因为它们是完全自包含的,所以检查起来很简单,插入(只需添加一个)或删除也很简单。序列集可以很容易地组合成一个树,查找事件链的公共前缀。现在你甚至不需要像UML这样的重量级引擎;一个带有命名事件的非常简单的DSL就足够了。@IraBaxter:我并不介意生成的代码是否是这样的序列。当然,它的效率要低得多,因为许多条件需要多次求值(…除非我创建一个缓存包装器)-而且这些条件中有许多计算起来非常昂贵(数据库查找等)。有关将要创建的一小段树的示例,请参阅。@IraBaxter:对于在用户级别执行此操作,使用“E1”、“E2”等描述性名称(易于理解,以便易于修改!)将很快使其转化为多行条件字符串。。。如果一个顶级分支中的决策需要增加,我将不得不编辑几十个叶子,它们是该决策的子节点。好的,那么你得到了一个折衷:通过指定单个事件序列来完全分离关注点,这样你就不必同时考虑其中的两个,或在早期事件常见变化的情况下易于修改。如果你有一个决定,在许多序列的低端,你将不得不编辑“几十片叶子”无论如何,所以它不清楚你的树方案真的买你很多。这些真的是纯序列事件吗?或者以某种偏序的事件组合,以及一些条件(A在B之前,A在C之前,系统处于E状态)?@IraBaxter:我当然更喜欢把这些事件放在一起考虑。这项工作通常是调查性质的——通过收集线索来缩小范围。几乎从来没有“什么不同的症状和条件可以指示模块时钟”