wipman
wipman

Reputation: 581

Retrieve object method

I have an "object" with the following typo within a string: {myObjectIdIKnow?someInfo,{someBracedInfo},{someOtherBracedInfo},someInfo,...,lastInfo}.

I want to retrieve its content (i.e. from someInfo to lastInfo).

Following, the function I built:

def retrieveMyObject(line: String, myObjectId: String) =
{
    if (line.contains(myObjectId))
    {
        var openingDelimiterCount = 0
        var closingDelimiterCount = 0
        val bit = iLine.split(myObjectIdIKnow).last

        var i = -1
        do
        {
            i += 1
            if (bit(i).equals("{")) openingDelimiterCount += 1
            else if (bit(i).equals("}")) closingDelimiterCount += 1
        } while (lDelimiterOpeningCount >= closingDelimiterCount)

        if (i.equals(0)) bit
        else bit.splitAt(i)._1
    }
}

I match with my myObjectId and browse through each character of the input line to check if it is a brace delimiter or not, then compare the numbers of { and }: if the second is bigger than the first, it means I reached the end of my content and thus I retrieve it.

It does not seem like a good method at all and I was wondering what better way could I do it?

Upvotes: 0

Views: 69

Answers (1)

yahor
yahor

Reputation: 401

I've tried to implement simple parser using Scala Parser Combinators. Here is what I got. I'm not very experienced with parser combinator but did something working just for the sake of curiosity.

import scala.util.parsing.combinator.JavaTokenParsers

case class InfoObject(id: String, objInfo: String, bracedInfos: List[String], infos: List[String])

class ObjectParser extends JavaTokenParsers {

  def objDefinition: Parser[InfoObject] = "{" ~> (idPlusInfo <~ ",") ~ (bracedInfos <~ ",") ~ infos <~ "}" ^^ {
    case (id, objInfo) ~ bracedInfos ~ infos => InfoObject(id, objInfo, bracedInfos, infos)
  }

  def idPlusInfo: Parser[(String, String)] = (infoObj <~ "?") ~ infoObj ^^ { case id ~ info => (id, info) }

  def bracedInfos: Parser[List[String]] = repsep(bracedInfo, ",")

  def bracedInfo: Parser[String] = "{" ~> infoObj <~ "}"

  def infos: Parser[List[String]] = repsep(infoObj, ",")

  def infoObj: Parser[String] = """\w+""".r
}

val parser = new ObjectParser()

parser.parse(parser.infoObj, "someInfo").get == "someInfo"  // true

parser.parse(parser.bracedInfo, "{someBracedInfo}").get == "someBracedInfo" // true

val expected = InfoObject(
  "myObjectIdIKnow",
  "someInfo",
  List("someBracedInfo", "someOtherBracedInfo"),
  List("someInfo", "lastInfo")
)

val objectDef = "{myObjectIdIKnow?someInfo,{someBracedInfo},{someOtherBracedInfo},someInfo,lastInfo}"

parser.parse(parser.objDefinition, objectDef).get == expected  // true

Upvotes: 1

Related Questions