2012-03-02 49 views
1

我有使用Haskell Parsec庫進行字符串分析的此分析器。使用Parsec進行字符串標記的詞法分析

myStringLiteral = lexeme (
     do str <- between (char '\'') 
        (char '\'' <?> "end of string") 
        (many stringChar) 
        ; return (U.replace "''" "'" (foldr (maybe id (:)) "" str)) 

     <?> "literal string" 
     ) 

串在我的語言被定義爲''(例如:'this is my string')內的α-num個字符,但這些字符串也可以包含'它裏面(在這種情況下',必須由另外',前逃脫'this is my string with '' inside of it')。

我需要做的是在字符串解析過程中出現',並判斷是否有另一個'(如果否,返回字符串的結尾)。但我不知道該怎麼做。有任何想法嗎?謝謝!

回答

5

如果語法像看起來那麼簡單,你可以做一個特殊的情況下逃脫單引號,

escapeOrStringChar :: Parser Char 
escapeOrStringChar = try (string "''" >> return '\'') <|> stringChar 

和使用,在

myStringLiteral = lexeme $ do 
    char '\'' 
    str <- many escapeOrStringChar 
    char '\'' <?> "end of string" 
    return str 
+0

非常好!謝啦! – 2012-03-02 23:06:15

-1

Parsec只處理LL(1)種語言(details)。這意味着解析器一次只能看一個符號。你的語言是LL(2)。你可以編寫自己的FSM來解析你的語言。或者,您可以在解析之前將文本轉換爲LL(1)。

事實上,Parsec是專爲語法分析而非詞彙。好主意是用其他工具進行詞法分析,而不是使用Parsec來解析詞位序列而不是字符序列。

+2

Parsec可以使用'try'組合器處理非LL(1)語法。 – bzn 2012-03-02 18:04:52

+0

Parsec使用字符級解析器很容易 - 所以它可以被認爲是一個_scannerless parser_。使用單獨的詞法分析器當然是可能的(在Daan Leijen的原始手冊中有介紹),但它需要更大膽的平板。 – 2012-03-02 18:17:44

+1

另外,Parsec可以處理上下文敏感的解析(它不僅適用於Monad),因此它可以處理比LL(1)更大的語法類。 – 2012-03-02 18:24:34

相關問題