我们有一个图形设计器,现在他们需要一个基于文本的设计器。建议?

2024-06-14 00:07:41 发布

您现在位置:Python中文网/ 问答频道 /正文

对不起,我想不出更好的书名了。在

问题是:

对于我们的客户,我们创建了(作为一个更大的应用程序的一部分)一个 他们可以用来构建“场景”的图形设计器。在

这些场景由“复合材料”组成,而复合材料又包括 “命令”的。这些命令对象都从CommandBase和 实现一个称为ICompilable的接口。在

scenario类还实现了ICompilable。调用Compile()时 在命令中,返回一个字节数组,然后将其发送到设备 他们的目的(不能透露太多关于硬件的信息,抱歉)

给你一个想法:

var scenario = new Scenario();

scenario.Add(new DelayCommand(1));
scenario.Add(new CountWithValueCommand(1,ActionEnum.Add,1));
scenario.Add(new DirectPowerCommand(23,false,150));
scenario.Add(new WaitCommand(3));
scenario.Add(new DirectPowerCommand(23,false,150));
scenario.Add(new SkipIfCommand(1,OperatorEnum.SmallerThan,10));
scenario.Add(new JumpCommand(2));

byte[] compiledData = scenario.Compile();

图形设计师从用户那里抽象出所有这些,并允许 他(或她)简单地将复合材料拖到设计师的表面上。 (Composites可以对命令进行分组,这样我们就可以为返回任务提供构建块)

最近,我们的客户来找我们说,“设计师真的很酷, 但我们有些人更愿意使用某种编程语言, 只是一些简单的事情。”

(当然对他们来说很简单)

我很想为他们提供一种简单的语言, 它可以调用各种命令,也可以将SkipIfCommand替换为 更好的结构等。。。在

我不知道从哪里开始,也不知道我的选择是什么(不破坏我们现有的)

我听说有人嵌入了Python之类的语言, 人们写他们自己的语言和解析器等。。。在

有什么建议吗?在

PS:用户只使用复合材料,从不使用命令。 组合在运行时动态加载(连同它们的图形设计器) 可由第三方在单独的组件中提供。在


Tags: 命令add语言false图形new客户场景
3条回答

对于简单的DSL来说,这看起来是一个完美的场景。有关详细信息,请参见http://msdn.microsoft.com/en-us/library/bb126235(VS.80).aspx。在

您还可以使用脚本语言,如lua.Net网站. 在

据我所知,你有两个选择

您可以使用XML样式的“标记”让它们定义实体及其分组,但这可能不是最好的方法。在

你的替代方案是,你可以嵌入一种语言,但你真的需要,这不过分杀伤力,你如何控制它?在

如果您只需要非常简单的语法,那么也许可以编写您自己的语言。实际上,创建一个简单的解释器并不难,只要你有一个严格、明确的语言。看看你正在使用的编译器的一些例子吧,c#?在

我在uni用java编写了一个非常简单的interperter,它没有你想象的那么难。在

如果你真的只想要一种非常简单的语言,你需要一个“递归下降解析器”。在

例如,像这样的语言:

SCENARIO MyScenario
DELAY 1
COUNT 1 ADD 1
DIRECT_POWER 23, False, 150
WAIT 3
...
END_SCENARIO

你可能有如下语法:

^{pr2}$

代码如下:

def scenario():
    match_word('SCENARIO')
    scenario_name = match_label()
    emit('var scenario = new Scenario();')
    cmds()
    match_word('END_SCENARIO')
    emit('byte[] ' + scenario_name + ' = scenario.Compile();')

def delay():
    match_word('DELAY')
    length = match_number()
    emit('scenario.Add(new DelayCommand('+ length +'))')

def cmds():
    word = peek_next_word()
    if word == 'DELAY':
       delay()
    elif ...

相关问题 更多 >