1

HaskellParsecライブラリを使用した文字列解析用のこのパーサーがあります。

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'ますが、これらの文字列はその中に含めることもできます'(この場合'、別'のexでエスケープする必要があります'this is my string with '' inside of it')。

'私がする必要があるのは、文字列の解析中に表示されるのを楽しみにして、'後に別の文字列があるかどうかを判断することです(ない場合は、文字列の終わりを返します)。しかし、私はそれを行う方法がわかりません。何か案は?ありがとう!

4

3 に答える 3

5

構文が見た目と同じくらい単純な場合は、エスケープされた一重引用符の特殊なケースを作成できます。

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

でそれを使用します

myStringLiteral = lexeme $ do
    char '\''
    str <- many escapeOrStringChar
    char '\'' <?> "end of string"
    return str
于 2012-03-02T16:50:40.510 に答える
0

そのためにstringLiteralを使用できます。

于 2012-11-23T01:51:05.903 に答える
-1

ParsecはLL(1)言語のみを扱います(詳細)。これは、パーサーが一度に1つのシンボルしか検索できないことを意味します。あなたの言語はLL(2)です。言語を解析するための独自のFSMを作成できます。または、解析する前にテキストを変換してLL(1)にすることもできます。

実際、Parsecは、語彙ではなく構文解析用に設計されています。他のツールを使用して字句解析を行い、文字のシーケンスの代わりに語彙素のシーケンスを解析するためにParsecを使用することをお勧めします。

于 2012-03-02T16:50:35.750 に答える