2016-06-15 55 views
-1

我有一个字符串表达式,我需要评估它为以下条件:如何评价括号使用堆栈上字符串在C#中

("Hello" OR "World") AND (("Go" OR "Stay") NOT "Stop") 

如何评估使用堆栈上面体现在哪里?上述表达式正在文本文件中执行。

感谢提前:)

+0

你到目前为止尝试过什么?任何尝试解决它或想法如何解决它? –

+0

这些操作符通常只有在具有* bool *操作数时才有意义。你要如何用*字符串来理解它将会需要很多想象力。 –

+0

我试图分割它并将它作为括号,运算符和操作数存储在3堆栈中。但我找不到一种方法来根据括号 – roj123

回答

1

我建议你使用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; 
    } 
} 

上面的代码只是一个例子,显示了库如何分析你自己的语法你的表情。你需要自己看看图书馆,并实施语法。

0

你不能比较字符串与布尔表达式,如& | ... 但是,我想你想说的是,该堆栈是否包含提到的字符串,你可以检查与方法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(); 
    } 
} 
+0

感谢您的答复,但我需要根据括号进行评估 – roj123