我正在写一个解析器的Scala为以下语法:解析器接受Scala中的任何字符串?
expr := "<" anyString ">" "<" anyString ">"
anyString := // any string
例如,"<foo> <bar>"
是一个有效的字符串,如"<http://www.example.com/example> <123>"
,并"<1> <_hello>"
到目前为止,我有以下几点:
object MyParser extends JavaTokenParsers {
override def skipWhitespace = false
def expr: Parser[Any] = "<" ~ anyString ~ ">" ~ whiteSpace ~ "<" ~ anyString ~ ">"
def anyString = ???
}
我的问题如下(我已经包括了我的疑似答案,但无论如何请确认,如果我没错的话):
如何实现接受任何字符串的正则表达式解析器?这必须有一个几乎微不足道的答案,如
def anyString = """\a*""".r
,其中\a
是代表任何字符的符号(尽管\a
可能不是我正在寻找的droid)。如果我设置
anyString
接受任何字符串,它会在>
符号之前停止,还是会运行直到字符串结束并失败?我相信它会一直运行直到字符串结束并失败,然后它最终会找到>
并消耗到那里。这似乎导致非常低效的解析器,并且对此的任何评论将不胜感激!如果有什么内
<
和>
字符串中包含>
符号(例如<fo>o> <bar>
)?将anyString
消耗到第一个>
还是最后一个?有没有什么方法可以指定它是否消耗最少或最多?为了解决上述问题,我想禁止
<
>
在anyString
。如何写这个?
谢谢!
你并不真的需要禁止'<',你呢?问题是,你需要'< c <- d >'被接受吗? –