5

次のように、ファイルからの入力データをLogLineデータ型に解析するHaksellParsecParserを作成しようとしています。

--Final parser that holds the indvidual parsers.
final :: Parser [LogLine]
final = do{ logLines <- sepBy1 logLine eol
        ; return logLines
        }


--The logline token declaration
logLine :: Parser LogLine
logLine = do
name <-  plainValue -- parse the name (identifier)
many1 space -- parse and throw away a space
args1 <- bracketedValue -- parse the first arguments
many1 space -- throw away the second sapce
args2 <- bracketedValue -- parse the second list of arguments
many1 space -- 
constant <- plainValue -- parse the constant identifier
space
weighting <- plainValue --parse the weighting double
space
return $ LogLine name args1 args2 constant weighting

すべてが正常に解析されますが、ファイルにコメントを追加する必要があり、パーサーがそれらを無視するように変更する必要があります。「-」で始まり、「\n」で終わる単一行のコメントをサポートする必要があります。コメントトークンを次のように定義しようとしました。

comments :: Parser String
comments = do 
    string "--"
    comment <- (manyTill anyChar newline)
    return ""

そして、次のfinalようにパーサーに接続します。

final :: Parser [LogLine]
final = do 
        optional comments
        logLines <- sepBy1 logLine (comments<|>newline)
        optional comments
        return logLines

正常にコンパイルされますが、解析されません。私はいくつかの小さな変更を試みましたが、最良の結果は最初のコメントまですべてを解析することでした。したがって、これはそれを行う方法ではないと思い始めています。PS:私はこの同様の質問を見ましたが、それは私が達成しようとしているものとは少し異なります。

4

2 に答える 2

4

コメント内のフォーマットの説明を正しく理解している場合、フォーマットの例は次のようになります。

name arg1 arg2 c1 weight
-- comment goes here

オプションで、さらにログ行やコメントが続きます。

次に、問題は、ログ行とコメント行の間に改行があることです。つまりcomments、セパレータパーサーの一部は、入力を消費せずに失敗し、comments最初から開始する必要があるため、試行されて成功します。次に、次の行が始まり、入力を消費せずに失敗し、で終了します。"--"newline"--"plainValuesepBy1

解決策は、セパレーターに最初に改行を使用させ、次に次の数のコメント行を使用させることです。

final = do
    skipMany comments
    sepEndBy1 logLine (newline >> skipMany comments)

sepEndBy1シーケンスを(の代わりに)区切り文字で終了できるようにすることでsepBy1、最後以降のコメント行LogLineは自動的にスキップされます。

于 2012-10-20T19:45:25.580 に答える
0

私があなたの問題を理解する方法では、各行はコメントまたはログラインのいずれかです。もしそうなら、次のようにfinalなります。

final :: Parser [LogLine]
final = do 
        logLines <- sepBy1 (comment<|>logLine) newline
        return logLines
于 2012-10-20T18:31:04.560 に答える