Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
Java 如何解析带有负数和减号的算术字符串表达式?_Java_String_Parsing - Fatal编程技术网

Java 如何解析带有负数和减号的算术字符串表达式?

Java 如何解析带有负数和减号的算术字符串表达式?,java,string,parsing,Java,String,Parsing,我试图解析一个包含负数和负号的字符串,并将每个令牌添加到一个名为中缀的队列和一个函数中,以判断该令牌是否是运算符。但是,负数被视为负号,并与负数分开添加到队列中。下面是我的代码,用于将字符串拆分为数字并将其添加到队列中 for(int i = 0;i < expression.length();i++) // add all items from the expression to the infix queue { String value = S

我试图解析一个包含负数和负号的字符串,并将每个令牌添加到一个名为中缀的队列和一个函数中,以判断该令牌是否是运算符。但是,负数被视为负号,并与负数分开添加到队列中。下面是我的代码,用于将字符串拆分为数字并将其添加到队列中

for(int i = 0;i < expression.length();i++) // add all items from the expression to the infix queue
        {
            String value = String.valueOf(expression.charAt(i));

            if(eval.isOperator(value) == true)
            {
                infix.add(value);
            }
            else
            {
                for(int j = i+1; eval.isOperator(String.valueOf(expression.charAt(j))) == false; j++)//add token to value until an operator is found and that number ends
                {
                    value += expression.charAt(j);
                    i++;
                }

                    infix.add(value);

            }
        }

大多数语言处理这个问题的方法是以后再做。正如@Sweeper所说,
-
将是一个运算符,稍后代码将选择这是一个二进制运算符还是一元运算符。假设您计划在某个时候对这些表达式求值,那么这样做最终将不会有太多额外的工作

不过,为了按照您的方式处理它,我将首先从您的循环中提取一些函数,可能是
eval.lexNumber(字符串表达式,int索引)

for(int j = i+1; eval.isOperator(String.valueOf(expression.charAt(j))) == false; j++)
那么这只是一个明确检查的问题:

if (value == "-" && isNumber(expression.charAt(j+1))
{
    // I assume you have access to some sort of isNumber function
    // and that you can check for an out of bounds access on your own 
    infix.add("-" + lexNumber(expression, j+1));
}
else if(eval.isOperator(value) == true)
{
     infix.add(value);
}
else
{ 
    // etc
}
这是一个粗略的、未经测试的正确方向,忽略了小问题。特别是更新循环索引的问题。我建议使用一些新类来封装表达式源代码和当前位置。比如:

while (tokenStream.hasNext())
{
    infix.add(tokenStream.next());
}

什么是中缀?不将
-
视为中缀运算符如何?如果您只是将其视为一个数字(操作数)的一部分,并在看到一个正数后跟一个负数时自动添加一个
+
运算符,它应该可以正常工作。请提供一些你想要的行为和你不想要的行为的小的具体例子。我正在从字符串添加令牌的队列添加了eval类eval类eval.lexNumber()函数是什么?@GeoffM基本上就是你使用
for(int j=i+1;eval.isOperator(string.valueOf(expression.charAt(j)))==false;j++)
if (value == "-" && isNumber(expression.charAt(j+1))
{
    // I assume you have access to some sort of isNumber function
    // and that you can check for an out of bounds access on your own 
    infix.add("-" + lexNumber(expression, j+1));
}
else if(eval.isOperator(value) == true)
{
     infix.add(value);
}
else
{ 
    // etc
}
while (tokenStream.hasNext())
{
    infix.add(tokenStream.next());
}