Лексический анализ строкового токена с использованием Parsec - PullRequest
1 голос
/ 02 марта 2012

У меня есть этот парсер для разбора строк с использованием библиотеки Haskell 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'), но эти строки также могут содержать ' внутри него (в этом случае ' должен быть экранирован другой ', бывший 'this is my string with '' inside of it').

Что мне нужно сделать, так это посмотреть вперед, когда ' появляется во время синтаксического анализа строки, и решить, есть ли другой ' после или нет (если нет, вернуть конец строки). Но я не знаю, как это сделать. Есть идеи? Спасибо!

Ответы [ 3 ]

5 голосов
/ 02 марта 2012

Если синтаксис настолько прост, как кажется, вы можете создать специальный случай для экранированной одинарной кавычки

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

и использовать его в

myStringLiteral = lexeme $ do
    char '\''
    str <- many escapeOrStringChar
    char '\'' <?> "end of string"
    return str
0 голосов
/ 23 ноября 2012

Для этого вы можете использовать stringLiteral .

0 голосов
/ 02 марта 2012

Parsec работает только с языками LL (1) ( подробности ). Это означает, что парсер может смотреть только один символ за раз. Ваш язык - LL (2). Вы можете написать свой FSM для анализа вашего языка. Или вы можете преобразовать текст перед анализом, чтобы сделать его LL (1).

Фактически, Parsec предназначен для синтаксического анализа, а не лексического. Хорошая идея - провести лексический анализ с помощью другого инструмента, а затем использовать Parsec для анализа последовательности лексем вместо последовательности символов.

...