我有这段代码:
while(s.hasNext()){
//if (s.hasNext(LOOP)) { nodes.add(parseLoop(s)); }
if (s.hasNext("turnL;")){ nodes.add(new TurnLNode()); s.next();}
if (s.hasNext("turnR;")){ nodes.add(new TurnRNode()); s.next();}
if (s.hasNext("takeFuel;")){ nodes.add(new TakeFuelNode()); s.next();}
if (s.hasNext("wait;")){ nodes.add(new WaitNode()); s.next();}
if (s.hasNext("move;")){ nodes.add(new MoveNode()); s.next();}
else{
fail("Invalid command", s);
}
}
我正在扫描:
turnL;
move;
turnR
move;
它未能扫描;在第一行。有人可以告诉我为什么吗?
答案 0 :(得分:1)
当您拨打s.next()
时,扫描仪指针会前进,但while
正文中的所有其他语句仍会被执行。
此外,您的else
语句仅与您上一次if
语句相关。因此,当到达最后一个if
语句时,代码会识别出第一行与“move”不匹配并执行else
语句,因此失败。
您可以通过在所有if语句的末尾添加continue;
来解决此问题。这将使while循环前进到下一次迭代而不执行其他if语句。更好的编码风格是用if
替换除else if
语句之外的所有语句。
答案 1 :(得分:0)
使用s.next()返回turnL,然后是分号,然后移动,然后是下一个分号等等。一个快速的解决方法是使用正则表达式模式的turnL命令,然后在你的解析器中使用另一个分号模式,并检查分号是否遵循第一种模式。
这是因为查看你给出的分隔符,并在分配中阅读上面注释的代码,它说 //唯一的时间令牌可以彼此相邻 //当其中一个是(){}时;所以,它将半结肠与其他一切分开,这意味着您需要将分号添加为单独的检查