你可以解析A
来构造指令树,然后从树叶开始执行它们(因为我假设你想先执行最内层括号的内容)。对于这个解析任务,你可以使用正则表达式,或其他任何你想要的。关于我的头顶,我认为你可以先查找圆括号和运算符符号来找出树结构,然后用实际的基本指令和与操作符的每个交点填充每个叶子。
数据结构存储A
可以由实现接口IOperand
的对象(称为它们Expression
)组成;每个Expression
应该有三个领域:
- 场
Operator
这是enum Operations {Union, Intersection, SetDiff}
一个实例,或只是一个字符串,这取决于你喜欢。
- 两个字段
Operand1
和Operand2
,它们可以是“Ah”(定义一组卡片)或另一个Expression
。因此,应将其声明为IOperand
的实例。
你的班级持有一套卡,如“啊”,也应该实现这个IOperand
。界面IOperand
本身实际上不需要做任何事情。
对于每一个给定的指令匹配的操作,您可以使用一个简单的开关,或者的string
(或enum
)到delegate IOperand SetOp(IOperand, IOperand);
一个Dictionary
,然后填充您Dictionary
用(匿名)功能(将包含的说明B
)。
在Dictionary
情况下,您只需将能够做到instructionList[thisExpression.Operation](thisExpression);
(这大概可以做到更优雅一点,以避免引用thisExpression
两次)和字符串输入适当的C#转换将被执行。概念
证明
我已经做了基本的实现和控制台应用程序演示使用这里:https://bitbucket.org/Superbest/lexer
如果你在整个锻炼你的理智完好(电脑会进展成功使用你作为代理解析和操作库,所以祝你好运),那么最后一步应该要求你评估一个等于C
的表达式,然后打印你刚才输入的内容。 (第一次运行时,您可能想要遵守程序指令,我怀疑破解代码和获取大量例外非常容易,如果您想要考虑发生了什么情况,您会非常困惑自己。输入)
如果您正在为运行这些代码,尝试回答以下序列(=输入):
n, y, 2, n, n, n, y, 2, n, n, y, n, y, 2, n, n, n, n, alpha, beta, gamma
你的输出将是:
gamma
你应该能够简单地更新标记为过时的方法的主体并进行工作ng程序。
如果您希望添加更多二进制操作,请参阅Simplification.Simplification()
正文中的TODO。通过查看我已经完成的三项操作,适当的语法将会很明显;实际上,代码仅支持二进制操作。如果您的方法使用字符串,则可以使用SimplifiedOperand.Symbol
字段。
Downvoter,照顾评论? –
您能否提供A符合的语法规范以及它是如何翻译为B的? – Superbest
我写了一个名为TokenIcer的词法分析器,它可能正是您的项目所需要的。检查[项目在这里](http://www.codeproject.com/Articles/220042/Easily-Create-Your-Own-Parser)。它将以您希望的任何.NET语言为您创建代码!您只需将规则定义为RegEx表达式,并自动为整个词法分析器创建源代码。另外,我写了一个使用TokenIcer的数学解析器。有了这个,你可以看到如何解析表达式。看看它[这里](http://www.codeproject.com/Articles/274093/Math-Parser-NET) – Icemanind