Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这个算术解析器有什么问题?_C#_Parsing - Fatal编程技术网

C# 这个算术解析器有什么问题?

C# 这个算术解析器有什么问题?,c#,parsing,C#,Parsing,下面是我编写的一个简单算术表达式解析器的代码: class ArithmeticExpressionParser<T> : Parser<T> where T : IConvertible { dynamic num1, num2; public override T Parse(string expr) { base.Parse(expr); ParseExpression(); return nu

下面是我编写的一个简单算术表达式解析器的代码:

class ArithmeticExpressionParser<T> : Parser<T> where T : IConvertible
{
    dynamic num1, num2;
    public override T Parse(string expr)
    {
        base.Parse(expr);
        ParseExpression();
        return num1;
    }

    T ParseExpression()
    {
        if(PeekNextToken())
            num1 = ParseFactorial();

        if (Token == '+')
        {
            GetNextToken();
            num2 = ParseExpression();
            num1 += num2;
        }

        else if (Token == '-')
        {
            GetNextToken();
            num2 = ParseExpression();

            num1 -= num2;
        }

        return num1;
    }

    T ParseFactorial()
    {
        if(PeekNextToken())
            num1 = ParseNumber();

        if (Token == '*')
        {
            GetNextToken();
            num2 = ParseFactorial();

            num1 *= num2;
        }

        else if (Token == '/')
        {
            GetNextToken();
            num2 = ParseFactorial();

            num1 /= num2;
        }

        else if (Token == '%')
        {
            GetNextToken();
            num2 = ParseFactorial();

            num1 %= num2;
        }

        return num1;
    }


    T ParseNumber()
    {
        string temp = String.Empty;

        while (char.IsDigit(Token))
        {
            temp += Token;
            GetNextToken();
        }

        return (T)Convert.ChangeType(temp, typeof(T));           
    }
}
现在的问题是,它不能给出正确的结果

  • 2+2*2返回8
  • 2+2+2+2返回16
  • 2+2-2返回0
…很多奇怪的结果

此外,请提出改进建议,以及实现同样目标的更好方法


注意:我正在尝试编写一个简单的算术

我没有解决方案,但是查看代码-“ParseExpression”和“ParseFactorial”操作并返回num1,这是所有人都可以访问的成员。以上一个例子2+2-2为例,发生的第一个操作是2-2=0,这将第一个读取值改写为等于2的num1。因此,在完成加法运算之前,num1=0,因此得到0

我检查了该逻辑是否给出了为3个示例提供的结果输出

我还发现了一个bug,如果没有空格或分隔符,您的代码永远不会读取最后一个字符

    protected char GetNextToken()
    {
        do
        {
            if(Count++ >= expression.Length-1) break;

        } while (char.IsWhiteSpace(expression[Count]));

        return expression[Count];
    }

    protected bool PeekNextToken()
    {
        if (Count + 1 < expression.Length)
            return true;
        else
            return false;
    }

    string expression;

    protected char Token
    {
        get
        {
            return expression[Count];
        }
    }

    int count;
    protected int Count
    {
        get { return count;  }
        set
        {
            if (value < expression.Length)
                count = value;
        }
    }