Elm Parser无法在花括号内返回字符串

时间:2018-09-04 18:04:49

标签: parsing elm

我是Elm解析器库的新手,我正尝试远离使用正则表达式。我需要解析一个字符串并为双花括号内的每个字符串返回一个字符串列表,例如{{return this}}我正在使用Parser.sequence函数,这是我的代码

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

我的问题是,在item字段中我该怎么做才能返回花括号之间的字符串。谢谢!

2 个答案:

答案 0 :(得分:6)

如何为单词创建自己的解析器?

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
    }

这里是an ellie-app example,对此进行了演示。

答案 1 :(得分:0)

您需要一个返回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)