Я пишу парсер 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
, вероятно, не тот дроид, который я ищу).Если я установил
anyString
, чтобы принять любую строку, будет ли она остановлена перед символом>
или она будет работать до конца строки и не будет выполнена? Я верю, что он запустится до конца строки и не удастся, и тогда он, в конце концов, найдет>
и уничтожит там. Это, по-видимому, приводит к очень неэффективному парсеру, и любые комментарии по этому поводу будут оценены!Что, если строка в пределах
<
и>
содержит>
символ (например,<fo>o> <bar>
)? Будет лиanyString
потреблять до первого>
или последний? Есть ли способ указать, потребляет ли он наименее возможное, или больше всего?Чтобы исправить предыдущий пункт, я хотел бы запретить
<
>
вanyString
. Как это написать?
Спасибо!
Вам не нужно запрещать '<', не так ли? Вопрос в том, нужен ли вам '< c <- d >' для принятия или нет? –