Вяз парсер не может вернуть строку внутри фигурных скобок - PullRequest
0 голосов
/ 04 сентября 2018

Я новичок в библиотеке синтаксического анализатора Elm и пытаюсь отойти от использования регулярных выражений. Мне нужно проанализировать строку и вернуть список строк для каждой строки в двойных фигурных скобках, например: {{return this}} Я использую функцию Parser.sequence, и это мой код

block : Parser (List String) 
block = 
  Parser.sequence
    { start = "{{"
    , separator = ""
    , end = "}}"
    , spaces = spaces
    , item = getSource
    , trailing = Optional
    }

Мой вопрос: что мне делать в поле item, чтобы вернуть строку между фигурными скобками. Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Вам нужна функция, возвращающая Parser String. Вы можете использовать функцию variable :

block : Parser (List String)
block =
    Parser.sequence
        { start = "{{"
        , separator = ""
        , end = "}}"
        , spaces = spaces
        , item =
            Parser.variable
                { start = Char.isAlphaNum
                , inner = Char.isAlphaNum
                , reserved = Set.empty
                }
        , trailing = Optional
        }

Пример:

> Parser.run block "{{foo bar baz}}"
Ok ["foo","bar","baz"]
    : Result (List Parser.DeadEnd) (List String)
0 голосов
/ 05 сентября 2018

А как насчет создания собственного парсера для слова?

word : Parser String
word =
  getChompedString <|
    succeed ()
      |. chompIf Char.isAlphaNum
      |. chompWhile Char.isAlphaNum

На самом деле это буквенные символы, поэтому {{return textABC123}} будет иметь вид Ok ["return","textASD234"]. Для {{return text}} Char.isLower достаточно.

Тогда вы можете использовать его в sequence вместо getSource (так как getSource также выбивает } символов, что не подходит в текущей ситуации):

block : Parser (List String) 
block = 
  Parser.sequence
    { start = "{{"
    , separator = ""
    , end = "}}"
    , spaces = spaces
    , item = word
    , trailing = Optional
    }

Вот пример приложения ellie , демонстрирующий это.

...