如何使字符串解析器终止

问题描述 投票:0回答:1

我有一个双引号字符串的解析器,该解析器通常可以正常工作,但是如果缺少引号,它将永远循环并导致应用程序崩溃。

它是用Elm编写的Web应用程序的一部分,使用elm/parser

基于Elm Github的example。>>

这里是一个最小的示例(run it in Ellie;将toParse更改为“ \”“,这会导致制表符崩溃。

module Main exposing (main)

import Html
import Parser as P exposing ((|.), (|=))
import Debug


stringP : P.Parser String                                             
stringP =
    P.succeed identity 
        |. P.token "\""                                               
        |= P.loop [] stringHelp


stringHelp : List String -> P.Parser (P.Step (List String) String)    
stringHelp revChunks =                                                
    P.oneOf        
        [ P.token "\""                                                
            |> P.map (\_ -> P.Done (String.join "" (List.reverse revChunks)))  
        , P.chompWhile isUninteresting                                
            |> P.getChompedString                                     
            |> P.map (\chunk -> P.Loop (chunk :: revChunks))          
        ]                                                             


isUninteresting : Char -> Bool
isUninteresting char =
    char /= '\\' && char /= '"'


toParse =
    "\""


main =
    Html.text <| Debug.toString <| P.run stringP toParse

我可以从某种程度上看到问题所在-即使到达输入结束,chompWhile位也会成功。我需要类似this的内容,但在这种情况下无法完全解决。

我有一个用于双引号字符串的解析器,该解析器通常可以正常工作,但是如果缺少引号,它将永远循环并导致应用崩溃。它是用Elm编写的Web应用程序的一部分,使用elm / parser。 ...

parsing elm
1个回答
0
投票

我发现解决方案是跟踪解析位置,如果位置没有增加,则退出循环。虽然不是很漂亮。也许有人会想出更好的东西。

© www.soinside.com 2019 - 2024. All rights reserved.