我真的不用疯狂使用编译器语法来实现DSL--对不起,我知道一些人喜欢它,我很乐意承认这是一个可爱的技巧,但是编写自己的解析器非常容易,为什么不呢做它?然后,您的文本中不会有随机逗号和下划线。
下面是一个简单的窍门,我用来实现一个简单的语法像你描述的一个:
首先,看你的命令 - 注意,大部分是在“动词名词PARAMS”格式
此映射真的很好地方法名,对象名,则params
所以一个很好的程序是:
split sentence into string array s
for a line with a single word (if s.length == 1):
instantiate an object with that name
call a default method on that object
done
for a line with more than one word
instantiate the object s[1]
call method s[0] with s[2...] as parameters
done
这种简单的5-10左右线解析r将解决您的许多DSL类型问题。除此之外,您可以轻松添加功能:
如果参数(2 ...)采用“name = value”形式,则扫描名为“name”的参数并传递该参数的“value”。这可能不适用于这种特定情况,但可以适用于其他用途。
如果您的单词命令需要参数,则尝试将s [0]实例化为一个类,即使有多个单词。如果失败,请回到上面的多字算法。
我有一种情况,在实例化后需要保持物体。我使用的语法:
find person:ana
,并从那时起(语法可以通过保持一个表映射全日空的人,一起试图实例化对象检查该表可以固定回原来的语法) ,ana是person类的一个实例(换句话说,在实例化“person”并调用方法“find”之后,我将该person对象存储在名为“ana”的散列中,下次他们使用命令如:
talk ana
它会搜索散列f首先,抓住存储在那里的对象,并在该现有对象上调用“talk”(在这一点上,它可以检查ana是否设置了“发现”标志,否则它可能会返回不同的消息)。通过这种方式,您可以拥有多个朋友,每个朋友都拥有自己的所有状态信息。
这个系统有一些限制,但仍比Ruby风格的DSL灵活得多,实际上并不难实现。