我试图解析一个带有负数和负号的字符串,并将每个标记添加到称为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;
}
}
}
答案 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)