Skip to content

Instantly share code, notes, and snippets.

@pikajude
Forked from anonymous/gist:1202131
Created September 7, 2011 23:28
Show Gist options
  • Save pikajude/1202133 to your computer and use it in GitHub Desktop.
Save pikajude/1202133 to your computer and use it in GitHub Desktop.
package ircdA.dAmn.util
import ircdA.dAmn.Packet._
import scala.util.parsing.combinator.RegexParsers
object PacketParser extends PacketParser
class PacketParser extends RegexParsers {
override def skipWhitespace = false
def identifier = """(\p{Alnum}+)""".r
def command = identifier
def param = """([\p{Alnum}:\-\.]+)""".r
def arg = ("""\n""".r ~> identifier) ~ ("=" ~> """([\p{Graph} ]+)""".r) ^^ { case key ~ value => (key, value) }
def args = (arg <~ """\n""".r.?) ~ (arg*) ^^ { case a ~ as => a :: as }
def body = """\n\n([\p{Graph}\p{Space}]*)"""
def packet:Parser[BasePacket] = command ~ (" " ~> param).? ~ args ~ body.? ^^
{ case cmd ~ prm ~ arglist ~ pk => PacketFactory.makePacket(cmd, prm, arglist.toMap, pk.map { _.toString }) }
def pattern = packet
}
// fails: expects "=" after "member"
PacketParser.parse(PacketParser.packet, "property chat:room\np=members\n\nmember member1\nproperty1=value1")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment