我有一个字符串表达式,我需要评估它为以下条件:如何评价括号使用堆栈上字符串在C#中
("Hello" OR "World") AND (("Go" OR "Stay") NOT "Stop")
如何评估使用堆栈上面体现在哪里?上述表达式正在文本文件中执行。
感谢提前:)
我有一个字符串表达式,我需要评估它为以下条件:如何评价括号使用堆栈上字符串在C#中
("Hello" OR "World") AND (("Go" OR "Stay") NOT "Stop")
如何评估使用堆栈上面体现在哪里?上述表达式正在文本文件中执行。
感谢提前:)
我建议你使用Irony,它允许你定义自己的表情和告诉解释如何评价它。我在我的项目中使用了这个,与你的情况类似。我不能发布的原代码,因为它是用于商业用途,但它看起来像这样:
class CommandGrammar : Grammar //define your own grammar
{
public CommandGrammar(bool caseSensitive = false)
: base(caseSensitive)
{
var Command = new NonTerminal("Command");
Command.Rule = ToTerm("GO") | "STOP" | "STAY";
//these 3 tokens are called "command"
var And = new NonTerminal("And", ToTerm("AND"));
var Or = new NonTerminal("Or", ToTerm("OR"));
var Not = new NonTerminal("Not", ToTerm("NOT"));
//define 3 logical operators
var UnaryOperator = new NonTerminal("UnaryOperator");
var BinaryOperator = new NonTerminal("BinaryOperator");
var SimpleExp = new NonTerminal("SimpleExp");
var ParenthesizedExp = new NonTerminal("ParenthesizedExp");
var UnaryExp = new NonTerminal("UnaryExp");
var BinaryExp = new NonTerminal("BinaryExp");
var Exp = new NonTerminal("Exp");
//there are some possible expressions
//here are the rules for parsing the expression
UnaryOperator.Rule = Not;
BinaryOperator.Rule = And | Or;
SimpleExp.Rule = Command;
ParenthesizedExp.Rule = "(" + Exp + ")";
UnaryExp.Rule = (UnaryOperator + SimpleExp) | (UnaryOperator + ParenthesizedExp);
BinaryExp.Rule = Exp + BinaryOperator + Exp;
Exp.Rule = SimpleExp | ParenthesizedExp | UnaryExp | BinaryExp;
}
}
上面的代码只是一个例子,显示了库如何分析你自己的语法你的表情。你需要自己看看图书馆,并实施语法。
你不能比较字符串与布尔表达式,如& | ... 但是,我想你想说的是,该堆栈是否包含提到的字符串,你可以检查与方法contains(obj)which返回一个布尔值:
class Program
{
const string a = "Hello";
const string b = "World";
const string c = "Go";
const string d = "Stay";
const string e = "Stop";
static void Main(string[] args)
{
Stack st = new Stack();
st.Push(a);
st.Push(b);
st.Push(c);
st.Push(d);
st.Push(e);
if ((st.Contains("Hello") || st.Contains("World")) && ((st.Contains("Go") || st.Contains("Stay")) && (st.Contains("Stop") == false)))
{
Console.WriteLine("Success");
} // no success
//Remove "Stop" to match the expression
st.Pop();
if ((st.Contains("Hello") || st.Contains("World")) && ((st.Contains("Go") || st.Contains("Stay")) && (st.Contains("Stop") == false)))
{
Console.WriteLine("Success");
} //success
Console.ReadLine();
}
}
感谢您的答复,但我需要根据括号进行评估 – roj123
你到目前为止尝试过什么?任何尝试解决它或想法如何解决它? –
这些操作符通常只有在具有* bool *操作数时才有意义。你要如何用*字符串来理解它将会需要很多想象力。 –
我试图分割它并将它作为括号,运算符和操作数存储在3堆栈中。但我找不到一种方法来根据括号 – roj123