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

时间:2018-10-25 19:15:34

标签: java string parsing

我试图解析一个带有负数和负号的字符串,并将每个标记添加到称为infix的队列中,并添加一个函数来判断该标记是否为运算符。但是,负数会被视为减号,并与负数分开添加到队列中。这是我的代码,用于将字符串分解为数字并将其添加到队列中。

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

            }
        }

和评估类

public class Eval 
{
    public boolean isOperator(String n)
    {
        switch(n)
        {
        case "(":
            return true;
        case ")":
            return true;
        case "*":
            return true;
        case "/":
            return true;
        case "+":
            return true;
        case "-":
            return true;
        case "#":
            return true;
        }

        return false;
    }

    public int Priority(String op)
    {
        switch(op)
        {
        case "(":
            return 3;
        case "*":
            return 2;
        case "/":
            return 2;
        case "+":
            return 1;
        case "-":
            return 1;

        }
        return 0;
    }

}

    }

2 个答案:

答案 0 :(得分:0)

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

不过,以您的方式进行处理,我首先要从您的循环中提取一些功能,也许是eval.lexNumber(String expression, int index)

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

答案 1 :(得分:-1)

for filename in os.listdir(path):
    if not filename.endswith('.xml'): continue
    fullname = os.path.join(path, filename)
    with open(fullname, 'r') as f:
        xmlString = f.read()
    jsonString = json.dumps(xmltodict.parse(xmlString), indent=4)
    with open('converted.json', 'w') as x: # just changed fullname to converted.json
        x.write(jsonString)