parsec

    3熱度

    1回答

    Parsec文件說,大約<|> 這個組合子實現選擇以下。解析器p首先應用p。 如果成功,則返回p的值。如果p沒有輸入 而失敗,則嘗試解析器q。此組合器定義爲 等於MonadPlus類的mplus成員和Control.Applicative.Alternative的 (Control.Applicative。< |>)成員。 如何實現<|>的反向跟蹤版本?它在p消耗任何輸入時回退,例如q可以再次應用

    0熱度

    1回答

    所以我有一個邏輯語句,比如「((A o B)a B)o(B a C)」,我想將括號內的每組語句解析爲列表...這是我迄今爲止,但因爲即時通訊新的哈斯克爾我不知道如果IM在正確的軌道上 編輯:我現在再次。 所以現在的問題是兩件事情! (1)我有麻煩返回一個字符串列表 (2)當我運行它,現在我得到意想不到的「(」 statement :: Parser String statement = many

    0熱度

    2回答

    我使用GHC在Windows上進行編譯。這裏是我的代碼(also available here): module GMC.GMLParser (parseGML) where import Control.Applicative ((<$>), (<*>)) import Text.ParserCombinators.Parsec import Text.ParserCombinators

    4熱度

    2回答

    ,例如 "((a b c) a b c)" 到 ["((a b c) a b c)","(a b c)"] 我會怎麼做使用parsec?使用between看起來不錯,但似乎不可能用開始和結束值分開。

    4熱度

    1回答

    我正在使用GHC在Windows上編譯。這裏是我的參考代碼http://hpaste.org/86539 問題是下面的表達式不解析: 3+2 < 1+-4 <= -3 << 1。 。但是,我得到意想不到的-當它顯然是最高的運營商:因爲它應該解析。我懷疑這是因爲我在第55行使用try,但是沒有它<和<<,而重複一個符號的運算符不能正確解析。 我在尋求建議或提示。

    14熱度

    1回答

    我對Parsec的一個常見問題是,如果它出現在「正確」的位置,它往往會忽略無效輸入。 舉一個具體的例子,假設我們有integer :: Parser Int,我寫 expression = sepBy integer (char '+') (忽略了片刻空白的問題。) 這正確解析像 「123 + 456 + 789」。然而,如果我餵它「123 + 456-789」,它愉快地忽略了非法的「 - 」

    2熱度

    1回答

    ,以供參考,在這裏是我的代碼:http://hpaste.org/86949 我試圖解析以下表達式:if (a[1].b[2].c.d[999].e[1+1].f > 3) { }。調用的方法是varExpr,它解析可變成員鏈。 語境 在我解析語言,一個點可以指定訪問一個成員變量。由於成員變量可以是另一個對象,所以可以生成鏈,即:a.b.c,或者本質上爲(a.b).c。不要以爲這些點是功能組成。

    1熱度

    2回答

    從Text.Parsec.Token: lexeme p = do { x <- p; whiteSpace; return x } 看來,語義需要一個解析器P和提供具有相同行爲爲p解析器,但它也跳過所有尾隨的空白。正確? 那爲什麼下面不工作:在下面的錯誤消息 constant :: Parser Int constant = do digits <- many1 digit

    6熱度

    2回答

    我試圖做一些測試與自定義正則表達式引擎,但我厭倦了手工出寫的NFA的初步解釋,所以我試着讓一個解析器成功一點點。通常當人們解析一個正則表達式時,他們會創建多箇中間結構,最終轉換成最終的機器。對於我簡單的NFA定義,我相信解析實際上可以一次完成,儘管我還沒有確定(a)爲什麼它實際上不能或(b)怎麼做,雖然我的解析器可以解析非常簡單聲明。 的(簡化的)狀態的實體一樣定義,以便[1]: type Tag

    10熱度

    1回答

    是否有可能以某種方式獲得一些自定義類型的分析錯誤?例如,獲取有關解析錯誤上下文的更多信息會很酷。只是以短信的形式出現錯誤信息似乎並不方便。