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;
}
}