如何删除'标识符预期但整数文字发现错误'在斯卡拉?

时间:2018-04-13 12:13:09

标签: scala

我正在尝试构建一个函数来识别表达式是否具有平衡括号。

我的问题是我的变量opening_index和closing_index的函数出现了这个错误:

   Error:(3, 30) identifier expected but integer literal found.
  var  opening_index: Int =-1     
   Error:(6, 30) identifier expected but integer literal found.
  var  closing_index: Int =-1    
   Error:(34, 30) identifier expected but integer literal found.
  var  opening_index: Int =-1  
  Error:(37, 30) identifier expected but integer literal found.
  var  closing_index: Int =-1

我一直在谷歌搜索我的错误,最后一小时没有找到任何有价值的线索。

这是我的代码:

object Test
 {

  def balance(chars: List[Char]): Boolean=
   {     
    var  opening_index: Int =-1

    var  closing_index: Int =-1

  opening_index=chars.indexOf('(')
  closing_index=chars.indexOf(')')
  if (opening_index ==-1 && closing_index==-1)
    {

      true
    }
  if (closing_index>-1 && opening_index>-1)
    {
      if (closing_index<=opening_index) return(false)
      else
      {
        balance(chars.drop(closing_index).drop(opening_index))
      }
    }
  else
    return (false)
}
}

3 个答案:

答案 0 :(得分:4)

令牌器不知道令牌结束或启动的位置。使用一些分隔符,这使得代码对于人类来说也更具可读性:

  def balance (chars: List[Char]): Boolean =
  {     
    val opening_index: Int = chars.indexOf ('(')
    val closing_index: Int = chars.indexOf (')')

由于您只是初始化您的vars以便再次直接重新初始化它们,您可以通过将它们声明为val来轻松获得一些功能点:

return (false)

对于递归调用,您不必费心 - 它们会生成一对新的值,这些值不会干扰调用上下文的值。

您可能还会注意到,返回语句不需要使用parens return false进行函数调用,但可以写为object Test { def balance (chars: List[Char]): Boolean = { val opening_index: Int = chars.indexOf ('(') val closing_index: Int = chars.indexOf (')') if (opening_index == -1 && closing_index == -1) { true // but note the else in the 2nd next line } else if (closing_index > -1 && opening_index > -1) { if (closing_index <= opening_index) false else balance (chars.drop (closing_index).drop (opening_index)) } else false } } ,甚至返回关键字也大部分时间都是超级的。< / p>

{{1}}

答案 1 :(得分:1)

当Scala看到=-1时,它会被标记化(拆分)而不是= -1(与您可能熟悉的其他语言一样),但是=- { {1}},因为1是Scala中完美的标识符。

由于=-尚未见到,因此整个=必须是一种类型。通过类型的中缀表示法,它等同于Int =- 1。除=-[Int, 1]之外,此处必须是类型。要成为一个类型,它应该以标识符开头,这就是错误消息所说的内容。如果您修复了此问题,则会在下一步抱怨未知的1类型。

答案 2 :(得分:1)

这可以通过计算每个中有多少并查看数字是否匹配来简化:

def balance (chars: List[Char]): Boolean = {
  val opening = chars.count(_ == '(')
  val closing = chars.count(_ == ')')
  opening == closing
}

balance(List('(', ')', '(', ')', '(')) //false
balance(List('(', ')', '(', ')')) //true

如果您希望平衡括号按顺序排列,则可以递归执行:

def balance(chars: List[Char], open: Int = 0): Boolean = {
  if (chars.isEmpty)
    open == 0
  else if (chars.head == '(')
    balance(chars.tail, open + 1)
  else if (chars.head == ')' && open > 0)
    balance(chars.tail, open - 1)
  else
    balance(chars.tail, open)
}

val x = "(apple + pear + (banana)))".toList
balance(x) //true

val y = "(()(".toList
balance(y) //false

这将遍历列表的每个元素,并添加/减去/名称为open的变量,直到列表为空,此时如果open为0,则返回true否则返回false