我正在寫一個解析器的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 >'被接受嗎? –