Skip to content

Instantly share code, notes, and snippets.

@mping
Forked from sujoyu/Main.scala
Created July 3, 2017 09:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mping/b3b159311ac18a9afd0ecd98ea11323b to your computer and use it in GitHub Desktop.
Save mping/b3b159311ac18a9afd0ecd98ea11323b to your computer and use it in GitHub Desktop.
Scala parser combinator sample like HTML tag.
import scala.util.parsing.combinator._
import scala.language.postfixOps
object Main {
def main(args:Array[String]) = {
val sc = new java.util.Scanner(System.in)
val input = collection.mutable.ListBuffer[String]()
while(sc.hasNextLine) {
input += sc.nextLine
}
HtmlTagParser.parse(input.mkString("\n"))
}
object HtmlTagParser extends RegexParsers {
def element: HtmlTagParser.Parser[Unit] = startTag ~ content ~ endTag ^? ({
case (stag ~ _ ~ etag) if stag == etag =>
}, _ => "error")
def startTag = "<" ~> tagName <~ tagAttr <~ ">"
def endTag = "</" ~> tagName <~ ">"
def tagName = """[a-zA-Z]+""".r
def tagAttr = """[^>]*""".r
def content = ("""[^<]*""".r ~ element)*
def parse(str: String) = parseAll(element, str) match {
case NoSuccess(_, next) => println(next.pos.line)
case _ =>
}
}
case class Tag(start: String, end: String) {}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment