После некоторых исследований я думаю, что, возможно, нашел решение, однако оно не применимо в Scala.Требуется рекурсивное регулярное выражение, которое соответствует сбалансированным конструкциям, в моем случае:
\[(?:[+-\[\]]|(?R))*\]
, и, насколько я знаю, такие типы не поддерживаются в Scala, поэтому я просто оставлю это здесь, если кому-то понадобитсяэто для других языков.
Однако я решил свою проблему, реализовав синтаксический анализатор другим способом, я просто подумал, что такое регулярное выражение было бы более простым и гладким решением.То, что я реализовывал, было интерпретатором языка мозгового безумия, и вот мой класс парсера:
class brainfuck(var pointer: Int, var array: Array[Int]) extends JavaTokenParsers {
def Program = rep(Statement) ^^ { _ => () }
def Statement: Parser[Unit] =
"+" ^^ { _ => array(pointer) = array(pointer) + 1 } |
"-" ^^ { _ => array(pointer) = array(pointer) - 1 } |
"." ^^ { _ => println("elem: " + array(pointer).toChar) } |
"," ^^ { _ => array(pointer) = readChar().toInt } |
">" ^^ { _ => pointer = pointer + 1 } |
"<" ^^ { _ => pointer = pointer - 1 } |
"[" ~> rep(block|squares) <~ "]" ^^ { items => while(array(pointer)!=0) { parseAll(Program,items.mkString) } }
def block =
"""[-+.,<>]""".r ^^ { b => b.toString() }
def squares: Parser[String] = "[" ~> rep(block|squares) <~ "]" ^^ { b => var res = "[" + b.mkString + "]"; res }
}